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
Но этот подход выводит завершающий пробел, как некоторые другие решения.