Цель этого задания - написать самую короткую функцию / программу для ввода входного текста, зашифровать его, используя метод, приведенный ниже, и вернуть результат.
В качестве примера я буду использовать строку hello world
.
Сначала получите входной текст.
hello world
Во-вторых , преобразовать строку в тройной (база 3). Используйте этот ключ:
a = 000
b = 001
c = 002
d = 010
e = 011
f = 012
g = 020
...
w = 211
x = 212
y = 220
z = 221
[space] = 222
С этим ключом hello world
становится 021011102102112222211112122102010
, как видно ниже.
h e l l o w o r l d
021 011 102 102 112 222 211 112 122 102 010
В-третьих , переместите первую цифру в конец.
021011102102112222211112122102010
becomes
210111021021122222111121221020100
В-четвертых , преобразовать число обратно в строку, используя тот же ключ.
210 111 021 021 122 222 111 121 221 020 100
v n h h r n q z g j
Наконец , верните зашифрованный текст.
vnhhr nqzgj
Вот пример текста и его вывод:
the turtle ==> dvo fh ego
python ==> uudwqn
code golf ==> hpjoytqgp
Поскольку это кодовый гольф, выигрывает самая короткая запись в байтах . Ошибки допускаются, если некоторые символы не являются строчными буквами или пробелом. Это мой первый вызов, поэтому любые предложения будут более чем полезны.
Удачи!
Leaderboard:
var QUESTION_ID=54643;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),e.has_more?getAnswers():process()}})}function shouldHaveHeading(e){var a=!1,r=e.body_markdown.split("\n");try{a|=/^#/.test(e.body_markdown),a|=["-","="].indexOf(r[1][0])>-1,a&=LANGUAGE_REG.test(e.body_markdown)}catch(n){}return a}function shouldHaveScore(e){var a=!1;try{a|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(r){}return a}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading),answers.sort(function(e,a){var r=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0],n=+(a.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0];return r-n});var e={},a=1,r=null,n=1;answers.forEach(function(s){var t=s.body_markdown.split("\n")[0],o=jQuery("#answer-template").html(),l=(t.match(NUMBER_REG)[0],(t.match(SIZE_REG)||[0])[0]),c=t.match(LANGUAGE_REG)[1],i=getAuthorName(s);l!=r&&(n=a),r=l,++a,o=o.replace("{{PLACE}}",n+".").replace("{{NAME}}",i).replace("{{LANGUAGE}}",c).replace("{{SIZE}}",l).replace("{{LINK}}",s.share_link),o=jQuery(o),jQuery("#answers").append(o),e[c]=e[c]||{lang:c,user:i,size:l,link:s.share_link}});var s=[];for(var t in e)e.hasOwnProperty(t)&&s.push(e[t]);s.sort(function(e,a){return e.lang>a.lang?1:e.lang<a.lang?-1:0});for(var o=0;o<s.length;++o){var l=jQuery("#language-template").html(),t=s[o];l=l.replace("{{LANGUAGE}}",t.lang).replace("{{NAME}}",t.user).replace("{{SIZE}}",t.size).replace("{{LINK}}",t.link),l=jQuery(l),jQuery("#languages").append(l)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/,NUMBER_REG=/\d+/,LANGUAGE_REG=/^#*\s*([^,]+)/;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table></div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table></div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table><table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table>
источник
uint64
), используя увеличивающиеся степени27
. Смещение на одну цифру будет тогда эквивалентно умножению этого большого целого числа на3
, а введение первой цифры на другом конце будет просто дополнением. Но есть сложности, такие как отбрасывание последнего «переноса» (возможно, с помощьюmod
операции), и я не мог заставить его работать с несколькими байтамиОтветы:
Pyth,
2322 байтаПопробуйте онлайн: Regular Input / Test Suite
Спасибо @isaacg за один байт.
Объяснение:
источник
G
вместо использованияN
, например=+Gd
.Pyth, 26 байт
Попробуйте это онлайн в Pyth Compiler / Executor: demo | контрольные примеры
идея
Предположим, что все входные символы уже сопоставлены с целыми числами, указанными в шаге 2.
Для каждого трехзначного трехзначного числа имеем xyz 3 = 9x + 3y + z , поэтому модульное деление на 9 дает частное x и вычет 3y + z .
Если ввод abc 3 def 3 ghi 3 , применение модульного деления к каждому дает a, 3b + c, d, 3e + f, g, 3h + i .
Повернув список сверху на одну единицу влево, мы можем сгруппировать целые числа в пары. Это дает список (3b + c, d), (3e + f, g), (3h + i, a) .
Теперь, если мы преобразуем (3y + z, w) из основания 3 в целое число, мы получим 3 (3y + z) + w = 9y + 3z + w = zyw 3 .
Таким образом, применение базового преобразования к списку пар дает нам BCD 3 EFG 3 ОВЗ 3 , который является именно результатом вращения сцепленный троичной цифры на одну единицу влево.
Все, что осталось сделать, это отобразить получающиеся целые числа обратно в символы.
Код
источник
Python 2, 96
Преобразует символ
c
в значениеx
какx=(ord(c)-97)%91
, при этом модуль по модулю влияет только на пробел, чтобы преобразовать его в 26. Обратное преобразованиеi
вchr((i-26)%91+32)
, при этом модуль влияет толькоi=26
на то, чтобы он стал пробелом.Мы перебираем символы, отмечая текущее значение
x
и предыдущее значениеy
. Мы используем две последние троичные цифрыy
, найденные какy%9
, и первые троичные цифрыx
, найденные какx/9
. Значение конкатенацииy%9*3+x/9
. Вероятно, есть некоторые оптимизации, сочетающие эту арифметику со сдвигом97
и фиксированием пространства.Мы делаем этот цикл, возвращаемся к первому символу строки в конце. Мы также делаем один цикл подготовки для записи в предыдущее значение
y
, подавляя символ для первого цикла, когда онy
еще не был инициализирован.источник
CJam,
3929 байтКрутая вещь в этом - то, что он даже не использует базовое преобразование.
Попробуйте онлайн .
Я только что понял, что у меня точно такая же идея, как и у ответа Якуба на Пиф. Я на самом деле перенес этот код CJam в Pyth, прежде чем увидел его пост, заканчивая 25 байтами. Учитывая, что это был мой первый гольф Pyth, я думаю, это не так уж плохо.
объяснение
источник
CJam,
302927 байтПопробуйте онлайн в интерпретаторе CJam .
Подход такой же, как в моем другом ответе , который является портом этого кода для Pyth.
Как это работает
источник
Pyth,
3029 байтСохранено 1 байт благодаря @Jakube.
Живая демоверсия и тестовые случаи.
источник
Javascript (ES6), 175 байт
Однострочник!
"Чрезмерное использование переменного
v
вознаграждения, кто-нибудь?"обновление: теперь используются только переменные, вызванные
v
, для полной путаницы!Спасибо @vihan за сохранение 6 байтов!
Спасибо @Neil за сохранение 27 байт !!
Определяет анонимную функцию. Чтобы использовать, добавьте
v=
перед кодом, чтобы дать функции имя, и назвать его какalert(v("hello world"))
источник
.slice(-3)
для сохранения 6 байтов, после чего вы можете использовать"00"+v
для сохранения другого байта. (Вы можете объединить с шаблоном, но полученная длина будет той же.).map(v=>(v<"V"?26:v.charCodeAt()-97).toString(3)).map(v=>("000"+v).slice(v.length))
тогда становится.map(v=>(v<"V"?53:v.charCodeAt()-70).toString(3).slice(1))
.Юлия,
149137 байтМой первый гольф!
(частично) негольфированный:
источник
=
вместоin
петель, и вы можете использоватьb[1]
вместоb[1:1]
. Вам также не нужно пробел между закрывающими скобками иfor
.=
, ноb[1]
возвращает символ, который нельзя добавить в строку с помощью*
.for
Фокус в том , изящная. Вы также можете получить его сразу после закрытой цитаты. Я не осознавал, что парсер был таким гибким.end
.Javascript (ES6),
178,172, 170Заменен Math.floor с побитовым или. Создана анонимная функция. Если я правильно понимаю, это должно несколько исправить мою нубишность (спасибо Денису!) И избавить меня еще на 2 байта.
источник
Юлия,
169166 байтUngolfed + объяснение:
источник
Haskell, 160 байт
Тьфу, это кажется слишком длинным, но, по крайней мере, я ... как-то бью Питона. И рубин.
источник
Javascript (ES6),
141124120 байтХочешь верь, хочешь нет.... :-)
Как и в случае с моим другим ответом, это анонимная функция, и ее необходимо присвоить переменной, прежде чем ее можно будет использовать. Попробуйте это здесь:
Показать фрагмент кода
Я подумал, что смогу срезать пару байтов с моего предыдущего ответа, используя другую технику, поэтому я начал с одного, похожего на Tekgno, и отогнал голову оттуда. Я инициализировал некоторые переменные в разделе аргументов функции и снова вставил все в
.map
функцию. Тогда я понял,String.fromCharCode
что будет гораздо более эффективным за пределами.map
. После того, как все было сказано и сделано, я сбрил более3045 байтов!Изменить 1: 17 байтов спасены, избавившись от
.replace
s, используя технику, похожую на решение Python xnor.ОК, может быть, пришло время перейти к другому вызову ....
источник
Python 2,
182180 байтЭто решение не является идеальным, поскольку замена является очень дорогой. Попытка выяснить, как этого избежать.
Ввод похож
"hello world"
.источник
Mathematica, 162 байта
(Re) Использование,
Rule
чтобы преобразовать списки цифр в символы и обратно.источник
Javascript (ES6), 179 байт
Реквизиты для Vihan для
.match
регулярных выражений.источник
Руби, 177
Требуется как минимум Ruby 1.9 для
each_char
методаисточник
Ява,
458449 байтМне было немного грустно определить, что я могу сократить 10 байт, не используя потоки Java 8 и
map()
метод.Вот версия для гольфа:
Вот гораздо менее гольф версия. Он предназначен для чтения, но я не даю никаких гарантий.
Эта программа принимает строку для преобразования в качестве аргумента командной строки. Если вы хотите, чтобы в вашем входе были пробелы, вы должны заключить его в двойные кавычки.
Я хотел привести пример использования этого из командной строки, но мне не удалось заставить этот код работать за пределами Eclipse. Я никогда не учился использовать Java из командной строки ^ _ ^; Вы можете, вероятно, запустить это в выбранной вами IDE без особых проблем.
источник
Javascript (ES6),
181180 байтЭто анонимная функция, поэтому ей нужно дать имя, прежде чем ее можно будет использовать. (Например,
encrypt=t=>...
попробуйте это здесь:Показать фрагмент кода
Я начал с использованием нескольких переменных и
for
циклов вместо.map
. Затем я играл в нее всеми возможными способами, не меняя алгоритм, что позволило мне получить около 217 байтов. Посмотрев на ответ UndefinedFunction, мне удалось снизить его до 195, и в результате некоторой проверки ответа Дендробиума я получил еще 14 очков.Насколько я знаю, я не могу идти дальше, или мой результат будет практически идентичен результату Дендробиума (за исключением того, что он будет на один персонаж короче!). Кто-нибудь может найти место, где я сохранил один символ? :-)
Как обычно, предложения с радостью приветствуются!
источник
Matlab, 113 байт
Вход через стандартный ввод.
Пример:
источник
Юлия -
92876154 байтаUngolfed:
Трюк может сбить вас с толку. Вычитание 6 перемещает «а» вниз до нуля после мода. Добавление 9 * 65 эквивалентно добавлению 65 к v1 + v2, что является частью процесса восстановления значений в их значениях ascii. Вы можете заменить
i=t%91+579
наi=t%91-6
, а затем заменитьN=(v1+v2)%91+32
на,N=(v1+v2+65)%91+32
чтобы получить тот же результат, но для этого требуется один дополнительный символ.источник