21, 21, 23, 20, 5, 25, 31, 24,?
Вдохновленный этой головоломкой , учитывая целое число , распечатайте следующую последовательность, пока не достигнете нецелого числа (испорченного, если вы хотите решить головоломку самостоятельно в первую очередь)
или более интуитивно: * 1, +2, -3, / 4, * 5, +6, -7, / 8, ...
TestCases:
1: 1, 1, 3, 0, 0, 0, 6, -1
2: 2, 2, 4, 1
3: 3, 3, 5, 2
4: 4, 4, 6, 3
5: 5, 5 , 7, 4, 1, 5, 11, 4
6: 6, 6, 8, 5
9: 9, 9, 11, 8, 2, 10, 16, 9
21: 21, 21, 23, 20, 5, 25, 31, 24, 3, 27, 37, 26
Ввод и вывод могут быть приняты в любом разумном формате, стандартные лазейки, как обычно, запрещены.
В духе код-гольфа выигрывает самый короткий ответ в байтах!
Песочница: https://codegolf.meta.stackexchange.com/a/18142/59642
Ответы:
05AB1E (наследие) ,
1817 байтПопробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
Я использую унаследованную версию 05AB1E здесь, а также сначала вычисляю следующее число, прежде чем печатать его, потому что цикл основан на 0, и это будет сделано
/0
в самой первой итерации. Это сохранило байт по сравнению с предыдущимN>
и"*+-/"
. Это работает только потому, что в прежней версии число, которое делится на 0, остается неизменным; тогда как в новой версии он станет 0; и в реальной математике это дало бы деление на ноль ошибок.источник
Scratch 3.0 39 блоков / 323 байта
Попробуйте это на
линиинуля!В качестве альтернативы, как синтаксис SB:
Посмотрите на вас, ребята, весело проводя время со своими модными
eval
высказываниями! Ну не я! Нет ... У царапины нет никаких злых укусов, поэтому мне пришлось делать что-то нелегко ... если заявления.По крайней мере, это не
goto
с ...источник
goto
и цикл вычитания, чтобы проверить, можно ли разделить, на языке стеков. , ; p (Со всей серьезностью, хороший ответ, +1 от меня! Я просто не мог не процитировать вас в своем только что законченном ответе «Пробелы ,
251227202 байтаБуквы
S
(пробел),T
(табуляция) иN
(новая строка) добавляются только как подсветка.[..._some_action]
добавлено только в качестве объяснения.Попробуйте онлайн (только с необработанными пробелами, вкладками и новыми строками).
-24 байта после комментария предложения @JoKing
n%i > 0
. Хотя толькоif(x < 0)
иif(x == 0)
доступны в Whitespace, простая проверкаif(x*-1 < 0)
в основном такая же, какif(x > 0)
.Дополнительные -25 байтов благодаря @JoKing .
Объяснение:
Цитата с нуля ответ :
Кто-то сказал
goto
? Пробел не имеет ничего, кромеgoto
как создавать и циклы, и операторы if. xD Кроме того, это основанный на стеке язык, поэтому мне приходится довольно часто менять / копировать / копировать. И в завершение: в пробеле нет даже чисел с плавающей запятой и только целочисленное деление, поэтому я использовалn % i * -1 < 0
для выхода из программы, если целое не может разделить текущее число.Псевдо-код:
источник
if(n == 0)
илиif(n < 0)
доступно. К сожалению нетif(n > 0)
илиif(n != 0)
. Но я уверен, что некоторые аспекты могут быть упрощены. Это текущее решение было методом проб и ошибок при отладке, но, возможно, я должен просто сделать шаг назад и переосмыслить более короткий подход. Когда у меня снова будет время И исправил псевдокод, вы действительно были правы, я переключилсяi
/n
в большинстве мест ..m = n%i; n = n/i; if (m == 0) jump to LOOP; exit program
?swap top two, copy second item
цикл в целом, а не копировать его в каждый раздел?Haskell ,
75 7473 байта-1 байт благодаря Will Ness -1 байт благодаря nimi
Попробуйте онлайн!
Позволяет избежать использования дробных целых чисел для экономии на байтах
источник
JavaScript (V8) , 52 байта
Печатает группы из 4 членов. Вдохновленный ответом Ruby от GB .
Попробуйте онлайн!
JavaScript (V8) , 54 байта
Печатает условия последовательности.
Попробуйте онлайн!
JavaScript (ES6),
5958 байтВозвращает массив.
Попробуйте онлайн!
источник
Perl 6 , 44 байта
Попробуйте онлайн!
Блок анонимного кода, который принимает число и возвращает последовательность. Если бы мы могли пропустить первый элемент (который всегда совпадает со вторым элементом), мы могли бы сохранить 3 байта, удалив
$_,
источник
Python 3 , 60 байт
Попробуйте онлайн!
источник
Piet ,
297190144 кодекса (432 байта)Попробовал новый подход с использованием
pointer
команды в качестве переключателя (k mod 4) для унификации выходного кода, в результате чего получилось более плотное изображение кода 10x19. Затем я проиграл это на 1 ряд и 2 столбца до 8х18.Вот след, чтобы увидеть, как это работает:
Первая строка помещает 0 в стек как начальный индекс (так как мы можем только
push
натуральные числа, мы нажимаем 2 и затем вычитаем), затем считывает ввод как число.Крайний левый столбец имеет общий код, дублирующий число и помещающий единицу в вывод, затем перемещающий индекс на вершину стека, увеличивающий его и затем дублирующий его трижды. Затем мы вводим пастельный красный r-образный блок через темно-голубой кодел для
pointer
команды, которая дает нам другие пути для оставшейся части нашего индексного мода 4.Мод 1, мы выходим через верх для умножения. Сначала мы перетасовываем копию нашего индекса на потом, затем выполняем умножение. Пройдя через белый цвет для noop, мы вводим столбец выше, чтобы зафиксировать четность cc (его необходимо перевернуть четное число раз, чтобы цикл оставался стабильным), после чего следует
pointer (1)
вход в пурпурный бар: он действует как поймать наши четыре пути и отправить нас обратно в петлю.Мод 2, мы выходим назад к сумме. Форма блока пастельных кодов означает, что мы выходим из строки выше, откуда мы вошли, и мы используем 3, которые мы помещаем в стек, выходя через красную кодовую область к
pointer (3)
себе вверх. Этот столбец имеет пустое пространство перед арифметикой и немного другой порядок нажатия и переключения cc, потому что в противном случае мы имели бы перекрытие цвета с целочисленными коделами в соседнем столбце.Мод 3 отправляет нас вниз для вычитания. То же самое, что и умножение, за исключением того, что мы пересекаем путь деления на пути вверх (так как при вводе пастельного зеленого бара у cc разный паритет, два выполнения выходят из этого бара с разных концов). При этом мы подбираем нежелательную
duplicate
команду, поэтомуpop
перед тем, как войти в панель коррекции и сбора cc , мы возвращаем ее обратно с темно-зеленой кодировкой.Мод 4, мы идем прямо вперед, чтобы разделить. Здесь мы сначала должны переставить стек более строго, чтобы получить две пары n и a для выполнения операций, потому что нам нужно проверить, является ли оно целым числом. Мы делаем это
mod
для первой пары, затемnot
для результата, затем используем это для apointer
- если это не делится, мы продолжаем идти прямо, что отправляет нас двумяpointer
командами в противоположный угол в неизбежный блок и, таким образом, завершает программу. В противном случае мы поворачиваем направо и получаемdivide
команду от входа в пурпурный бар.Старая версия
Очень простой код: помещает 1 и ввод в стек, затем циклически проходит четыре операции: перетасовывает индекс на вершине стека, увеличивает его на 1, дублирует, перекладывает одну копию обратно, выполняет арифметическую операцию, дублируя номер и вставляя один в вывод.
Для деления, которое является единственным, где последовательность может заканчиваться, он создает более сложный стек, чтобы сначала проверить, равен ли индекс n mod == 0, в противном случае он входит в неизбежный кодер и завершается. В противном случае он использует свою вторую копию i и n для выполнения деления.
источник
push (1) pointer
либо для черной клетки поверх цветной.C # (интерактивный компилятор Visual C #) ,
72,70, 69 байтПопробуйте онлайн!
источник
Рубин ,
56 5452 байтаПопробуйте онлайн!
После некоторых (неудачных) попыток
eval
я обнаружил, что самым удачным решением является сборка массива из 4 элементов одновременно, по крайней мере, в ruby.Спасибо Арно за -2 байта.
источник
R ,
90 байтов ,73 байта87 байтов85 байтов80 байтов74Простая реализация правил:
Попробуйте онлайн!
со
T<13
следующим из более глубокого анализа головоломки. Действительно, существует только три вида последовательностей: последовательности длиной 4, когда a⁰ не совпадает с 1 по модулю 8; длины 12, когда a⁰ конгруэнтно 21 по модулю 32; и длины 8 для остальных случаев.Альтернативный код, избегающий циклов, оказывается длиннее с 87 байтами:
Попробуйте онлайн!
источник
{}
для -2 байтов.length
.Haskell ,
1048685 байтПопробуйте онлайн!
h=
Могут быть опущены , так как он используется только для тестирования.Ах, код гольф, где квадратичное увеличение сложности времени стоит того, чтобы уменьшить одного персонажа.
104 байта
Попробуйте онлайн!
Мне больше нравится этот ответ, но, увы, он длиннее.
источник
Japt ,
2524 байтаЕще одна адаптация решения Ruby от GB .
Попытайся
Основной трюк здесь заключается в перегрузке
c
метода для массивов. Передайте ему другой массив в качестве аргумента, и он объединит его с исходным массивом. Передайте ему число в качестве аргумента, как это происходит при последнем рекурсивном вызове, и он выравнивает исходный массив на столько уровней -1
в данном случае после округления. Но, поскольку массив имеет глубину всего один уровень, выравнивание не оказывает никакого влияния.источник
Java 8, 84 байта
Попробуйте онлайн.
Создание массива со всеми четырьмя значениями вдохновлено ответом Ruby от @GB , хотя теперь я заметил, что использование троичного оператора if - это то же количество байтов:
Попробуйте онлайн.
источник
Perl 5 , 53 байта
Попробуйте онлайн!
источник
Красный , 102 байта
Попробуйте онлайн!
источник
AWK , 57 байт
Попробуйте онлайн!
источник
Рутгер , 310 байт
Попробуйте онлайн!
Пришло время снова использовать Рутгер. К сожалению, это может быть не самый лучший язык для этой задачи, так как он не имеет формы
eval
, заставляя меня использовать четыре оператора ifКак это работает
Как работает Рутгер
Краткое предисловие о том, как работает язык: все является либо назначением, либо функцией, и каждая функция принимает ровно один аргумент. Для операций, которые требуют более одного аргумента (например, умножение), первый вызов возвращает частичную функцию , которая при повторном вызове со вторым аргументом возвращает ожидаемый результат. Например:
распечатает 30: Попробуйте онлайн! , Хотя обычно это длиннее, чем обычная альтернатива, она может иногда сохранять байты, если функция вызывается повторно с одним постоянным аргументом и одним изменяющимся аргументом, например, при распечатке таблиц времени.
Это правило с одним аргументом применяется ко всему, что не является константой или переменной, включая циклы и условные выражения. Однако, циклы и условные (
For
,Each
,While
,DoWhile
,If
иIfElse
) являются выполнимыми , а это означает , что для того , чтобы фактически запустить их,Do
функция должна быть вызвана (см последней строки в ответе). Опять же, это может сохранить байты при многократном запуске одного и того же цикла или позволить вам запустить произвольный код между определением и выполнением циклов.Наконец, есть три способа обращения к переменным, каждый из которых используется в этой программе. Первый - это прямая ссылка , где перед именем переменной стоит
$
символ. Это напрямую обращается к значению переменной и возвращает его. Второе - это функциональные ссылки , которые не имеют префиксного символа. Это позволяет коду различать (потенциально частичные) функции, назначенные переменным, и фактические переменные, содержащие определенное значение. Наконец, косвенная ссылка с префиксом@
символа создает переменную (если она еще не существует) и возвращает объект переменной в заданной области видимости. Это позволяет вам создать переменную цикла (например,i
вfor i in range(...)
).Как работает настоящее решение
Вот негольфированный код:
Попробуйте онлайн!
Как видно, она начинает путем присвоения трех переменных
n
,e
иa
, которые представляют собой входные данные , изменяющийся элемент в последовательности, и число модификации для каждого нового элемента соответственно. Затем мы создаем цикл while:{
}
m
e % m
Далее мы подходим к абсолютному чудовищу, состоящему из тела цикла while:
x
Первый оператор печатает каждую итерацию последовательности перед ее изменением. Затем мы создаем частичную функцию для проверки равенства с переменной цикла
x
и встречаемся с четырьмя операторами if. Каждый оператор проверяет , еслиx
равно 1, 2, 3 или 4 соответственно, а затем назначаютk
для каждой функции в*
,+
,-
и/
, затем делает его в частичную функцию с вe
качестве аргумента. Наконец, мы относимe
кk
работать с вa
качестве второго аргумента и приращенияa
.источник
Рубин , 52 байта
Попробуйте онлайн!
источник
i=0
и используйте float в качестве аргумента функции.C (лязг) , 80 байтов
Попробуйте онлайн!
Благодаря многим улучшениям @ceilingcat.
источник
dzaima / APL,
3433 байтаПопробуйте онлайн!
-1 благодаря ngn
источник
TI83 / 84 BASIC, 69 байт
Мы установили счетчик в A и очистили L1, чтобы мы могли использовать его для отслеживания последовательности. Затем мы повторяем, пока шаг деления не вызовет дробь. Внутри цикла мы сначала сохраняем N в списке. Сохранение до одного элемента после конца списка или пустого списка создает этот элемент, поэтому это хранилище добавляет результат деления, когда оно не вызывает дроби, и инициализирует список во время первого прохода. Затем мы используем добавление, чтобы добавить следующие 3 условия последовательности. Математика отрабатывает на несколько байтов меньше, вычисляя член A4k + 3 в переменной O, а затем основывая A4k + 2 и A4k + 4 на O. Затем мы делаем деление отдельно, чтобы сбросить N для повторной проверки и добавить 4 к A.
Я поставил Disp L1 в конце, но я не уверен, насколько он идеален, потому что нет хорошего способа разместить все термины на экране. Реально пользователь будет выполнять L1 после запуска программы вручную, чтобы прокрутить результаты.
источник
Древесный уголь , 29 байт
Попробуйте онлайн!Ссылка на подробную версию кода. Объяснение:
Введите начальное значение.
Повторяйте, пока значение больше не будет целым числом.
Выведите значение в отдельной строке.
Рассчитайте четыре доступных арифметических действия и выберите правильную в зависимости от текущего номера строки вывода.
источник
Python 3 ,
7876 байтПопробуйте онлайн!
Принимает input как список из 1 элемента и рекурсивно добавляет следующий элемент последовательности, пока он не будет целочисленным.
В случае если ввод данных в качестве списка не разрешен, здесь очень быстро исправленная версия, которая принимает ввод как int.
Вводится как целое число, 102 байта
Попробуйте онлайн!
+2 байта благодаря тому, что я забыл назвать рекурсивную функцию ...
-4 байта благодаря Джитсе
источник
f=
в свой основной код. Тем не менее, вы также можете сохранить 4 байта, так какn[-1]
иlen(n)
не должны быть в скобках. Попробуйте онлайн!n[:-(n[-1]%1>0)]or f...
сэкономил бы байтпрут , 164 байта
Хорошо, это было действительно ужасно писать.
Ограничения:
returns
! Вы либо выводите, либо не выводитеwhile
петель. Вы должны использовать рекурсию или ничегоset
тегаbreak
,continue
,goto
или аналогичный. Это делает цикл невозможным для использования.for ... in ....
и он проходит по всем элементам массива без возможности остановки.Все это сделало код массивным!
Эй, я даже сделал это дольше, чем ответ Java!
Это так долго, как ответ @ Arnauld's JavaScript ! ... Со всеми 3 альтернативами в сочетании.
Вот код:
Вы можете примерить это на https://twigfiddle.com/zw5zls
Как использовать:
Просто импортируйте файл и вызовите первый макрос.
Чтобы иметь пригодный для использования массив, вы можете сделать
a.a(21)|split(',')
.Ungolfed:
Должно быть легко читаемым.
Этот негольфированный ответ НЕ даст правильного результата, так как он выбрасывает случайные пробелы.
Он существует просто для того, чтобы быть читаемым человеком.
источник