Требования:
- Возьмите ввод в stdin, включая новые строки / возврат каретки неограниченной длины (ограничен только системной памятью; т. Е. В программе нет внутреннего ограничения).
- Вывести обратный ввод на стандартный вывод.
Пример:
Входные данные:
Quick brown fox
He jumped over the lazy dog
Выход:
god yzal eht revo depmuj eH
xof nworb kciuQ
Кратчайшие победы.
Leaderboard:
var QUESTION_ID=242,OVERRIDE_USER=61563;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>
strrev
ƃop ʎzɐʃ ǝɥʇ ɹǝʌo pǝdɯnɾ ǝH
xoɟ uʍoɹq ʞɔınΌ
сторона вашего ввода будет: ;-PОтветы:
Golfscript - 3 символа
запутанная версия также 3 символа
вот объяснение того, как работает %
источник
Баш - 7
tac
меняет порядок строк, в то время какrev
меняет порядок символов.источник
alias z='tac|rev'
rev|tac
такая же оценка - просто добавив примечание, чтобы сказать, что это работает для любой оболочки POSIX, а не только для Bash.BrainFuck, 10 персонажей
Бьет большое количество ответов для такого простого языка.
источник
C 37 байт
источник
Хаскелл - 21
источник
Стек блин ,
342316 байтПредполагается, что ввод завершается нулевым символом (
^@
в командной строке). Пример выполнения с использованием интерпретатора :источник
Python,
4140 байт41 -> 40 - удалена точка с запятой в конце программы.
Вероятно, может быть оптимизировано!
источник
print raw_input()[::~0]]
? Это все еще Python 2 из-заprint
# Language Name, Character/Byte Count
APL, 2
Или CircleBar QuoteQuad, если символы не вводятся, просто означая: обратный ввод с клавиатуры.
источник
⍞
.⌽
полная анонимная функция , которая может быть назначена и используется:f←⌽
f 'The quick brown fox'
.Perl - 23
источник
print"".reverse<>
это всего 17 символов. А с Perl 5.10+ вы можете сохранить еще два символа, используяsay
вместоprint
.print~~reverse<>
для 16 символовsay~~reverse<>
будет работать? 14 символовРубин - 19 символов
источник
C - 47 символов
Обратите внимание, что для этого используется пространство стека O (n). Попробуйте онлайн!
источник
main(c){(c=getchar())>0&&main(),putchar(c);}
c>=0
может стать~c
Windows PowerShell, 53
542011-01-30 (54) - Первая попытка
2011-01-30 (53) - Встроенные разрывы строк - это весело.
2011-01-3- (52) - Встроенные присваивания переменных тоже.
источник
-join($a="$args")[$a.Length..0]
сам по себе, кажется, работает для предоставленного примера, у меня нет проблем сcrlf
разрывами строк, работающими с windows - не уверен насчет psv2 или чего-то еще, что вы использовали, когда это было написано.$input
это перечислитель, дающий строки, так что вы не можете его так структурировать.Perl 5.1, 14
источник
Befunge-93 - 11x2 (22 символа)
Протестировано с использованием этого интерпретатора .
источник
Двоичное лямбда-исчисление - 9 байт
Источник: http://ioccc.org/2012/tromp/hint.html
источник
Деление ,
161412 байтобъяснение
Поток управления начинается
D
с нисходящего(1,0)
атома.?
Читает из STDIN, одного символа в то время, устанавливая массу на считанный код символа и энергию0
. Как только мы нажмем EOF,?
вместо этого установим энергию в1
.[
Перенаправляет атом наZ
коммутатор. Пока мы читаем символы, энергия будет0
, поэтому атом отклоняется вверхZ
. Мы клонируем атом, зацикливая одну копию обратно,?
чтобы продолжить чтение ввода. Мы увеличиваем энергию другой копии, чтобы1
с$
и вставьте его в стекK
. Итак, входной цикл такой:Когда энергия происходит
1
из-за EOF,Z
вместо этого воля пропускает атом сквозь него и0
снова уменьшает энергию .~
уменьшает энергию дальше-1
. Атомы с отрицательной энергией выбрасываются из стека, поэтому мы можем получить символы в обратном порядке и напечатать их!
. Теперь обратите внимание, что сетка является тороидальной, поэтому атом появляется на левом краю того же ряда. Помните, что мы увеличивали энергию выталкиваемых атомов ранее$
, поэтому атомы теперь имеют энергию,1
аналогичную последнему выводу,?
и снова будут проходить прямо черезZ
. Поэтому путь после EOFЭтот цикл в нижней строке продолжается до тех пор, пока стек не станет пустым. Когда это происходит, атом отражается от
K
и его энергия становится положительной (+1
). Это~
уменьшает его еще раз (двигаясь влево), так что теперь мы попадаемZ
с неположительной энергией. Это отклоняет атом вниз, так что он попадает в клин того места,Y
где он хранится, и поскольку больше нет движущихся атомов, программа завершается.источник
> <>,
1614 байт-2 байта @JoKing
два года спустя (!) удаляет лишние -1 из чтения ввода, переключаясь вокруг логики остановки.
Попробуйте онлайн!
Как и в случае с другим ответом> <>, здесь не нужно переворачивать стек из-за способа чтения ввода в первой строке. Я на самом деле не слишком уверен, должно ли это быть предложением для другого ответа> <>, так как оно совершенно другое по внешнему виду, но схожее по концепции.
Основное отличие состоит в том, что мой ответ сравнивает вход с 0, и если он меньше (т.е. нет ввода -
i
возвращает -1, если нет ввода), он переходит к (1,7), если нет, (0, 7). Если он переходит к первому, он высвечивает верхнее значение (-1) и запускает цикл печати. Если он переходит к последнему, он продолжает цикл ввода.11 байт, выходит с ошибкой
Предоставлено @JoKing
Попробуйте онлайн!
Я полагаю, что это действительно сейчас через мета-консенсус.
Предыдущий ответ (14 байт)
источник
o
после;
o
стороны; не заметил этого в то время. И спасибо за спасение. Умное использование сравнения до нуля, чтобы избавиться от последнего -1.0=?
к?!
)PHP -
3817 символовисточник
cat
??stdin
Стека кошек , 7 байт
Попробуйте онлайн!
Существует несколько альтернатив для одного и того же числа байтов, большинство из которых по сути эквивалентны в своей работе:
объяснение
Краткий учебник по Stack Cats:
-1
сверху этих нулей, а затем входные байты поверх него (с первым байтом в самом верху и последним байтом над-1
).-1
внизу, если он есть, и затем печатаем все значения в байтах в STDOUT.Теперь для актуальной программы:
Sp3000 настроил свой поиск методом грубой силы, чтобы найти все остальные 7-байтовые решения, поэтому вот несколько альтернатив:
Эти три варианта по сути одинаковы, за исключением того, что они отличаются тем, когда вычисляется побитовое НЕ, и используем ли мы пустой стек слева или справа.
Как я сказал в объяснении выше,
T
ничего не делает, когда вершина стека равна нулю. Это означает, что мы можем!
вместо этого поставить посередине. Это означает , что первыйT
является не-оп, то мы переходим к нулю на вершине в-1
и затем затем второйT
выполняют разворот. Конечно, это означает, что конечное состояние памяти находится-1
в стеке рядом с исходным, но это не имеет значения, поскольку только стек в текущей позиции головки ленты влияет на вывод.Этот вариант использует
*
(XOR 1) вместо!
, так что он превращает ноль в+1
, иI
это условный толчок, который сдвигает положительные значения и вправо, отрицательные значения влево и отрицает их в любом случае (так что мы все равно в конечном итоге получим-1
на вершине исходного стека, когда мы встречаемсяT
), так что в конечном итоге это работает так же, как и исходное<!]T[!>
решение.источник
PHP,
8229242928 символов82 -> 29: символ новой строки сохраняется при обращении с помощью
strrev
.29 -> 24: теперь использует сокращенный синтаксис
24 -> 29: теперь читает все строки вместо одной строки
источник
fgets(STDIN)
читает только первую строку.Befunge-98 -
1110(Проверено cfunge)
Приведенный ниже вариант слегка нарушает требование: он выполняет задачу, но затем выводит бесконечный поток нулевых байтов (и не завершается).
Он работает так, что несколько раз читает входные данные в стек (
~
) по одному символу за раз, перепрыгивая через#
запятую. При достижении EOF~
действует как отражатель, и компьютер переворачивается, многократно нажимая и выводя символ (,
), перепрыгивая через (#
) тильду.источник
#v~
строка 2::<,_@#
. Забавно, что использованиеj
здесь не улучшает его.Pyth -
354 байтаИтак, оригинальная версия с тремя символами не изменила порядок строк, только линии. Затем я придумал эту 5-символьную версию:
Я спас 1 байт благодаря @FryAmTheEggman, чтобы привести его:
Живая демоверсия.
Объяснение:
Оригинальное (неверное) решение:
Технически это не считается, потому что Pyth был создан в 2014 году, но все же аккуратно, что он связан с GolfScript.
Объяснение:
источник
Fk_.z_k
Я уверен, что кто-то может получить что-то ниже этого, но это то, что я получил.Cubix ,
98 байтовБольшое спасибо Martin Ender за этот гольф:
Посмотрите, как это работает онлайн!
Это становится следующим кубом (
>
указывает на указатель начальной инструкции):Первый шаг программы состоит в том, чтобы взять все данные.
i
помещает 1 байт ввода в стек. Если ввод не завершен,?
IP поворачивается направо, оборачиваясь вокруг куба, пока не достигнетw
, и отправляет его обратноi
.Когда ввод завершается,
?
IP направляется на север, входя в выходной цикл:o
: печатать символ в верхней части стопкиw
: указатель вправо;
: поп символ, который был только что напечатан\
: отразить IP, отправив его на восток?
: если для печати остались символы, поверните направо и вернитесь в цикл.Последнее время
?
достигнуто, когда в стеке ничего не осталось, вместо этого IP-адрес продолжает:i
: взять байт ввода. Это будет после-1
ввода.\
: отразить IP, отправив его на север, в:@
: завершить программу.9-байтовое решение
Посмотрите, как это работает онлайн!
В форме куба:
Первый
i
вводимый символ - это код ввода. Если нет ввода, это-1
.Следующий персонаж
?
- это решение. Если вершина стека положительна, она поворачивает вправо, оборачивая куб, пока не достигнет его,/
что отправляет его обратно вi
, создавая цикл ввода. Однако, если TOS отрицательный, ввод завершен, и поэтому он превращается в выходной цикл.Цикл вывода прост.
o;
выводит и выскакивает TOS. Первый раз, когда он запускается, он-1
является вершиной стека, но не отображается на символ и поэтому игнорируется./
отражает IP для перемещения влево, где он встречается!@
- который завершает программу, если стек пуст. В противном случае IP-адрес продолжается,?
снова ударяясь - поскольку стек не пуст, TOS должен быть символом, все из которых положительны 1 , так что это заставляет IP поворачиваться направо и продолжать цикл вывода.1 Оба решения предполагают, что входные данные не будут содержать нулевые байты.
источник
05AB1E, 1 байт
R меняет ввод.
источник
,
в конце, потому что верх стопки печатается автоматически, когда ничего не печатается.Wumpus , 12 байт
Попробуйте онлайн!
Ответ Мартина хорошо демонстрирует поток управления треугольной сеткой Wumpus, но я подумал, что попробую эту задачу с однострочником.
Более простая для понимания версия (на один байт длиннее):
который работает так:
Теперь давайте посмотрим на версию для гольфа, которая отличается в середине:
Гольф-версия экономит байт, не требуя явной команды
;
для выталкивания посторонних -1. На EOF, эта программа переходит к(4, 0)
вместо того ,(8, 0)
где он выполняет4*0.
еще раз - за исключением этого времени постороннего -1 находится на вершине! Это заставляет нас перейти к тому(-4, 0)
, что из-за переноса является таким же, как и(8, 0)
для этой сетки, получая нас туда, куда мы хотим, в то же время потребляя посторонние значения.источник
Wumpus ,
1311 байтПопробуйте онлайн!
объяснение
Поскольку Wumpus является языком, основанным на стеке, основная идея состоит в том, чтобы прочитать все STDIN в стек, а затем просто распечатать весь стек сверху вниз. Интересной частью здесь является контроль потока через сетку.
Чтобы понять поток управления, нам нужно взглянуть на фактическую структуру треугольной сетки:
IP начинается в левом верхнем углу и идет на восток. Мы можем видеть, что есть петля через группу из шести ячеек слева и ответвление от
\
. Как и следовало ожидать, цикл считывает все входные данные, а линейное сечение в конце записывает результат обратно в STDOUT.Давайте сначала посмотрим на цикл. Более разумно думать о том, что первый
)?\
не является частью цикла, а фактический цикл начинается сi
. Итак, вот начальный бит:Затем цикл начинается:
Это оставляет линейный участок в конце:
источник
PHP - 44 символа
источник
Perl
источник
Деление ,
2015 байтАлгоритм очень похож на алгоритм Мартина, но реализация существенно отличается.
Как это устроено
Все начинается с того
R
, что высвобождает восточный атом с массой 1 и энергией 0.После нажатия
?
входной символ сохраняется как масса атома, а энергия остается равной 0, если stdin не возвращает EOF, и в этом случае энергия становится равной 1.J
это команда прыжка деления, и она прыгает на атом на количество клеток, эквивалентное его текущей энергии, оставляя атом с нулевой энергией. На данный момент наш атом имеет нулевую энергию и игнорирует эту команду.Затем мы наносим удар
%
, который является переключателем. С энергией, превышающей 0, наш атом будет направлен вниз (как если бы он отражался\
зеркалом), но, поскольку у нас ровно 0 энергий, противоположное зеркало направляет нас вверх/
.Наш атом продолжается до тех пор, пока не ударит второе зеркало, на
\
этот раз направив его влево.Мы увеличиваем энергию атома до 1 с
$
, и используемX
для дублирования атома. Одна копия будет отражена обратно в$
команду (оставив эту копию с энергией 2), а другая копия будет помещена в стекK
.Наша отраженная копия движется в обратном направлении, откуда она пришла, пока не нажмет
%
снова на выключатель. Теперь, когда у нас есть положительная энергия, мы размышляем, как если бы мы попали в\
зеркало, оборачивая доску на следующуюS
и уменьшая нашу энергию до 1.Команда
S
будет потреблять 1 энергию, чтобы сохранить наше направление. Если бы у нас не было энергии, атом отклонился бы так, как если бы его ударило\
зеркало вниз. Вместо этого мы снова двигаемся вправо и выбираем больше ввода,?
и цикл повторяется.Как только наш атом достигнет EOF,
?
команда сохранит в нем 1 энергию. Таким образом, когда мы нажимаемJ
команду в этот раз, мы полностью пропускаем%
переключатель и приземляемся наS
переключатель с нулевой энергией.Теперь, так как наша энергия была потреблена в прыжке, наше направление не сохраняется
S
переключателем, но мы скорее направлены вниз. Затем мы уменьшаем нашу энергию до -1 с помощью~
команды и оборачиваемся вокруг доски. При попадании с отрицательной энергией,K
команда выбрасывает атом вместо того, чтобы нажать на него. Мы выводим наш недавно выдвинутый атом с помощью!
и используем энергию 1 этого атома для обходаS
переключателя, и цикл завершается.Если стек
K
был пустым, энергия нашего атома сводится на нет (в результате чего +1 энергия), и она отражается обратно в~
команду, оставляя ее с энергией 0. ПриS
повторном ударе мы отклоняемся вправо, пока не?
будет нанесен удар. Поскольку EOF был достигнут,?
уничтожает атом и завершает программу.источник
Лабиринт , 10 байт
Обычно лабиринтные программы должны напоминать лабиринты, но я смог сжать циклы в этом настолько плотно, что код оказался единым блоком (комната?). Вот немного расширенная версия, которая облегчает отслеживание потока управления:
,
читает один байт за раз из STDIN, пока он не достигнет EOF и не вернется-1
. В)
приращения это значение так , что мы получаем что - то положительное для каждого байта чтения и нулем в EOF.:
Дублирует каждый байт для чтения.Как только мы нажимаем EOF, указатель инструкции переходит ко второму циклу, где он многократно сбрасывает одно значение с
;
(вначале EOF, затем вторая копия каждого байта), затем уменьшает следующее значение с(
и печатает его с.
. Из-за этой второй копии (которая всегда положительна) мы знаем, что IP будет поворачивать вправо вверх и продолжать в этом цикле.После того, как все байты были напечатаны, вершина стека снова становится равной нулю, а IP продолжается прямо до
@
и программа заканчивается.Казалось бы, ненужное дублирование каждого байта - это то, что позволяет мне гарантировать, что (даже в крутых петлях версии с гольфом) IP всегда делает правильный поворот и никогда не переходит от одной петли к другой.
Наконечник шляпы к TheNumberOne и Sp3000, чьи собственные попытки очень помогли найти это сильно сжатое решение.
источник