«9 миллиардов имен Бога» - это рассказ Артура Кларка. Речь идет о группе тибетских монахов, чей орден посвящен записи всех возможных имен Бога, написанных на их собственном алфавите. По сути, они посвящены написанию каждой возможной перестановки своего алфавита, ограниченного несколькими правилами. В этой истории монастырь нанимает инженеров для написания программы, которая сделает всю работу за них. Ваша цель - написать эту программу.
Правила:
Алфавит монаха использует 13 символов (по моим оценкам). Вы можете использовать
ABCDEFGHIJKLM
или другой набор из 13 символов.Минимальная длина возможного имени - 1 символ. Максимальная длина составляет 9 символов.
Ни один персонаж не может повторяться более 3 раз подряд.
AAABA
является действительным именем, ноAAAAB
это не так.Ваша программа должна распечатать (в файл) каждое возможное имя в последовательности от
A
доMMMLMMMLM
, разделенных любым символом не в алфавите (переводы строки, точки с запятой, что угодно).Это код-гольф, и вы можете использовать любой язык. Самое короткое решение к 1 июня 2014 года выигрывает.
Изменить: имена должны начинаться с A
и заканчиваться MMMLMMMLM
, последовательно проходя через все миллиарды имен. Но конкретная последовательность зависит от вас. Вы можете сначала распечатать все однобуквенные имена, затем все двухбуквенные имена и т. Д. Или вы можете распечатать все имена, начинающиеся с A
, затем все имена , начинающиеся с B
, или какой-либо другой шаблон. Но человек должен иметь возможность прочитать файл и подтвердить, что они все есть и в любом логическом порядке, который вы выберете, при условии, что у них есть время.
источник
f(k) = k^9 + k^8 + k^7 - 5*k^6 + k^5 + k^4 + 4*k^3 - 2*k^2 + k
. Реализация мудреца: goo.gl/0srwhq105.8GB
все сказано и сделано! Я рад, что звезды не погасли ... или, может быть, вам нужно распечатать список, чтобы это произошло ...?Ответы:
Руби, 46
Мое оригинальное, подобное решение было длиннее и неправильным (оно выводило числа base13, что не совсем все из-за ведущих нулей), но я оставлю это здесь, потому что оно все равно получило голоса.
источник
k=*?A..?M*9;puts k-k.grep(/(.)\1{3}|[N-Z]/)
C 140
177 235Старый добрый процедурный стиль, без излишеств.
Он насчитывает (без записи) 11 459 252 883 имен за 8 минут.
Затем отредактируйте с помощью времени выполнения и размера файла имен. Наблюдайте за небом ...
Время выполнения 57 минут, размер файла 126,051,781,713 (9 символов + crlf в строке). Пожалуйста, скажите мне адрес электронной почты монахов, чтобы я мог отправить им заархивированный файл для ручной проверки ...
Править Гольф немного больше, переработал чек на повторяющиеся буквы.
Все еще не самое короткое, но по крайней мере это заканчивается и генерирует требуемый результат.
Время выполнения 51 мин, размер файла 113 637 155 697 (на этот раз без пробелов)
Примечание: очевидно, что выходной файл очень сжимаемый, но мне пришлось убить 7zip, после 36 часов работы он был на уровне 70%. Weird.
Ungolfed
источник
#include
с?Golfscript,
5847 знаковБлагодаря Питеру Тейлору я избавлен от сеппуку от того, что я не победил решение Ruby! Запустите код до 10 самостоятельно , и вот доказательство того, что он пропускает числа четыре в ряд .
источник
n+
вместо''+n
. Я думаю , что это в рамках правил , чтобы использовать алфавит с управляющими символами, так что вы могли бы также заменить65+
с13+
и сохранить еще один символ, называя13:^
. И я думаю, что это13,{ stuff [...]
может быть13,1/{ stuff 4*
.13,
вкл может быть заменен{65+}%n+}%{ backtick {\4*/,}+78,1/%1-!},
на общую экономию 8, спасая вашу жизнь.AAAM
должно бытьAAABA
, а не такBAAAB
?Утилиты командной строки Bash + Linux, 43 байта
Это использует подобную технику , чтобы мой ответ ниже, но только рассчитывает на основании 16, и обрезает все «имена» , содержащие
0
,e
илиf
, а также те , с более чем 3 -х одинаковых цифр подряд.Преобразовать в алфавит монаха следующим образом:
Bash + coreutils (dc и egrep), 46 байт
Редактировать - исправленная версия
Это займет некоторое время, но я думаю, что это правильно.
dc
считает вниз от 14 ^ 9 до 1 и выводит в базу 14. egrep отфильтровывает числа с более чем 3 последовательными одинаковыми цифрами. Мы также отфильтровываем любые имена с цифрами «0», поэтому получаем правильный набор букв в именах.Вопрос указывает, что может использоваться любой алфавит, поэтому я использую [1-9] [AD]. Но для тестирования это можно преобразовать в [AM], используя tr:
Это дает последовательность:
Обратите внимание, что эта
dc
команда требует хвостовой рекурсии для работы. Это работает на версии 1.3.95 dc (Ubuntu 12.04), но не на 1.3 (Mavericks OSX).источник
APL (59)
Написано на собственном алфавите :) Это немного долго. Это также требует много времени для запуска
9
, попробуйте с меньшим числом, чтобы проверить, если хотите.Объяснение:
{
...}¨⍳9
: для каждого номера⍵
от 1 до 9:⍳13*⍵
: получить все числа от 1 до13^⍵
¯1⌽
: Повернуть список влево на 1 (у нас есть13^⍵
,1
,2
...,13^⍵-1
, который превращается в по0, 1, 2 ...
модулю13^⍵
).(⍵/13)⊤
: кодировать каждое число в базе 13, используя⍵
цифры⎕A[1+
...]
: добавить один (массивы 1-индексированы) и искать в⎕A
(алфавит)↓⍉
: превратить матрицу в вектор векторов вдоль столбцов.Z←⊃,/
: объединить каждый внутренний вектор векторов, дав нам список возможных имен (но он пока не соответствует правилам).{
...}¨
: для каждого имени проверьте, соответствует ли оно правилу 4-repeat-chars:4/¨⎕A[⍳13]
: для каждого символа сгенерируйте строку из 4 символов⍷∘⍵¨
: для каждой строки проверьте, присутствует ли она в⍵
∨/,↑
: принять логическое или все эти тесты,~
: и инвертировать его, так что это1
означает, что он соответствует правилам, а0
значит, что нет.Z/⍨
: выберите изZ
всех элементов, которые соответствуют ruels↑
: отобразить каждый в отдельной строкеисточник
Perl,
70686650 символовИспользование:
Приятно то, что отпечатки буферизуются, поэтому сначала печатаются все односимвольные решения, затем идут двухсимвольные слова и так далее.
источник
Perl - 35 байт
Считая Шебанг одним байтом.
Это свободный перевод ответа гистократа .
A..1x9
это немного странно; это сокращение для'A'..'111111111'
. Аккумулятор никогда не достигнет значения терминала (оно содержит только буквы в верхнем регистре), но он все равно завершится, когда станет длиннее 9 символов. Это можно проверить, например, используя1x4
вместо этого.источник
Array#-
).grep
сделаю это. Я не совсем свободно говорю на Ruby.Пиг (Вааай слишком длинный, для языка, созданного для игры в гольф)
шепотом : 101 ...
Несмотря на то, что это близко к тому, как я бы сделал это на Python:
Минус конечно длинное осложнение;)
источник
Pyth , 34 символа
Объяснение:
источник
Python 2 - 212 байт
источник
Japt , 21 байт
Попробуйте онлайн! (ссылка рассчитывается только до
14**4
.)Как это устроено
Предполагается стандартная реализация ECMAScript 2017 в качестве уровня JS (и достаточно памяти для хранения массива), где
Array
объект может иметь максимальную2**53-1
длину.источник