Код Гольф - Word Scrambler - PullRequest
       14

Код Гольф - Word Scrambler

4 голосов
/ 16 сентября 2009

Пожалуйста, ответьте с кратчайшим возможным исходным кодом для программы, которая преобразует произвольный открытый текст в соответствующий зашифрованный текст, следуя примеру ввода и вывода, который я дал ниже. Бонусные баллы * за наименьшее время процессора или наименьший объем используемой памяти.

Пример 1:

Открытый текст: Быстрая коричневая лиса перепрыгивает через ленивую собаку. Supercalifragilisticexpialidocious!

Зашифрованный текст: eTh kiquc nobrw xfo smjup rvoe eth yalz .odg! UioiapeislgriarpSueclfaiitcxildcos

Пример 2:

Открытый текст: 123 1234 12345 123456 1234567 12345678 123456789

Зашифрованный текст: 312 4213 53124 642135 7531246 86421357 975312468

Правила:

  1. Пунктуация определена для включения в слово, к которому она ближе всего.
  2. Центр слова определяется как потолок ((strlen (word) +1) / 2).
  3. Пробелы игнорируются (или свернуты).
  4. Странные слова перемещаются вправо первыми. Четные слова сначала сдвигаются влево.

Вы можете думать об этом, как о прочтении каждого другого символа в обратном направлении (начиная с конца слова), за которым следуют оставшиеся символы вперед. Корпорация => XoXpXrXtXoX => niaorCoprto.

Спасибо тем, кто указал на несоответствие в моем описании. Это привело многих из вас на неверный путь, за который я прошу прощения. Правило № 4 должно прояснить ситуацию.

* Бонусные баллы будут начисляться, только если Джефф Этвуд решит это сделать. Так как я не проверил его, шансы невелики. К сожалению.

Ответы [ 10 ]

7 голосов
/ 16 сентября 2009

Python, 50 символов

Для ввода в i:

' '.join(x[::-2]+x[len(x)%2::2]for x in i.split())

Альтернативная версия, которая обрабатывает свой собственный IO:

print ' '.join(x[::-2]+x[len(x)%2::2]for x in raw_input().split())

Всего 66 символов, включая пробелы. (Технически, print может быть опущено при запуске из командной строки, поскольку оцененное значение кода отображается как вывод по умолчанию.)


Альтернативная версия с использованием reduce:

' '.join(reduce(lambda x,y:y+x[::-1],x) for x in i.split())

59 символов.

Исходная версия (сначала чётные и нечетные идут справа) для входа в i:

' '.join(x[::2][::-1]+x[1::2]for x in i.split())

48 символов, включая пробелы.

Другая альтернативная версия, которая (хотя и немного длиннее) немного более эффективна:

' '.join(x[len(x)%2-2::-2]+x[1::2]for x in i.split())

(53 символа)

4 голосов
/ 16 сентября 2009

Haskell , 64 символа

unwords.map(map snd.sort.zip(zipWith(*)[0..]$cycle[-1,1])).words

Ну, ладно, 76, если добавить в реквизит "import List".

4 голосов
/ 16 сентября 2009

J , 58 символов

>,&.>/({~(,~(>:@+:@i.@-@<.,+:@i.@>.)@-:)@<:@#)&.><;.2,&' '
3 голосов
/ 16 сентября 2009

Python - 69 символов

(включая пробелы и переносы строк)

Это обрабатывает все операции ввода / вывода.

for w in raw_input().split():
 o=""
 for c in w:o=c+o[::-1]
 print o,
1 голос
/ 16 сентября 2009

C, 140 символов

Красиво отформатировано:

main(c, v)
  char **v;
{
  for( ; *++v; )
  {
    char *e = *v + strlen(*v), *x;
    for(x = e-1; x >= *v; x -= 2)
      putchar(*x);
    for(x = *v + (x < *v-1); x < e; x += 2)
      putchar(*x);
    putchar(' ');
  }
}

Сжатый:

main(c,v)char**v;{for(;*++v;){char*e=*v+strlen(*v),*x;for(x=e-1;x>=*v;x-=2)putchar(*x);for(x=*v+(x<*v-1);x<e;x+=2)putchar(*x);putchar(32);}}
1 голос
/ 16 сентября 2009

Lua

130 символьная функция, 147 символьная программа функционирования

Луа не хватает любви в код-гольфе - возможно, из-за того, что сложно написать короткую программу, когда у вас длинные ключевые слова, такие как function / end, if / then / end и т.д.

Сначала я подробно пишу функцию с объяснениями, затем переписываю ее как сжатую, автономную функцию, затем вызываю эту функцию для аргумента single , указанного в командной строке.

Мне пришлось форматировать код с помощью тегов , потому что Markdown выполняет ужасную работу по форматированию Lua.

Технически, вы можете получить меньшую работающую программу, вставив функцию, но это более модульно:)

t = "The quick brown fox jumps over the lazy dog. Supercalifragilisticexpialidocious!"
T = t:gsub("%S+", -- for each word in t...
                  function(w) -- argument: current word in t
                    W = "" -- initialize new Word
                    for i = 1,#w do -- iterate over each character in word
                        c = w:sub(i,i) -- extract current character
                        -- determine whether letter goes on right or left end
                        W = (#w % 2 ~= i % 2) and W .. c or c .. W
                    end
                    return W -- swap word in t with inverted Word
                  end)


-- code-golf unit test
assert(T == "eTh kiquc nobrw xfo smjup rvoe eth yalz .odg !uioiapeislgriarpSueclfaiitcxildcos")

-- need to assign to a variable and return it,
-- because gsub returns a pair and we only want the first element
f=function(s)c=s:gsub("%S+",function(w)W=""for i=1,#w do c=w:sub(i,i)W=(#w%2~=i%2)and W ..c or c ..W end return W end)return c end
--       1         2         3         4         5         6         7         8         9        10        11        12        13
--34567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
-- 130 chars, compressed and written as a proper function

print(f(arg[1]))
--34567890123456
-- 16 (+1 whitespace needed) chars to make it a functioning Lua program, 
-- operating on command line argument

Выход:

$ lua insideout.lua 'The quick brown fox jumps over the lazy dog. Supercalifragilisticexpialidocious!'
eTh kiquc nobrw xfo smjup rvoe eth yalz .odg !uioiapeislgriarpSueclfaiitcxildcos

Я все еще довольно новичок в Lua, поэтому я хотел бы увидеть более короткое решение, если оно есть.


Для минимального шифрования всех аргументов в stdin мы можем сделать 111 символов:
for _,w in ipairs(arg)do W=""for i=1,#w do c=w:sub(i,i)W=(#w%2~=i%2)and W ..c or c ..W end io.write(W ..' ')end

Но этот подход выводит завершающий пробел, как некоторые другие решения.

1 голос
/ 16 сентября 2009

Perl, 78 символов

Для ввода в $_. Если это неприемлемо, добавьте шесть символов для $_=<>; или $_=$s; в начале. Новая строка предназначена только для чтения.

for(split){$i=length;print substr$_,$i--,1,''while$i-->0;
print"$_ ";}print $/
0 голосов
/ 16 сентября 2009

TCL

125 символов

set s set f foreach l {}
$f w [gets stdin] {$s r {}
$f c [split $w {}] {$s r $c[string reverse $r]}
$s l "$l $r"}
puts $l
0 голосов
/ 16 сентября 2009

Bash - 133, при условии, что входные данные находятся в переменной $ w

Довольно

for x in $w; do 
    z="";
    for l in `echo $x|sed 's/\(.\)/ \1/g'`; do
        if ((${#z}%2)); then
            z=$z$l;
        else
            z=$l$z;
        fi;
    done;
    echo -n "$z ";
done;
echo

Сжатый

for x in $w;do z="";for l in `echo $x|sed 's/\(.\)/ \1/g'`;do if ((${#z}%2));then z=$z$l;else z=$l$z;fi;done;echo -n "$z ";done;echo

Хорошо, значит, он выводит завершающий пробел.

0 голосов
/ 16 сентября 2009

Для входа в s:

f=lambda t,r="":t and f(t[1:],len(t)&1and t[0]+r or r+t[0])or r
" ".join(map(f,s.split()))

Python, 90 символов, включая пробелы.

...