Невыразимое число - это число, которое делится на семь или имеет семь в качестве одной из своих цифр. Детская игра состоит в том, чтобы считать пропущенные невероятные цифры
1 2 3 4 5 6 ( ) 8 9 10 11 12 13 ( ) 15 16 ( ) 18 ...
Канторская версия игры - это последовательность, определяемая путем рекурсивного заполнения последовательности «1 2 3 4 5 6 () 8 ...» в пробелах () выше.
1 2 3 4 5 6 1 8 9 10 11 12 13 2 15 16 3 18 19 20 4 22 23 24 25 26 5 6 29 30 31 32 33 34 1 36 8 38 ...
Напечатайте / выведите хотя бы первые 7 ^ 7 чисел невероятной числовой игры Кантора ...
Хотя определение дается рекурсивно, вы не обязаны использовать рекурсию в коде.
Это код-гольф , поэтому выигрывает программа с самым коротким числом байтов!
Примечание. Сумма чисел от 1 до 7 ^ 7 равна 203511962727. Последние 10 чисел в этом диапазоне: 823534 823535 221563 108068 823538 823539 823540 823541 823542 221565.
Дамп Pastebin первых 1000 итераций: http://pastebin.com/Ksiu9Svf
Ответы:
Pyth ,
252322 байтаСпасибо @Maltysen за -2 байта
Программа, которая печатает бесконечный поток.
Попробуйте онлайн! (Выход промывается с интервалами и тайм-аутом через 1 мин)
Как это устроено
источник
7
это простое число, поэтому делимость можно сделать с помощью проверки простой факторизации, которая хорошо согласуется с другой проверкойPython 2,
77757470 байтБлагодаря @MartinEnder за предположение , предел
9e5
которого Ende г d до работы после изменения.Спасибо @mschauer за предложение бесконечного потока, экономящего 4 байта.
Это генератор, который выдает бесконечный поток чисел.
источник
if n%7<1or'7'in`n`else n
может быть немного быстрее (то же самое количество байтов), такn%7<1
как быстрее, чем проверка строки, иor
имеет короткое замыкание. Жаль, чтоyield[n,next(i)][n%7<1or'7'in`n`]
это не сработает.Perl,
47464139 байтСохранено 5 байтов благодаря @Dada
Попробуйте онлайн! TIO Nexus, теперь с поддержкой Perl! Это обрезает вывод после определенной точки, но если у вас установлен Perl, вы можете запустить его локально для получения полного вывода.
Код использует несколько странных причуд синтаксиса Perl, поэтому я расскажу, как он работает ниже.
Разбивка кода:
источник
say$a[@a]=$_=...
выиграть 2 байта, если я не ошибаюсь.$_
, это экономит мне 5 байтов. Спасибо!PHP,
80 (Wahooka) 5754 байтаВ то время как идея от Wahooka. Я думаю, что моя версия достаточно отличается, чтобы сделать ее собственным ответом:
источник
Haskell,
6766 байтf
это бесконечный список чисел.Попробуйте онлайн!
f
начинает новую итерацию с1
индекса, число которого выбирается из 0. Когда есть пробел, мы берем новую итерацию, выбираем ееith
элемент и продолжаем текущую итерацию сi+1
. Если пробела нет, мы берем текущее числоx
и продолжаем без увеличенияi
.Редактировать: -1 байт благодаря @BMO.
источник
MATL ,
2625 байтПопробуйте онлайн! с
9e5
заменой на9e4
, так что максимальное время работы и выходной размер онлайн-компилятора не превышены.Как это устроено
Это использует итерацию вместо рекурсии. (На самом деле у MATL нет рекурсии).
Сначала создается массив чисел от
1
до9e5
(этого достаточно, потому что он9e5
превосходит7^7
). Тогда число, кратные7
или имеют ,7
как цифры будут определены, и заменены1
,2
... Процесс повторяется до тех пор, пока нет числа , которые должны быть заменены.источник
Tcl , 121 байт
Тривиальное решение с использованием бесконечного цикла, ничего особенного ..
Ungolfed:
источник
incr
. И если TCL версия> = 8.6,incr
предполагает первой итерации приращение в новой переменной от0
до ,1
если эта переменная не была установлена ранее; так что вы можете избавиться от первых двухset
инструкций.PHP,
10680 байтСпасибо Измаилу Мигелю за помощь в решении троичного кода и использовании более короткого кода цикла вместо вместо while.
Не удалось проверить последние части полной последовательности из-за 30-секундного максимального времени выполнения PhpFiddle. Кажется, работает по крайней мере до 1K на основе образца вывода, предоставленного OP.
Гольф:
Оригинальная версия для гольфа :
источник
for($n=1;;$n++)echo$a[]=!(strpos($n,7)>-1||$n%7==0)?"$n ":array_shift($a)." ";
Я не знаю количество байтов, но я уверен, что оно намного меньше, чем 106 байтов. Попробуйте и посмотрите, работает ли это.for($n=1;;$n++)echo$a[]=strpos($n,"7")>-1||$n%7==0?array_shift($a)." ":"$n ";
. Я не уверен , если вы можете заменить$n%7==0
с ,!$n%7
но это стоит попробовать.for(;;)echo$a[]=strpos(++$n,55)<-1&&$n%7?"$n ":$a[++$b-1];
(58 байт).++$b-1
потому что$a[null] === null
Юлия, 62 байта
Ничего фантастического. Использует, что последовательность в промежутках является самой последовательностью. Делает избыточные копии массива, чтобы сохранить несколько байтов.
источник
Perl 6 ,
74 57 5453 байтаПопробуй
Expanded:
Контрольная работа:
источник
~7
вместо'7'
.Цейлон, 202 байта
Это не функция, а объявление объекта, реализующее бесконечную последовательность (Iterable). Объект может быть напечатан напрямую,
print(u)
выводит это:{ 1, 2, 3, 4, 5, 6, 1, 8, 9, 10, 11, 12, 13, 2, 15, 16, 3, 18, 19, 20, 4, 22, 23, 24, 25, 26, 5, 6, 29, 30, ... }
Чтобы напечатать больше, используйте
printAll(u)
. В следующем коде используются символы новой строки, а также выводится сумма (и первые 30 элементов, показанные выше):Вот версия без комментариев и комментариев:
источник
Рубин, 80 байт
l=->x{x%7==0||x.to_s[/7/]};a=(1..100);b=a.reject &l p a.map{|x|!l[x]?x:b.shift}
Первая подача, я уверен, что это может быть улучшено :)
источник
34
(который в8
настоящее время) должен быть7
, но поскольку7
это невыразимое число, программа должна начать третью итерацию и вместо этого печатать1
.Дьялог АПЛ , 39 байт
{(⍵⍴⍨⍴i)@(i←⍸('7'∊¨⍕¨⍵)∨0=7|⍵)⊢⍵}⍣≡⍳7*7
⍳7*7
это 1 2 3 ... 7 7{ }⍣≡
является оператором с фиксированной запятой - применяйте функцию несколько раз, пока результат не стабилизируетсяA@I⊢B
изменить оператор - заменить на индексы элементовI
вB
сA
0=7|⍵
битовая маска для того, где аргумент делится на 7'7'∊¨⍕¨⍵
битовая маска, для которой десятичное форматирование аргумента содержит 7∨
или же⍸
по каким показателям верна любая из вышеперечисленных битовых масок?i←
назначить наi
⍵⍴⍨⍴i
изменить аргумент на количество элементов вi
источник
C
157155 байтЭто выглядит правильно, я не удосужился полностью проверить. Идет до 999999, который, по-видимому, достаточно велик.
Безголовая версия:
Частично гольф-версия:
источник
else
?(r=0)
большинстве случаев. Но некоторые компиляторы придирчивы. Мне лень проверять спецификации прямо сейчас.R 86 байт
Использует встроенную в R Истину
T
(инициализированную вTRUE
/1
) для подсчета чисел в последовательности и значение FalsyF
(инициализированное вFALSE
/0
) для подсчета невыразимых. Кроме того, программа просто проверяет, делится ли каждое число на семь или содержит число.источник
7%in%el(strsplit(c(T,""),""))
на55%in%utf8ToInt(paste(T))
? (не проверено)C - 115 байт
РЕДАКТИРОВАТЬ: Благодаря @mschauer, который указал, что я пропустил некоторые вещи.
источник
Javascript, 80 байт
Поскольку существуют только минимальные требования, но не максимальные требования, это решение продолжает выпускаться бесконечно.
Чтобы убедиться в правильности алгоритма, вы можете выполнить тот же код, напечатав только последние 10 цифр и сумму:
источник
Mathematica, 82 байта
источник
JavaScript 81 байт
Оригинал (98 байт)
Golfed
источник
p=console.log;for(c=0,i=1;i<=Math.pow(7,7);i++)/7/.test(i)||i%7==0?(6==c?c=1:c++,p(c)):p(i);
?9e5
вместо этогоMath.pow(7,7)
, так как вPrint/output AT LEAST the first 7^7
34 1 36 **8** 38
. Но что бы это ни стоило, текущая версия может быть добавлена в игру ещеfor(c=i=0;++i<9e5;)console.log(!/7/.test(i)&&i%7?i:c++%6+1)
.Befunge, 100 или 156 байт
Эта первая версия является более переносимой из двух, ограничивая себя 7-битными ячейками памяти, что вы получаете в справочном интерпретаторе.
Вторая версия работает только с интерпретаторами, которые имеют 32-битные ячейки памяти и, следовательно, не являются строго стандартными Befunge, но это позволяет нам хранить большие значения в памяти без необходимости разбивать их по ячейкам.
В обоих случаях программа работает неопределенно долго, но первая версия будет переполнена около отметки 2 миллиона, а вторая версия должна получить максимальное значение int (около 2 миллиардов).
Вы можете попробовать это онлайн , но вам нужно будет остановить процесс, чтобы он не пытался работать вечно.
источник
Clojure, 130 байт
Базовое сокращение, отслеживание содержимого результирующего вектора и количества пропущенных значений. Последний
0
получает первый элемент сокращенного[r s]
,rest
удаляет первый элемент 0-индексированного результата.источник
Perl6, 41 байт
источник
Tcl , 64 байта
Попробуйте онлайн!
источник
JavaScript, 64 байта
источник
console.log
) ответами JavaScript, это 70 байтJapt , 25 байт
Проверьте сумму и последние 10 элементов.
Создает первые 1 000 000 записей последовательности и печатает их. Один миллион - самое короткое число
7**7 == 823543
в Япте.Конечный символ новой строки важен, так как он активирует неявное присваивание
U
.Создание списка занимает всего около секунды, но вывод всего массива, вероятно, приведет к зависанию вашего браузера.
Распаковано и как это работает
Использует свойство, что рекурсивное определение может быть разрешено путем просмотра уже сгенерированной последовательности.
источник