var QUESTION_ID=74273,OVERRIDE_USER=20260;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/74273/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>
Ответы:
Python 2, 53
56-3 после осознания того, что
yield x
можно использовать как выражение.источник
'aa'
а не на''
:S=lambda s:(c+w for f in[str,S]for w in f(s)for c in s)
. Также не работает для пустого ввода.Haskell, 24 байта
Создает бесконечный список.
источник
(:)<$>s<*>f s
что дал бы неправильный порядок. Там,f s="":(flip(:)<$>f s<*>s)
но это дольше.f s=[]:(f s<**>map(:)s)
кроме того, что<**>
нет вPrelude
.JavaScript (ES6), 61 байт
Порт генератора @ feersum Python. Это
let
необходимо. Сохраните 2 байта, используя понимание массива (предложение ES7 провалилось, но работает в Firefox 30-57):Альтернативная версия для 73 байтов, которая возвращает первые
n
элементы, полученные вышеупомянутым генератором:источник
Mathematica,
3231 байтРедактировать:
CatsAreFluffy соскоблил один байт.
источник
Perl,
393735 байт(Сначала описывает более старую версию. Новая более короткая программа находится в конце)
Включает +3 для
-alp
Запуск с набором символов на STDIN, например
perl -alp kleene.pl <<< "a b c"
kleene.pl
(эта версия составляет 34 + 3 байта):Добавьте +2 для
-F
(неявное удаление,-a
если между входными символами нет пробелов, или -6 (только@a=""
перед}
), если мы уже ставим запятые между символами в STDINОбъяснение:
Эти
-alp
параметры эффективно сделать код:Как вы можете видеть,
<>
perl не только используется для readline, но также может выполнять глобализацию в стиле оболочки (фактически, в древних perl это было реализовано с помощью вызова оболочки).Например
<{a,b}{1,2}>
, расширится до"a1","a2","b1","b2"
Поэтому, если у нас есть элементы,
@F
нам просто нужно добавить запятые между ними. Символ по умолчанию для интерполяции - это пробел, который хранится в специальной переменной$"
. Таким образом , установив ,$"
чтобы,
превратится"{@F}"
в{a,b}
случае@F=qw(a b)
(шарики расширения в виде строк)На самом деле мне бы очень хотелось выполнить цикл с чем-то вроде этого
glob"{@F}"x$n++
, но я продолжал сталкиваться с проблемой, что первая пустая строка не генерируется, и все найденные обходные пути сделали код слишком длинным.Таким образом, другая важная часть этого кода состоит в том, что если вы используете
for
цикл для массива, вы можете фактически вставить в него дополнительные элементы во время цикла, и цикл также получит эти новые элементы. Так что если в цикле мы находимся, например, в элементе"ab"
, то<{@F}$_>
расширимся до того,<{a,b}ab>
что в контексте списка становится("aab", "bab")
. Так что, если я нажимаю на них,@a
то становятся доступными также строки, расширенные слева.Все, что мне еще нужно сделать, это заправить цикл пустой строкой. Это делается с помощью
$#a = 0
(,
в числовом контексте становится0
), что заставляет первый и единственный элемент@a
стать undef, который будет вести себя как,""
когда я его используюулучшение
Фактически, выполняя тесты для этого объяснения, я нашел короткий способ использовать растущий глобус, который правильно обрабатывает первую пустую запись. Запускать как
perl -ap kleene0.pl <<< "a b"
(так добавьте 2 байта для-ap
)kleene0.pl
(эта версия составляет 33 + 2 байта):Все эти решения будут сохранять все больше и больше выходных данных в памяти, что приведет к сбою программы через некоторое время. Вы также можете использовать Perl Globs для отложенной генерации, используя их в скалярном контексте, но это делает программы длиннее ...
источник
<{@F}$_>
? Благодарность!Пиф, 7
Попробуй здесь
Это вычисляет декартово произведение входных данных с каждым числом
0..n-1
, соединяет их, а затем сохраняет только первоеn
. Это будет время ожидания онлайн для чисел или строк, которые намного больше, чем 3-4.В качестве альтернативы, чтобы получить бесконечный результат, посмотрите на ответ Якуба .
источник
Желе,
86 байтЭто монадическая ссылка, которая принимает алфавит и печатает бесконечный список строк. Попробуйте онлайн!
Как это работает
Альтернативная версия, 6 байт (не конкурирует)
Это диадическая ссылка, которая принимает алфавит и желаемое количество строк в качестве левого и правого аргументов соответственно.
Я считаю эту версию неконкурентной, поскольку в ней используется биективное базовое преобразование, которое было реализовано после того, как эта задача была помещена в «песочницу». Попробуйте онлайн!
Как это работает
источник
Python 2,
898483 байтаисточник
CJam,
1610 байтСпасибо jimmy23013 за сохранение 6 байтов.
Ввод - это один аргумент командной строки на символ. Выход - одна строка в каждой строке.
Попробуйте онлайн! (Но убей это немедленно ...)
объяснение
источник
Pyth, 7 байт
Альтернатива @fry. Эта программа читает строку и продолжает печатать строки до бесконечности.
Объяснение:
В качестве альтернативы следующее также будет работать. Немного более хакерский, хотя.
источник
Haskell, 33 байта
Например,
k "xyz"
это бесконечный список["","x","y","z","xx","xy","xz","yx","yy","yz","zx","zy","zz","xxx",...]
источник
MATL , 10 байт
Попробуйте онлайн! Но не оставляйте его работать долго, чтобы избежать большой вычислительной нагрузки на сервер.
Программа отображает строки динамически, каждая строка в отдельной строке.
источник
Питон 3, 95
Почему функции itertools должны иметь такие длинные имена.
источник
combinations_with_replacement
это никогда не стоит Я уверен, что использовать петли короче. Всегда.Рубин,
6560 байтТакие длинные встроенные имена ...
источник
p
вызываетinspect
его аргументы, которые будут производить вывод, как[] ["a","b"] ["aa", "ab", ...
Пайк (коммит 31),
109 байтОбъяснение:
источник
Скала, 69
Ленивые потоки довольно хороши для такого рода вещей.
источник
Japt,
50403428 байтВход есть
"string", number of items
. Вывод сортируется по длине, затем в обратном алфавитном порядке. Проверьте это онлайн!Как это работает
Эта версия занимает некоторое время, если вы хотите сделать более 100 предметов. Если вы хотите более быструю версию, попробуйте эту 32-байтовую версию :
источник
Корица, 6 байт
Не конкурирует, потому что Корица Gum была сделана после этого испытания.
Попробуйте онлайн (TIO ограничивает вывод).
объяснение
The
h
помещает Cinnamon Gum в формат и режим генерации . Остальная часть строки распаковывается в[%s]*
. Затем%s
он заменяется вводом, и создается генератор, который выводит все возможные строки, соответствующие регулярному выражению.источник
05AB1E , 9 байтов
Попробуйте онлайн!
источник
Python, 55 байт
Это длиннее 53-байтового решения feersum , но оно иллюстрирует другой метод с выводом на печать. Список
l
обновляется, пока он повторяется, добавляя каждый односимвольный суффикс каждой читаемой строки.Это одинаково долго использовать
map
:Такую же длину можно сделать в Python 3, потеряв символ для
print()
и сохранив его путем распаковки ввода.источник
Zsh , 31 байт
Попробуйте онлайн!
Распечатайте массив, а затем скопируйте аргументы перед повторением. Несмотря на включение имени функции, это на один байт короче, чем итерационная версия:
источник