Кодовый Скремблер Гольф - слов
-
07-07-2019 - |
Вопрос
Пожалуйста, ответьте с максимально коротким исходным кодом для программы, которая преобразует произвольный открытый текст в соответствующий ему зашифрованный текст, следуя примерам ввода и вывода, которые я привел ниже.Бонусные баллы * за наименьшее время работы процессора или наименьший объем используемой памяти.
Пример 1:
Открытый текст: Быстрая бурая лисица перепрыгивает через ленивую собаку.Сверхкалифрагилистический, Замечательный!
Зашифрованный текст: eTh kiquc nobrw xfo принимает rvoe eth yalz .odg !uioiapeislgriarpSueclfaiitcxildcos
Пример 2:
Открытый текст: 123 1234 12345 123456 1234567 12345678 123456789
Зашифрованный текст: 312 4213 53124 642135 7531246 86421357 975312468
Правила:
- Пунктуация определяется как включаемая в слово, к которому она ближе всего.
- Центр слова определяется как потолок((strlen(word)+1)/2).
- Пробелы игнорируются (или сворачиваются).
- Нечетные слова сначала перемещаются вправо.Даже слова сначала перемещаются влево.
Вы можете думать об этом как о чтении каждого второго символа задом наперед (начиная с конца слова), за которым следуют остальные символы вперед.Корпорация => XoXpXrXtXoX => niaorCoprto.
Спасибо тем, кто указал на несоответствие в моем описании.Это привело многих из вас по ложному пути, за что я приношу извинения.Правило № 4 должно прояснить ситуацию.
* Бонусные баллы будут начислены только в том случае, если Джефф Этвуд решит это сделать.Поскольку я не связывался с ним, шансы невелики.Извините.
Решение
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 символов.
Исходная версия (сначала идут четные и нечетные) для ввода в <=>:
' '.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 символа)
Другие советы
J , 58 символов
>,&.>/({~(,~(>:@+:@i.@-@<.,+:@i.@>.)@-:)@<:@#)&.><;.2,&' '
Haskell , 64 символа
unwords.map(map snd.sort.zip(zipWith(*)[0..]$cycle[-1,1])).words
Ну, ладно, 76, если вы добавите в реквизит " import List
".
Python - 69 символов
(включая пробелы и переносы строк)
Это обрабатывает все операции ввода / вывода.
for w in raw_input().split():
o=""
for c in w:o=c+o[::-1]
print o,
Perl, 78 символов
Для ввода в $_
. Если это неприемлемо, добавьте шесть символов для $_=<>;
или $_=$s;
в начале. Новая строка предназначена только для чтения.
for(split){$i=length;print substr$_,$i--,1,''while$i-->0;
print"$_ ";}print $/
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);}}
Lua
130 функция символов, 147 программа функционирования символов
Lua не пользуется достаточной любовью в code golf - возможно, потому, что трудно написать короткую программу, когда у вас есть длинные ключевые слова, такие как function
/end
, if
/then
/end
, и т.д.
Сначала я пишу функцию в подробном виде с пояснениями, затем я переписываю ее как сжатую автономную функцию, затем я вызываю эту функцию на одинокий аргумент, указанный в командной строке.
Мне пришлось отформатировать код с помощью <pre></pre>
теги, потому что 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
Но этот подход выводит конечный пробел, как и некоторые другие решения.
Для ввода в 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 символов, включая пробелы.
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
Удар - 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
Хорошо, итак, он выводит конечный пробел.