Вот сравнительно простой вызов для вас.
Если задана строка длины N , выведите строку вперед, затем назад, затем вперед, затем назад ... и т. Д. N раз. Например, если ваш вклад был
Hello!
Вы должны вывести:
Hello!!olleHHello!!olleHHello!!olleH
Вы также можете при желании вывести один завершающий символ новой строки.
Ваша заявка может быть либо полной программой, либо функцией, и вы можете принимать и выводить данные в любом разумном формате . Например, вы можете взять IO из STDIN / STDOUT, аргументы функции и возвращаемое значение, из файла и т. Д. Можно смело предположить, что входная строка не будет пустой и будет содержать только печатный ASCII. Вы должны вывести новую строку в одну строку. Так, например, если вывод в последний пример был
Hello!
!olleH
Hello!
!olleH
Hello!
!olleH
Это не будет правильным решением!
Вот еще несколько тестов:
Input:
a
Output:
a
Input:
abcd
Output:
abcddcbaabcddcba
Input:
OK!
Output:
OK!!KOOK!
Input:
4815162342
Output:
4815162342243261518448151623422432615184481516234224326151844815162342243261518448151623422432615184
Input:
PPCG
Output:
PPCGGCPPPPCGGCPP
Input:
42
Output:
4224
Leaderboards
Так как это вызов кода для гольфа , стандартные лазейки запрещены, и выигрывает самый короткий ответ в байтах! Тем не менее , это также соревнование, чтобы иметь самый короткий ответ в любом конкретном языке. Хотя маловероятно, что ответ на Java превзойдет ответ на Perl или на некотором языке игры в гольф, все равно очень впечатляет кратчайший ответ на Java. Таким образом, вы можете использовать этот список лидеров, чтобы увидеть оба
Самый короткий ответ из всех языков и
Самый короткий ответ на каждом отдельном языке.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:
# Perl, 43 + 2 (-p flag) = 45 bytes
Вы также можете сделать название языка ссылкой, которая затем будет отображаться во фрагменте списка лидеров:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=93261,OVERRIDE_USER=31716;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
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>
olleH
, неelloH
?Ответы:
Vim,
39, 34 нажатия клавиш5 байтов сохранено благодаря @Lynn!
Вот изображение того, что происходит вживую: (Обратите внимание, что это изображение предыдущей версии, так как у меня еще не было времени перезаписать его).
И вот объяснение того, как это работает:
На примечании стороны,
Y
берет дополнительную новую строку, которая является обычно неприятной особенностью. Это, вероятно, первый раз, когда он действительно сохранил несколько байтов!источник
:%s/\n<cr>
вы можетеv{gJ
сохранить три байта.@q
пусто в начале, верно? или,@q
прежде чем остановить запись будет делать что-то произвольное. (Это приводит меня к моему любимому тривиуму vim, который я придумал: все знают, что выйти из vim так же легко, как:q<CR>
, как закрыть и сохранить все свои файлы? Легко: простоqqqqqZZ@qq@q
!)@q
должно быть пустым. Почему бы просто не сделать:wqa
вместо этого? Также хочешь знать, как создать фрактал в vim?qqqqq<C-w>v<C-w>n@qq@q
: DPython, 40 байт
Рекурсивная функция. Добавляет входную строку
s
к функции реверса, пока счетчик неi
превысит длинуs
.источник
lambda s:(len(s)*(s+s[::-1]))[:len(s)**2]
один байт.f = lambda s : ''.join([s[((-1)**(i//len(s)) <= 0)*(len(s)-1)+(-1)**(i//len(s))*(i%len(s))] for i in range(len(s)*len(s))])
но это 136 байтов в соответствии сsys.sizeof
, интересно, что это тот же размер, что иf = lambda s : ''.join([s[::1] if i%2 else s for i in range(len(s))])
Brain-Flak ,
418378228 байтЭто мой шедевр Brain-Flak. Возможно, он не очень удачный, но это самая сложная задача, с которой я когда-либо сталкивался.
Попробуйте онлайн!
объяснение
Это объяснение в настоящее время немного устарело, но оно все еще довольно хорошо объясняет программу.
Это объяснение будет немного отличаться от моего обычного процесса объяснения. Я собираюсь объяснить, как я пришел к этому результату, а не объяснять результат по порядку. Здесь это идет:
роликовый
Поработав над проблемой, я немного придумал этот код:
Этот код (где n является литералом для некоторого числа, например
()()
) возьмет элемент на вершину стека и переместит его вниз на n шагов. При n в качестве высоты стека это будет выполнять "крен" стека. т.е. переместить верхний элемент в нижнюю часть стопки. Вот как это работает:Мы помещаем место, куда хотим переместить элемент, в минус один в стеке. Почему минус один? Я не знаю, это просто так работает.
Затем мы выполняем цикл, пока это число не достигнет нуля, отслеживая цикл с помощью
()
.Каждый раз, когда мы выполняем цикл, мы выбираем верхний элемент и перемещаем элемент под ним в другой стек. Это ставит номер сверху на свое место.
Все, что нам нужно сделать сейчас, это положить числа, которые мы переместили назад. Мы переключаемся на выключенный стек и увеличиваем количество выполненных циклов.
Мы циклически уменьшаем число только что отправленного, пока оно не достигнет нуля. Каждый раз мы перемещаем один номер назад.
Обратный
Затем я изменил бросок, чтобы сделать обратный полный стек:
Еще раз n представляет глубину обратного. То есть верхние n элементов в стеке будут перевернуты. Как это работает:
Реверс - это просто красиво завернутый ролик. Мы просто катим вершину стека n раз, уменьшая глубину рулона на единицу каждый раз.
Дублированный
На месте дублирование сложно. Очень трудно. После того, как я понял, как перевернуть стек, все еще потребовалось немало усилий, чтобы придумать алгоритм дублирования.
Вот:
Это немного большой, но вот как это работает:
Начните с нажатия n. n - глубина дубликата. Мы также открываем две скобки. Это позволяет нам хранить значение n в области видимости, пока оно не понадобится снова.
Затем мы зацикливаемся n раз каждый раз, дважды передавая верхнее значение стека в выключенный стек. Это делает начальные дубликаты для каждого числа в стеке.
Теперь у нас есть две копии каждого номера в оффшеке. Нам нужно разделить их на две группы.
Таким образом, мы переключаемся на offstack и вспоминаем одно из ns, которое мы сохранили в начале.
Мы зациклились n раз.
Каждый раз мы перемещаем одну копию в главный пакет.
И бросьте одну копию на дно стека. (Предполагается, что смещение было пустым, чтобы сделать этот дубликат не чистым)
Как только это будет сделано, мы разделили оригинал на две группы: «оригинал» и копия на стековом хранилище (копия фактически обратная). Поэтому мы просто перемещаем копию в основной стек и с этим можно покончить.
Скелетная программа
Теперь, когда я сделал все части программы, мне просто нужно вставить их в рамку.
Рамка удваивает текст на единицу меньше высоты стека, используя дубликат.
И затем инвертирует стек с уменьшением приращения начальной высоты стека с n ^ 2-n до 0.
источник
Желе ,
43 байтаПопробуйте онлайн! или Проверьте все контрольные примеры.
Сохраненный байт благодаря @ Maltysen .
объяснение
источник
L
PHP,
5452 байта(49 байтов, но не работают, если строка содержит '0')
(52 байта)
(54 байта)
источник
str_pad
. хороший!2sable , 3 байта
Код:
Объяснение:
Использует кодировку CP-1252 . Попробуйте онлайн!
источник
Рубин, 39 байт
Я сосу на Руби. Помощь в гольф приветствуется.
Ruby действительно хороший язык для этого из-за
.reverse!
объяснение
Я надеялся, что это будет просто так:
но из-за ограничения шаблона / вызова это дольше.
Что
s.reverse!
очень полезно.s.reverse!
в основномs = s.reverse!
это означает, что он также мутируетs
.То, что делает каждый раздел программы, описано ниже:
Замечательно
s.reverse!
то, что при каждой оценке строка get переворачивается. Так как он заменяет строку.s
модифицировано!источник
-p
флагом вы можете сохранить 4 байта:$_.reverse!;gsub(/./){$_.reverse!}
.chomp
хоть на$_
? кажется, что в этот моментruby -pe '$_.reverse!;gsub(/./){$_.reverse!}' < file.txt
гдеfile.txt
есть строка без символа новой строки: V В любом случае, если вы решили не делать этого, вам не нужны на скобки лямбды так->s
работаетs.gsub(/./){s.reverse!.reverse}
Perl, 24 байта
Включает +2 для
-lp
Внесите свой вклад в STDIN:
rev.pl
:Удивительно, но это не использует встроенный
reverse
оператор. Это имя просто оооочень длинное, все решения, о которых я мог подумать,reverse
имеют длину как минимум на 1 байт.источник
J,
138 байтСохранено 5 байт благодаря милям!
Это 5 поезд со следующими глаголами:
Внутренняя вилка состоит из
]
(идентичность),;
(ссылка) и|.
(обратный). Заметим:Два внешних глагола составляют остальную часть поезда.
#
в данном случае это размер аргумента, то есть длина. Глагол, связывающий это;@$
, илиravel
оконченreshape
. Заметим:Старое решение.
Достаточно просто.
|.
является обратным, и^:
является степенным соединением, которое повторяет его левый глагол (правая рука) # раз. Когда правильным аргументом является глагол, этот глагол вызывается в аргументе. Правый глагол в этом случае находится в диапазоне от нуля (i.
) до длины (#
). При поднятии в массив промежуточные результаты сохраняются. Все, что нужно сделать, это сгладить массив,
.Промежуточные результаты
источник
<@#
#;@$];|.
том, чтобы упаковать начальные и обратные значения, перестроить строки в штучной упаковке и объединить ихJavaScript (ES 6),
5950 байт9 байт благодаря Хеди и Хантро.
рекурсивная функция.
Обращение строки занимает почти половину размера (
2522 байта!) ...Почему для этого нет родного пути?
источник
s[n]?...
intead ofn<s.length?...
[...s]
вместоs.split``
f=(s,n=1)=>n==1?s:s+s.reverse(),n-1)
f=(s,n=1)=>Array.from({length:n},(_,i)=>i%2?s.reverse():s).join``)
что бы тоже лучше с некоторой лучшей функцией для диапазонаSyntaxError: Unexpected token )
JS нет собственного возврата строки.SyntaxError: Invalid or unexpected token
для вашего второго предложения. В каком браузере это работает?Минколанг , 17 байт:
Попробуй это здесь!
объяснение
источник
8088 Assembly, IBM PC DOS,
2928 байтСобран,
xxd
свалка:Несобранный список:
Автономная исполняемая программа для ПК с DOS. Ввод строки через командную строку, вывод на консоль.
источник
Пип ,
1110 байтПопробуйте онлайн!
Объяснение:
источник
Haskell,
403632 байтаПример:
Еще короче (кредит Дэмиену):
s >> [s, reverse s] циклы ["abc", "cba", ...], которые заархивированы до правильного размера и concatMap'ped с помощью fst
источник
q s=zip(s>>[s,reverse s])s>>=fst
(>>=fst).(iterate reverse>>=zip)
Perl 6 ,
3130 байтСохраните один байт путем неправильного использования
.ords
, который возвращает список порядковых чисел, а затем неявно превратите его в число, чтобы создать диапазон с.Объяснение:
Использование:
источник
Vim + coreutils, 32 нажатия клавиш
Вы никогда не можете иметь слишком много ответов Vim.
объяснение
источник
MATL,
13128 байтТолкает все элементы, объединяет в конце.
Попробуйте онлайн!
Старые версии:
Совершенно другой подход, основанный на
fprintf
:Версия, основанная на обращении строки шаблона
источник
td
!tnq:"
Сначала у меня было очевидное , ноtn:"
это немного странный запах (см. Этот совет по игре в гольф от Matlab), поэтому я подумал, что онtnq:
может быть и более компактным.Scala,
737271 байтЭто моя первая попытка игры в код, поэтому я уверен, что есть множество улучшений.
Обновить:
Отбросил 1 байт, сняв скобки.
Спасибо Разрушаемому Арбузу за предложение, побритый байт.
источник
i%2==1
наi%2>0
?Cubix , 52 байта
На кубе:
Это было весело; есть еще байты для игры в гольф, но это определенно сработает.
Попробуйте онлайн!
объяснение:
Ввод
ABC
/A
: идите на север и читайте все входные данные как символы;-1
будет внизуp\;.
: удалить-1
из стекаu#
: выдвинуть длину строки (количество элементов в стеке)\:\:qq
: удвоить длину строки дважды, поместить две копии в конец стекацикл:
soq(?/<u
: поменять вершину стека, вывести вершину стека как ASCII, переместить вершину (букву) в низ, уменьшить вершину стека, повернуть направо, если не выполнено, затем переместить IP в нужное место.C B A 3 3 0
;u
: поп вершина стекаC B A 3 3
B
: обратный стек3 3 A B C
p(
: двигаться снизу вверх и уменьшать3 A B C 2
?
если вершина равна нулю, идите прямо@
и закончитеpsq:uq
: переместиться снизу вверх, поменять местами сверху и снизу вверх и переместить сверху вниз3 2 A B C 3
$u
: пропускатьu
<
возвращает нас в петлю.переводчик
источник
C (gcc) ,
888785836866838278 байт-1 благодаря потолку
Старая версия
Попробуйте онлайн!
Укороченная версия (слегка сломанная)
Riffing на 76-байтовом подходе ASCII-только в комментариях и -1 байт от его настройки моей настройки.
Редактировать: эта версия немного ломаная, так как предполагает, что каждой строке предшествует байт NULL, что не всегда верно. (См. Последний тестовый пример в ссылке). Вернемся к 83-байтовой версии.
Попробуйте онлайн!
источник
Java,
12711188 байтТестовая программа Ungolfed
источник
(s,r)->{for(int i=0;i++<s.length();)r+=i%2<1?s:new StringBuffer(s).reverse();return r;};
( 88 байт ). Кроме того, я хотел бы указать, что это Java 8.R, 53 байта
Предполагается, что ввод для каждого символа разделен пробелом или символом новой строки.
Некоторые тестовые случаи:
источник
PowerShell v2 +, 57 байт
Нет реального чистого способа получить длину строки или поменять их, так что это довольно долго.
Принимает ввод
$a
, возвращается из цикла1
в$a.length
(сохраняется в памяти$x
для последующего использования). На каждой итерации мы используем псевдотернарный для индексации в массив либо$a
или$a[$x..0]
(то есть, обратный), в зависимости от того, является ли наш входной номер нечетным / четным[$_%2]
. Все они заключены в парены и-join
объединены в одну строку. Это остается на конвейере, и вывод неявный.источник
Java, 151 байт
}
Ungolfed:
источник
public static
перед вашим методом. Вы можете удалить пробелы междуt=new StringBuffer
. Вы можете удалить ненужные скобки и скобки. И вы можете поменять модуль проверки с==1
на<1
(что эквивалентно==0
для неотрицательных чисел). Кроме того, вы можете перейтиi++
к последнему использованию внутри цикла for.void r(String s){for(int i=0;i<s.length();)System.out.print(i++%2<1?s:new StringBuffer(s).reverse()+"");}
( 105 байт )C #, 94 байта
76 байтов для метода + 18 байтов для импорта LINQ.
Как это работает:
источник
CJam , 10 байтов
Попробуйте онлайн!
объяснение
источник
Октава,
3935 байтОбъяснение:
Сохранено 4 байта благодаря Луису.
~x
вместо того, чтобы0*x
сохранить один байт (работает, потому что все элементы x отличны от нуля.flip
вместо того, чтобыflipud
сохранить еще два байта (я не знал, чтоflip
существует).источник
bash + util-linux,
685853 байтаобъяснение
Две вещи с
for
циклом:for
циклов, в котором ключевые словаdo
и заменяютсяdone
фигурными скобками{
и}
. Пространство после первого кронштейна необходимо, и точка с запятой в конце концов , это также необходимо.for
циклах "C-style" вы можете просто инициализировать с помощьюi;
вместо использованияi=0;
.${#1}
Часть условияi < ${#1}
относится к длине нашего входа (первый параметр$1
). В общем, вы можете использовать,${#foo}
чтобы получить размер строки$foo
.Дополнительно:
rev
это инструмент в util-linux, который переворачивает строку-n
флаг, чтобыecho
избавиться от новых строк.rev<<<$y
называется здесь-строкой (см. Соответствующую страницу tldp.org ), которое передает переменную$y
в стандартный вводrev
.источник
do
иdone
ключевые слова вfor
цикле, вы на самом деле действительно нужно это пространство!y=$1;for((;i<${#1};i++)){ printf $y;y=`rev<<<$y`;}
... сэкономил пару байтовJapt , 11 байт
Попробуйте онлайн!
источник
î
опять забываешь?05AB1E , 7 байтов
Попробуйте онлайн!
Будем продолжать работать над этим. Мне не очень нравится эта часть "v}", возможно, я могу сохранить там байт.
объяснение
источник
vÂ}\J
5 байт - это то же самое, что и ваш код, но с теми встроенными функциями, которые вы искали. :)Â
это Bifurcate (сокращение от Duplicate & Reverse, это именно то, что вы делаете).\
удаляет верхний элемент в стеке