Основанный на этом вопросе Math.SE ; номер скопирован из этого ответа . Номер изначально из видео Numberphile , конечно.
Ваша задача - вывести следующее 1350-значное простое число:
888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888111111111111111111111111888888111111111111111111111111888888111111811111111118111111888888111118811111111118811111888888111188811111111118881111888888111188811111111118881111888888111888811111111118888111888888111888881111111188888111888888111888888111111888888111888888111888888888888888888111888888111888888888888888888111888888111888888888888888888111888888811188888888888888881118888188811188888888888888881118881188881118888888888888811188881118888111888888888888111888811111888811118888888811118888111111188881111111111111188881111111118888111111111111888811111111111888811111111118888111111111111188881111111188881111111111111118888811118888811111111111111111888881188888111111111111111111118888888811111111111111111111111888888111111111111111111111111118811111111111111111111111111111111111111111111062100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
При желании вы можете включить перевод строки в вывод.
правила
- Это колмогорова-сложность , поэтому никаких отзывов .
- Ваша программа должна завершиться в течение одного часа на стандартном компьютере - если она близко, я буду использовать мою для тестирования. Если ваша программа работает более минуты или не завершает работу на TIO, укажите время на вашем компьютере.
- Это код-гольф , поэтому самый короткий код в байтах побеждает.
Ответы:
Желе ,
7471696866 байтПопробуйте онлайн!
Как это работает
Литерал
“©ạ-3ṗÇñ"ỤḍV8żṢ?ḤsMVE[,Ṃƭ"ḞÇsẇʂ(ụFsẠʂẆŀṣ’
заменяет все символы с их кодовыми точками в кодовой странице Jelly и интерпретирует результат как (bijective) число base-250, приводя к следующему целому числу.Затем
ḃ19
преобразует это число в биективное основание 19, получая следующий массив цифр.Теперь
ĖŒṙ
перечисляет цифры и выполняет декодирование по длине прогона, получая следующий массив.Затем
ị⁾81
индексирует в строку 81 , заменяя нечетные числа символом 8 , четное число - символом 1 . Послеs30
этого результат разбивается на фрагменты длиной 30. Отображение одного фрагмента на строку приводит к следующему результату.Теперь
m0
объединяет массив чанков с обращенной копией самого себя. После этогоZ
архивирует результат, перемещая строки и столбцы.0
является непарсируемой ниладой, поэтому результат before печатается (без разрывов строк), а возвращаемое значение устанавливается равным 0 .62
это еще один непарсируемый nilad, поэтому выводится результат before ( 0 ), а возвращаемое значение равно 62 .ȷ446
еще один непаренный нилад. 62 печатается, и возвращаемое значение устанавливается на 10 446 .Наконец,
‘
увеличивает результат. Окончательный результат ( 10 446 + 1 ) печатается после завершения программы.источник
[8, 1]
... О, это умно! Я краду этот трюк, надеюсь, ты не возражаешь :))), а потом добавляешь все эти странные вещи 06210..01. приятно :)SOGL V0.12 ,
81787573 байтаПопробуй здесь!
Объяснение:
источник
Желе , 136 байт
Попробуйте онлайн!
Пояснение (сокращенные цифры)
-121 байт благодаря Деннису, использующему
“...’
литералы вместо обычных чиселисточник
“...’
литералы сохраняют кучу байтов. tio.run/…0;6;2;1;
кажется ужасно многословным.Желе ,
133 8473 байтаПопробуйте онлайн! (нижний колонтитул форматирует десятичное число с размерами, которые дают герб).
Как?
Длина зашифрованной формы двоичного формата с левой стороны герба
8
и1
до строки до начала,0621
отраженного с0621
добавлением, а затем умноженного на 10 446 и увеличенного.источник
Древесный уголь ,
10710498968779 байтПопробуйте онлайн! Ссылка на подробный код для объяснения
источник
Протон , 368 байт
Попробуйте онлайн!
источник
Рубин , 180 байт
Попробуйте онлайн!
178 байт + 2 байта для
-Kn
(принудительное кодирование ASCII)43 преимущественно непечатаемых символа между первыми кавычками. HexDump:
Как?
Все остальные делали кодирование длин серий, поэтому я хотел попробовать что-то другое.
Отформатированную версию «картинки» простого числа можно разделить на две части - сетку 30x30 из 8 и 1, и вторую секцию, состоящую в основном из нулей, которые могут быть жестко закодированы. Сосредоточив внимание на первой части, мы видим, что она симметрична по центру, поэтому, если мы можем произвести левую половину, мы можем просто напечатать половину каждой строки с ее обратной стороной.
Половина одной строки имеет длину 15 символов. Если мы заменим 8 на нули, каждая строка может быть интерпретирована как 15-битное двоичное число. Удобно, что по большей части расстояние редактирования между каждой последовательной строкой невелико, поэтому я решил реализовать свое решение, сохранив первую строку
s
(888888888888888
которая просто становится равной 0) и применив серию операций переворачивания битовs
, каждый раз печатая результат ,Поскольку каждая строка имеет длину 15 бит, я закодировал эти операции в виде шестнадцатеричных цифр - например, если операция
b
(или 11), то мы переворачиваем бит 11. Некоторые строки отличаются более чем на один бит, поэтому для них требуется строка шестнадцатеричного числа цифры. У нас остался один бит over (f
), поэтому мы можем использовать его как разделитель между этими строками, а также как значение «ничего не делать». Пример ниже (вы можете увидеть эти строки в сообщении, указанном в вопросе):Чтобы сложить все это вместе, мы бы закодировали
0123456789ab
, затем отделилиf
, ничего не делалиf
, тогда5
. Это работает , потому что мы будем делать.split(?f)
позже , чтобы получить каждый набор операций по линии, которые принесут["0123456789ab", "", "5"]
, и""
будет не-оп.Разница между строками 3 и 4 выше - самый длинный набор правок, и расстояние редактирования между любыми двумя последовательными строками обычно составляет 0-2, поэтому я бы сказал, что это кодирование достаточно недорого, хотя я уверен, что оно может быть улучшенным.
В итоге вся закодированная строка
fff0123456789abff5f6f7ff8f4f3f012fff8bfef7af69df458cf01237bf6af59f48f237f16f045f3f12f0
(86 байт) получит всю сетку 30x30. Но мы еще не закончили ...Шестнадцатеричные цифры могут быть представлены 4 битами (
b
->1100
и т. Д.). Это означает, что, если мы хотим кодировать нашу строку по 4 бита за раз, а не использовать байты, мы можем сократить длину строки пополам. Вот что я сделал - hexdump показывает строку, представленную в 43 байтах. После этого это просто вопрос использования изящной Руби распаковку String # в с помощьюH*
(интерпретировать как шестнадцатеричную строку, в первую очередь, высокий клев) для расширения 43-байтовой строки в 86-байтовую версию, которую мы знаем и любим, и зацикливать каждый набор операций. переворачивание битов - для нашей сохраненной строкиs
и операции, которуюc
мы делаем,s ^ 2**c.to_i(16)
чтобы перевернуть соответствующий бит.После того, как каждый набор изменений завершен, мы дополняем получаемый двоичный файл до 15 бит, переключаем все 0 обратно на 8 и печатаем результат и его реверс. Как отмечалось ранее, часть числа после сетки 30x30 может быть жестко закодирована, поэтому мы делаем это как
puts'0621'+?0*445+?1
.Последняя закодированная строка не имеет возможности работать с TIO, поэтому версия TIO использует escape-коды, которые все еще работают, но длиннее.
источник
Python 2 ,
760523329205196 байт-237 байтов благодаря Стивену. -124 байта благодаря Джонатану Фреху.
Попробуйте онлайн!
источник
8
и1
и объединяя621
621
. Благодарность!CJam,
532412340231210209 байтовПопробуйте онлайн
Кодирование длин серий увеличено с базы 92 (база 250 привела к многобайтовым символам, поэтому пришлось ее корректировать). Кроме того,
4341089843357287864910309744850519376
расширен от базы 92 и преобразован в двоичный файл. 1 означает, что длина серии составляет две цифры, 0 означает, что это одна цифра. Например, первые 4 цифры двоичного представления - 1101, потому что первые четыре серии[93,8],[24,1],[6,8],[24,1]
(93 8, 24 1 и т. Д.)источник
JavaScript,
454450332207204 байта-4 байта благодаря Стивену. -125 байт благодаря Shaggy и Dom Hastings.
В этом ответе есть куча непечатных документов, так что вот hexdump:
источник
+'1'
поскольку она уже естьString
и+'0621'
может быть+0+621
![...`]
сводит меня с умаJavaScript (ES6),
206205204203198197194 байтаПридумал это, работая над решением I Cri Everytim , подумал, что оно достаточно разное, чтобы публиковать его самостоятельно.
Это включает в себя загрузку непечатаемых символов между
]
и таким,
образом, перейдите по ссылке TIO ниже, чтобы просмотреть его с экранированием Unicode (каждая последовательность, за которой\u
следуют 4 цифры, считается как 1 байт).Попробуйте онлайн
источник
MATLAB / Octave ,
319318 байтЭто моя первая попытка решить эту проблему. Все еще немного большой и, вероятно, есть более эффективные способы сделать это, но я думал, что я отправлю это так или иначе, поскольку метод был более интересным, чем просто сжатие.
Попробуйте онлайн!
Метод, использованный здесь, заключается в том, чтобы использовать своего рода схему кодирования длины выполнения.
Мы начнем с исходного номера и посчитаем количество последовательных цифр. Они записаны в приведенном ниже результате как количество, за которым следует цифра (пробел отделен для ясности).
Если какое-либо из значений больше 95, мы разбиваем его на несколько частей по 95 или меньше - это происходит только для 445 0, которые вместо этого становятся четырьмя наборами 95 0 и набором 65 0. Мы также дополняем любое число меньше 10 символом 0, чтобы все элементы имели длину в три символа. Это приводит к удалению пробелов:
Оглядываясь назад, я мог бы сделать этот шаг, прежде чем объединить все воедино, но как же вы живете и учитесь. Мы делаем что-то умное - взять счетчик для каждой группы (2 цифры) и добавляем 31. Поскольку все они <96, полученное число является значением ASCII для печатного символа (от 32 до 126). Дает нам количество:
После небольшого изменения формы в MATLAB, чтобы сделать его более удобным для декодирования, а затем экранирования
'
символов с помощью''
(в противном случае MATLAB разбивает там строковые литералы), мы остаемся с умной строкой:Это корень кода. В коде все, что я затем делаю, это превращаю массив в двумерную строку с 128 парами символов. Для каждой пары первый символ вычитается 31, а затем второй символ отображается столько раз.
В результате получается оригинальное простое число:
Редактирование:
источник
05AB1E , 76 байт
Попробуйте онлайн!
Украл это у Денниса:
Заметил, что он всегда чередуется между 8 и 1, поэтому я посчитал длины каждого прогона (база 20):
Сложил все это вместе и преобразовал в целое число с основанием 10:
Сжал его дальше в базу-255:
Затем, после создания сжатого бита ... Мы просто должны манипулировать им обратно к оригиналу.
Окончательный вывод:
источник
C (gcc) , 277 байтов
У меня такое ощущение, что нить можно как-то укоротить.
Попробуйте онлайн!
источник
Perl 5 , 307 байт
Попробуйте онлайн!
источник
Жевательная резинка , 88 байт
Попробуйте онлайн!
источник
Рубин , 194 байта
Верхняя часть имеет RLE-кодировку, остальная часть просто закодирована.
Попробуйте онлайн!
источник
Котлин , 339 байт
Попробуйте онлайн!
источник
CJam (
10881 байт)Онлайн демо
В случае, если кодировка символов нарушает вышесказанное, здесь это xxd-закодировано:
Начальный цикл 8 и 1 разделен на левую половину и длину цикла, закодированную как длина чередующихся серий. Последовательности более 24 разбиты на прогоны не более 24, разделенные прогонами 0, так что длины могут быть закодированы в формате base-25, а затем закодированы в base-256 для их упаковки.
источник
JavaScript (ES2017), 287 байт
Использует немного другой подход к ответу @icrieverytim . -10 байт благодаря предложению @Shaggy использовать
replace
вместоmatch
!источник
/// , 260 байт
Попробуйте онлайн!
Ничего страшного, просто сжатие.
источник
Mathematica, 192 байта
Смотрите: http://reference.wolfram.com/language/ref/Compress.html
источник
Python 2 ,
191190188 байтПопробуйте онлайн!
Тот же принцип, что и мой ответ здесь
источник