Распечатать все целые числа


48

Напишите программу или функцию, которая будет достоверно печатать все целые числа ровно один раз, учитывая бесконечное время и память.

Возможные результаты могут быть:

0, 1, -1, 2, -2, 3, -3, 4, -4, …

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -2, -3, -4, -5, -6, -7, -8, -9, 10, 11, …

Это неверный вывод, так как он никогда не будет перечислять отрицательные числа:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,…

  • Выходные данные должны быть в десятичном формате, если только ваш язык не поддерживает десятичное целое число (в этом случае используйте естественное представление целых чисел, которое использует ваш язык).

  • Ваша программа должна работать с числами с наибольшей величиной стандартного целочисленного типа вашего языка.

  • Каждое целое число должно быть отделено от следующего с помощью любого разделителя (пробел, запятая, перевод строки и т. Д.), Который не является ни цифрой, ни отрицательным знаком вашего языка.

  • Разделитель не должен меняться в любой точке.

  • Разделитель может состоять из нескольких символов, если ни один из них не является ни цифрой, ни знаком минус (например , так же, как и просто ,).

  • Любое поддерживаемое целое число должно в конечном итоге быть напечатано через некоторое время.

счет

Это , поэтому выигрывает самый короткий ответ в байтах

Leaderboard


3
Если наш язык поддерживает бесконечные списки, можем ли мы вывести список из функции вместо печати? (Вызов print в таком списке будет печатать его элементы по одному навсегда.)
xnor

5
Я чувствую, что требование к целым числам произвольного размера не делает ничего, кроме как отговорить языки без участия таких целых чисел. Они либо должны иметь импорт, который могут использовать, либо решать совершенно другие задачи, чем все остальные.
xnor

2
@xnor Изменен, хотя такие руины само название проблемы.
Роковой

5
@xnor, языки с произвольными целочисленными значениями точности по- прежнему должны решать проблемы, отличные от всех остальных, поэтому все, что удалось сделать, это сделать эту проблему скучной тривиальной во многих языках.
Питер Тейлор

2
@PeterTaylor Да, это неудачно. Решения для обертки не чувствуют меня так, как будто печатают какие-либо негативы, но я не вижу способа точно указать разницу, когда речь идет о представлении.
xnor

Ответы:


19

Sesos , 11 3 3 байта

0000000: c4ceb9                                            ...

Попробуйте онлайн! Проверьте Debug, чтобы увидеть сгенерированный код SBIN.

Сесос сборка

Двоичный файл выше был сгенерирован путем сборки следующего кода SASM.

set numout

jmp ; implicitly promoted to nop
    put,   fwd 1
    sub 1, put
    rwd 1, add 1
; jnz (implicit)

как это 3 байта?
Надеюсь, что это было

1
В файле readme на GitHub (ссылка в шапке) подробно объясняется, как кодируются инструкции.
Деннис

1
6 шестнадцатеричных цифр / 2 = 3 байта @HopefullyHelpful
Стэн

@StanStrum спасибо
надеждой на

47

Haskell, 19 байтов

do n<-[1..];[1-n,n]

Производит бесконечный список [0,1,-1,2,-2,3,-3,4,-4,5,-5,6,-6,7,-7...

Haskell допускает бесконечные списки изначально. Печать такого списка будет печатать его элементы один раз навсегда.


2
Я люблю [n,1-n]!
16.09.16

3
ИМХО [1-n,n]даст более приятный вывод.
Нил

@ Нил, я согласен, изменил это.
xnor

2
Ах, это монадезе concatMap (\n -> [1-n, n]) [1..], верно? Приятно!
Карстен С.

@CarstenS Да, именно так.
xnor

29

Brainfuck, 6 байтов

Это использует обтекание ячейки и печатает все возможные значения. В Brainfuck нативное целочисленное представление является байтовым значением .

.+[.+]

Попробуйте онлайн!


2
Хорошо, это самый короткий ответ Brainfuck, который я когда-либо видел на PPCG.
Кевин Круйссен,

1
Это не будет работать для версий мозгового штурма с неограниченными ячейками. Пожалуйста, исправьте (даже если в качестве отдельного ответа)
Джон Дворак

16
@JanDvorak Ответы не должны работать в каждой реализации, только в любой из них.
Мартин Эндер

7
Могу ли я получить объяснение, почему это действительно? Здесь нет разделителей, как указано в вопросе, и нет негативов. А также тот факт, что вы можете выводить значения больше, чем 9 в Brainfuck. Я неопытный в Code Golf и начал работать над чем-то, что выводило отрицательные и положительные значения до больших чисел, прежде чем взбодриться.
gtwebb

5
@SQB Даже с неограниченной памятью нативный тип целых чисел по-прежнему 8 бит. В Java intвнезапно нет больше или меньше битов только потому, что вы добавили или удалили некоторый оперативный памяти.
flawr 17.09.16

26

Cubix , 14 12 байтов

.(.\OSo;?.>~

Проверьте это онлайн! Теперь вы можете регулировать скорость, если хотите, чтобы она работала быстрее или медленнее.

Как это устроено

Первое, что делает интерпретатор, это удаляет все пробелы и дополняет код no-ops .до тех пор, пока он полностью не уместится на кубе. Это означает, что приведенный выше код также может быть написан так:

    . (
    . \
O S o ; ? . > ~
. . . . . . . .
    . .
    . .

Теперь код запускается. IP (указатель инструкций) начинается в верхнем левом углу крайне левого лица и указывает на восток. Вот пути, которые нужно пройти во время работы программы:

введите описание изображения здесь

IP начинается на красном следе в дальнем левом углу изображения. Затем он запускается OSo;, что делает следующее:

  • OВыведите TOS (верхнюю часть стопки) как целое число. В начале программы стек содержит бесконечные нули, поэтому он печатается 0.
  • SНажмите 32, код символа для пробела.
  • oРаспечатайте TOS как символ. Это печатает пробел.
  • ;Поп TOS. Удаляет 32из стека.

Теперь IP попадает в ?точку, которая направляет его влево, вправо или прямо, в зависимости от знака TOS. Прямо сейчас, TOS есть 0, так что все идет прямо. Это синий путь; .ничего не делает, и IP попадает в стрелку >, которая снова направляет его на восток по красной дорожке. ~принимает побитовое НЕ ТОС, изменяя его на -1.

Здесь IP достигает правого края сети, который оборачивает его обратно влево; это снова печатает TOS (на этот раз -1) и пробел.

Теперь IP попадает ?снова. На этот раз TOS есть -1; так как это отрицательно, IP поворачивает налево, выбирая зеленый путь. Зеркало \отклоняет IP-адрес (, который уменьшает TOS, изменяя его на -2. Он возвращается и поражает стрелу; ~принимает снова побитовое НЕ, поворачивая -2к 1.

Снова выводится TOS и печатается пробел. На этот раз, когда IP попадает в ?, TOS есть 1; так как это положительно, IP поворачивает направо, выбирая желтый путь. Первый оператор, с которым он сталкивается S, это нажатие лишнего 32; ;хлопает его , прежде чем он может вызвать какие - либо проблемы.

Теперь IP возвращается к стрелке и выполняет свою процедуру, ~изменяя TOS -2и Oпечатая его. Так как TOS снова отрицательный, IP снова выбирает зеленый путь. И он просто продолжает ездить так вечно *: красный, зеленый, красный, желтый, красный, зеленый, красный, желтый ..., печатая в следующем цикле:

0 -1 1 -2 2 -3 3 -4 4 -5 5 -6 6 -7 7 -8 8 -9 9 -10 10 ...

TL; DR

Эта программа неоднократно проходит через эти 3 простых шага:

  1. Выведите текущий номер и пробел.
  2. Если текущее число отрицательно, уменьшите его на 1.
  3. Взять поразрядно НЕ текущего номера.

Неразделенная версия, 6 байт

nO?~>~

Удаление разделения настолько упрощает программу, что она может поместиться в единичный куб:

  n
O ? ~ >
  ~

* Примечание : ни одна из программ не является действительно бесконечной, так как они рассчитывают только до 2 52 (где JavaScript начинает терять целочисленную точность).


4
Хорошая диаграмма! :) Вы создали это вручную или написали инструмент для его создания?
Мартин Эндер

5
@MartinEnder Спасибо! Это было вдохновлено вашими диаграммами гексагонии. Я создал это вручную; хотя я хотел бы написать инструмент для их генерации, когда у меня будет достаточно времени для этого.
ETHпродукция

18

MATL , 8 байт

0`@_@XDT

При этом используется тип данных по умолчанию MATL, то есть doubleон работает до 2^53абсолютного значения. Выход

0
-1
1
-2
2
···

Попробуйте онлайн!

объяснение

0            % Push 0
  `     T    % Do...while true: infinite loop
   @_        % Push iteration index and negate
     @       % Push iteration index
      XD     % Display the whole stack

Почему такая большая задержка перед началом печати?
Роковой

@Fatalize Я думаю, что Octave нужно перезапускать каждый раз, когда вы запускаете программу MATL в TIO, и это занимает некоторое время.
16.09.16

@Fatalize Я не уверен. Это происходит в онлайн-компиляторе, а не в автономном режиме. Я подумал, что это может быть связано с тем, что Октава разбивает на страницы вывод, но теперь я не уверен, в этом ли причина
Луис Мендо

1
Умная идея сделать, @_@XDа не @_D@Dтак, вы можете включить 0 при первом запуске.
Санчиз

3
XD+1 для смайлика
TuxCrafting

16

Язык программирования Шекспира , 227 байт

.
Ajax,.
Puck,.
Act I:
Scene I:
[Enter Ajax,Puck]
Puck:You ox!
Ajax:Be me without myself.Open thy heart.
Scene II:      
Ajax:Be thyself and ash.Open thy heart.Be me times you.Open thy heart.Be me times you.Let us return to scene II.

Очевидно, что этот ответ далеко не победил, но мне понравилось, что это тот случай использования, для которого SPL сравнительно хорошо подходит.

Разъяснение:

// Everything before the first dot is the play's title, the parser treats it as a comment.
.

// Dramatis personae. Must be characters from Shakespeare's plays, again with a comment.
Ajax,.
Puck,.

// Acts and scenes serve as labels. Like the whole play, they can have titles too,
// but for the sake of golfing I didn't give them any.
Act I:

// This scene would've been named "You are nothing"
Scene I:

// Characters can talk to each other when on stage
[Enter Ajax,Puck]

// Characters can assign each other values by talking. Nice nouns = 1, ugly nouns = -1.
Puck: You ox!                 // Assignment: $ajax = -1;
Ajax: Be me without myself.   // Arithmetic: $puck = $ajax - $ajax;
      Open thy heart.         // Standard output in numerical form: echo $puck;

// Working title "The circle of life"
Scene II:

// Poor Ajax always doing all the work for us
Ajax: Be thyself and ash.          // $puck = $puck + (-1);
      Open thy heart.              // echo $puck;
      Be me times you.             // $puck *= $ajax;  (remember $ajax==-1 from scene I)
      Open thy heart.              // echo $puck;
      Be me times you.             // negate again
      Let us return to scene II.   // infinite goto loop

Как вы можете видеть, сравнивая этот код с моим ответом на связанную задачу подсчитать навсегда (то есть вывести все натуральные числа), длина кода SPL довольно сильно возрастает при увеличении размера задачи ...


1
Мне это нравится. Это ужасно для игры в гольф, но прекрасно для чтения.
свиная рыба

Опечатка в последней строке объяснения. Let us return to scene II.должно быть scene I.
Оливер Ни

Спасибо за указание на разницу! Опечатка была на самом деле в верхнем коде: мы не должны повторять сцену I, потому что она сбрасывается $puckв 0, а затем отсчет больше не будет работать. Я добавил недостающее Iв коде и исправил длину байта (которая в любом случае была немного опа)
Christallkeks

14

Python 2, 27 байт

n=0
while 1:print~n,n,;n+=1

Печать -1 0 -2 1 -3 2 -4 3 ...


10

05AB1E , 9 6 байтов

Сохранено 3 байта благодаря Аднану

[ND,±,

Попробуйте онлайн!

Отпечатки 0, -1, 1, -2, 2 ...разделены переводом строки.


2
Я был в состоянии получить его до 6 байт , используя некоторые побитовую магию: [N,N±,.
Аднан

1
@Adnan: Хорошо! Я пытался сделать что-то подобное ранее, но не использовал, ±и это оказалось на 3 байта длиннее вашего.
Эминья,

Я знаю, что это было давно, но D,может быть заменено на, =чтобы сохранить байт.
Кевин Круйссен

10

GNU sed, 189 + 2 (флаги rn) = 191 байт

Скорее всего, это самое длинное решение, так как у sed нет целочисленного типа или арифметических операций. Поэтому мне пришлось эмулировать произвольный оператор приращения размера, используя только регулярные выражения.

s/^/0/p
:
:i;s/9(@*)$/@\1/;ti
s/8(@*)$/9\1/
s/7(@*)$/8\1/
s/6(@*)$/7\1/
s/5(@*)$/6\1/
s/4(@*)$/5\1/
s/3(@*)$/4\1/
s/2(@*)$/3\1/
s/1(@*)$/2\1/
s/0(@*)$/1\1/
s/^@+/1&/;y/@/0/
s/^/-/p;s/-//p
t

Бегать:

echo | sed -rnf all_integers.sed

Выход:

0
-1
1
-2
2
-3
3
etc.

10

Brainfuck, 127 байт

+[-->+>+[<]>-]>-->+[[.<<<]>>-.>>+<[[-]>[->+<]++++++++[-<++++++>>-<]>--[++++++++++>->-<<[-<+<+>>]]>+>+<]<<<[.<<<]>>.+.>[>>>]<<<]

Попробуйте онлайн!

Данная бесконечная лента теоретически будет работать вечно.

0,1,-1,2,-2,3,-3,4,-4,5,-5,6,-6,7,-7,8,-8,9,-9,10,-10,11,-11,12,-12,13,-13,14,-14,15,-15,16,-16,17,-17,18,-18,19,-19,20,-20,21,-21,22,-22,23,-23,24,-24,25,-25,26,-26,27,-27,28,-28,29,-29,30,-30,31,-31,32,-32,33,-33,34,-34,35,-35,36,-36,37,-37,38,-38,39,-39,40,-40,41,-41,42,-42,43,-43,44,-44,45,-45,46,-46,47,-47,48,-48,49,-49,50,-50,51,-51,52,-52,53,-53,54,-54,55,-55,56,-56,57,-57,58,-58,59,-59,60,-60,61,-61,62,-62,63,-63,64,-64,65,-65,66,-66,67,-67,68,-68,69,-69,70,-70,71,-71,72,-72,73,-73,74,-74,75,-75,76,-76,77,-77,78,-78,79,-79,80,-80,81,-81,82,-82,83,-83,84,-84,85,-85,86,-86,87,-87,88,-88,89,-89,90,-90,91,-91,92,-92,93,-93,94,-94,95,-95,96,-96,97,-97,98,-98,99,-99,...

несжатого

+[-->+>+[<]>-]>-->+
[
  [.<<<]>>-.>>+<
  [[-]>[->+<]
    ++++++++[-<++++++>>-<]>--
    [++++++++++>->-<<[-<+<+>>]]>+>+<
  ]<<<
  [.<<<]>>.+.>
  [>>>]<<<
]

9

ShadyAsFuck , 3 байта

FVd

Объяснение:

F     prints the current cell value (0) and increases it by 1
 V    starts a loop and prints the current value
  d   increases the current value and ends the loop

Это использует обтекание ячейки и печатает все возможные значения. В SAF нативное целочисленное представление является байтовым значением .


5
Этот ответ ... тенистый.
Конор О'Брайен

1
Мне было интересно, кто придумал название языка, потом я заметил, с какого языка оно происходит.
Джон Дворжак

8

R, 25 24 байта

Гольф один байт благодаря @JDL.

repeat cat(-F,F<-F+1,'')

Попробуйте онлайн!

Пример вывода:

0 1 -1 2 -2 3 -3 4 -4 5 -5 6 -6 7 -7 8 -8 9 -9 10 

2
Вы можете заменить while(1)на, repeat чтобы сохранить символ.
JDL

@JDL Спасибо! Я забыл, что конструкция существует иногда.
rturnbull

7

Пакетная, 56 байтов

@set n=0
:l
@echo %n%
@set/an+=1
@echo -%n%
@goto l

Выход:

0
-1
1
-2
2
-3

и т. д. Работает до 2147483647; 58 байт, если вы хотите (-) 2147483648 в выводе:

@set n=0
:l
@echo %n:-=%
@set/an-=1
@echo %n%
@goto l

44 байта, если вывести все поддерживаемые положительные целые числа, тогда все поддерживаемые отрицательные целые числа, а затем повторяться бесконечно, приемлемо:

@set n=0
:l
@echo %n%
@set/an+=1
@goto l

7

Java 7, 151 134 122 118 байт

import java.math.*;void c(){for(BigInteger i=BigInteger.ONE,y=i;;i=i.add(y))System.out.println(y.subtract(i)+"\n"+i);}

12 байтов сохранено благодаря @flawr@xnor косвенно)

После смены правила .. ( 59 56 63 байта)

void c(){for(int i=0;i>1<<31;)System.out.println(~--i+"\n"+i);}

Поскольку в Java 2147483647 + 1 = -2147483648мы не можем просто делать i++и продолжать бесконечно, так как задача состояла в том, чтобы напечатать все числа один раз. С учетом указанных выше кода с добавлением диапазона, то вместо этого напечатать все целые числа от -2147483648до 2147483647один раз, в следующей последовательности: 0, -1, 1, -2, 2, -3, 3, -4, ..., 2147483646, -2147483647, 2147483647, -2147483648. Спасибо @ OlivierGrégoire за указание на поведение Java в отношении MIN_VALUE-1/ MAX_VALUE+1. Попробуй это здесь.

Ungolfed & тестовый код:

Попробуйте здесь - в результате ошибки во время выполнения

import java.math.*;
class M{
  static void c() {
    for(BigInteger i = BigInteger.ONE, y = i; ; i = i.add(y)){
      System.out.println(y.subtract(i) + "\n" + i);
    }
  }

  public static void main(String[] a){
    c();
  }
}

Выход:

0
1
-1
2
-2
3
-3
4
-4
5
-5
...

1
Я думаю, что вы могли бы сэкономить несколько байтов, печатая n и 1-n одновременно, таким образом вы могли бы убрать compraision. @xnor был первым, кто использовал эту идею здесь.
16.09.16

1
Ваша intпрограмма -version, учитывая бесконечное время, будет печатать каждое целое число бесконечное количество времени.
Оливье Грегуар

1
@ OlivierGrégoire А, конечно, MAX_VALUE + 1 - это MIN_VALUE .. вздох. Я отредактировал это, спасибо за указание на это.
Кевин Круйссен,

1
Если вы хотите больше играть в гольф (например, избавиться MAX_VALUE, вы можете проверить мой ответ (вероятно, все еще на последней странице).
Оливье Грегуар

1
Ваше 53-байтовое решение - это фрагмент, а не функция или программа, и поэтому оно недопустимо.
Mego

6

DC (GNU или OpenBSD) - 16 байт

Эта версия не короче указанной ниже, но должна быть в состоянии работать без взрыва стека на вашем ПК. Тем не менее, бесконечные большие числа будут занимать бесконечные объемы памяти ... когда-нибудь ...

Из-за этой rкоманды ему нужен GNU-DC или OpenBSD-DC .

0[rp1+45Pprdx]dx

Контрольная работа:

$ dc -e '0[rp1+45Pprdx]dx' | head
0
-1
1
-2
2
-3
3
-4
4
-5

DC - 16 байтов

Немного значит теперь. ;-)

Эта версия использует длину стека как счетчик, позволяя стеку расти.

z[pz45Ppllx]dslx

Контрольная работа:

$ dc -e 'z[pz45Ppllx]dslx' | head
0
-1
1
-2
2
-3
3
-4
4
-5

DC - 17 байтов

Без подвохов.

0[p1+45Ppllx]dslx

Контрольная работа:

$ dc -e '0[p1+45Ppllx]dslx' | head
0
-1
1
-2
2
-3
3
-4
4
-5

+? для «рано или поздно ... раньше, чем вы могли бы ожидать»
Грег Мартин

2
Вместо того [-]P, чтобы делать 45P. «GNU-Dc или OpenBSD-Dc» - есть ли какие-либо другие версии, обычно встречающиеся в дикой природе?
Цифровая травма

1
У меня есть другое решение (или несколько), но они включают реальные отрицательные числа. Могу ли я опубликовать их в новом ответе? Я спрашиваю, потому что они похожи на них, так как dcимеет только несколько операторов. Я разработал их независимо от них.
Джо

@DigitalTrauma ... конечно ... оригинальный Dc не имеет / не имеет r"своп". Иногда я сбиваюсь с толку, когда смотрю на разные версии. Вероятно, никто больше не хочет кодировать в древнем Dc (и там rможно было бы очистить стек). Может быть, я бы изменил «Dc» на «AT & T dc»? ... и спасибо за 45Pподсказку ...
пропал

2
@yeti Я просто добавил "dc" в свои ответы. Я не думаю, что люди здесь слишком обеспокоены этим, особенно учитывая повсеместность "современных" вкусов постоянного тока.
Цифровая травма

6

C # 74 байта

class P{void Main(){for(var x=0m;;System.Console.Write(x+++","+-x+","));}}

class P
{
    void Main()
    {
        for(var x = 0m; ; System.Console.Write(x++ + "," + -x + ","));
    }
}

Выход:

0,-1,1,-2,2,-3,3,-4,4,-5,5,-6,6,-7,7,-8,8,-9,9,-10,10,...

Попробуй:

dotnetfiddle.net (ограничено 1000)


Разве это не фрагменты, а не функции / полные программы?
pinkfloydx33

Извините, добавлена ​​полная программа
alex

2
Вы можете опустить publicмодификаторы и сохранить 14 байтов. Значения по умолчанию будут одинаково хороши.
Алехандро

@Alejandro спасибо, это мой первый пост :)
alex

6

Рубин, 26 22 19 16 байт

Печатает числа, разделенные переводом строки. -3 байта от @manatwork. -3 байта от @ m-chrzan.

0.step{|n|p~n,n}

Здесь вы выводите числовые значения, так pчто сделайте это тоже.
Манатворк

0.step{|n|p n,~n}для 17 байтов.
m-chrzan

1
@ m-chrzan, потому что порядок не так важен, я смог побрить лишний байт, вдобавок к твоему предложению!
Value Ink

6

JavaScript, 29 26 байт

Неограниченная версия, 26 байт

Сохранено 3 байта благодаря ETHproductions

for(n=1;;)alert([1-n,n++])

отобразит все целые числа от -9007199254740991 до 9007199254740992.

Бесконечная версия (ES6), 114 112 байт

Сохранено 2 байта благодаря ETHproductions

for(n=[-1];1;alert(n[a||n.unshift(1),0]?(x=n.join``)+' -'+x:0))for(i=n.length,a=0;i--;a=(n[i]+=1-a)>9?n[i]=0:1);

будет отображать все целые числа, учитывая бесконечное время и память.


Вы можете сбросить шаблон функции и назвать ее полной программой.
Конор О'Брайен

@ ConorO'Brien - О, ты прав. Спасибо :)
Арно

n[a,b,c]возвращает n[c], так что вы можете оставить скобки в n[(a||n.unshift(1),0)].
ETHproductions

Вам не нужно 1ни в цикле for; for(;;)работает вечно Вы можете сохранить еще два байта с помощью for(n=1;;)alert([1-n,n++]). Кроме того, здесь больше не используются какие-либо функции ES6 ;-)
ETHproductions

5

> <> , 19 15 байт

1::1$-naonao1+!

Это печатает следующее:

0
1
-1
2
-2
3
-3

... и так далее. Разделитель - это новая строка.

Переписано после прочтения ответа @ xnor, чтобы использовать версию этого алгоритма. Начиная с n=1, программа печатает 1-nи n, после каждого, следует за новой строкой, а затем увеличивает ее n. После превышения максимального значения программа завершится с ошибкой something smells fishy.... Как именно это произойдет, зависит от реализации интерпретатора.


Предыдущая версия:

0:nao0$-:10{0(?$~+!

Начиная с 0, программа зацикливается бесконечно. В каждом цикле текущее значение печатается вместе с новой строкой. Затем он отрицается и увеличивается, если положительный.


Xnor однозначно "он"? Или наши бессознательные предубеждения показывают ...?
Грег Мартин

2
@GregMartin Это интересно, я не думаю, что когда-либо упоминал пол.
xnor

5

Утилиты Bash + GNU, 26

seq NaN|sed '1i0
p;s/^/-/'

Я никогда не видел, чтобы seq использовался таким образом, это похоже на ошибку? Кроме того, он начнет повторять числа после переполнения типа? Я знаю, что $[++i]делает это в Bash.
Сешумара

Похоже, более новая функция - см. Исходный код . Добавление 1 к NaN не должно вызывать переноса.
Цифровая травма

Я ушел seq NaNна пробежку, и после 999999 года печать выполняется в научной записи с точностью до 5 цифр. Что касается задачи, то это значение является наибольшим целым числом, которое вы печатаете, что хорошо, так как остальные не будут повторять предыдущее число. Также заметил, что вы можете запустить seq с infучетом регистра, как и для nan. +1
сешумара

5

до н.э., 17 16 байт

Изменить: на 1 байт меньше благодаря Digital Trauma .

В дополнение к разнообразию языков, используемых до сих пор, я представляю решение bc, которое работает с целыми числами произвольного размера . После кода требуется новая строка, которая считается в байтах.

for(;;){i;-++i}

На первой итерации iне определено, но печать дает 0, к моему удивлению.


На 1 байт короче:for(;;){i;-++i}
Цифровая травма

@DigitalTrauma Спасибо, я обновил свой ответ. Самое смешное, что я сегодня использовал эту циклическую конструкцию в своем другом ответе на bash , но забыл, что bcон тоже был.
Сешумара

Или for(;;){i++;-i}(той же длины).
Щ

5

Лабиринт , 9 байт

!`
\:"
 (

Попробуйте онлайн!

Это также работает и по сути то же самое:

 "
`:(
\!

объяснение

Поток управления в этом коде довольно забавный. Помните, что указатель инструкций (IP) в программе Labyrinth следует по пути непробельных символов и проверяет вершину стека в любом соединении, чтобы решить, какой путь выбрать:

  • Если вершина стека положительна, поверните направо.
  • Если вершина стека равна нулю, продолжайте двигаться прямо вперед.
  • Если вершина стека отрицательна, поверните налево.

Когда IP попадает в тупик, он оборачивается (выполняя команду в конце только один раз). И IP начинается в левом верхнем углу, двигаясь на восток. Также обратите внимание, что для начала стек неявно заполнен бесконечным количеством нулей.

Программа начинается с этого короткого бита:

!    Print top of stack (0).
`    Multiply by -1 (still 0).
:    Duplicate.

Теперь IP находится на соответствующем соединении и движется прямо на то, (что уменьшает вершину стека до -1. IP попадает в тупик и оборачивается. :дублирует вершину стека еще раз. Теперь вершина стека отрицательна, а IP поворачивается влево (запад). Теперь выполним еще одну итерацию основного цикла:

\   Print linefeed.
!   Print top of stack (-1).
`   Multiply by -1 (1).
:   Duplicate.

На этот раз вершина стека положительна, поэтому IP поворачивается направо (запад) и немедленно выполняет еще одну итерацию основного цикла, которая печатает 1. Затем после того , как отрицается мы снова попали в :с -1в стеке.

На этот раз IP поворачивает налево (восток). Это "просто не работает, и IP поворачивается в тупик. :делает еще одну копию, и на этот раз IP поворачивает на юг. (уменьшает значение до -2IP снова поворачивается. Поскольку вершина стека по- прежнему отрицательна, IP теперь поворачивается на запад :и выполняет следующую итерацию основного цикла.

Таким образом, IP теперь будет выполнять итерацию между итерацией в узком цикле, печатью положительного числа и итерацией, которая проходит через оба тупика, чтобы уменьшить значение перед печатью отрицательного числа.

Вы можете спросить себя, почему "во второй строке есть :знак, если он на самом деле ничего не делает: без него, когда IP достигает отрицательного значения, он не может повернуть налево (восток), поэтому вместо этого он повернет направо (запад) (Как правило, если обычное направление на перекрестке недоступно, IP будет принимать противоположное направление). Это означает, что IP также никогда не достигнет (дна, и мы не могли отличить положительные и отрицательные итерации.


Вот что я придумал, прежде чем увидел ваш ответ: pastebin.com/VHzAvABe
Роберт Хикман

5

JavaScript (ES5), 32 31 30 29 байт

for(i=0;;)[i++,-i].map(alert)

Печать 0 -1 1 -2 2 -3 3 -4 4 -5 5 ...

Сохранено 1 байт благодаря Патрику Робертсу! Сохранено 2 байта благодаря Конору О'Брайену!


1
Как насчет [i++,-i].map(alert)вместо alert(i++),alert(-i)?
Конор О'Брайен

for(;;)на один байт корочеwhile(1)
Патрик Робертс

@ ConorO'Brien map- ES6
Пол Шмитц,


Вы можете переместить i=0;бит внутри цикла for, чтобы сохранить байт.
Конор О'Брайен,

4

Java, 65 54 байта

i->{for(;;)System.out.print(i+++" "+(-i<i?-i+" ":""));

Тестовый код

public static void main(String[] args) {
    Consumer<Integer> r = i -> {
        for (;;) {
            System.out.print(i++ + " " + (-i < i ? -i + " " : ""));
        }
    };

    r.accept(0);
}

3
biggest magnitude of the standard integer type of your language intявляется стандартным целочисленным типом Java.
Шон Уайлд,

1
Извините за это, требования тем временем изменились ...
flawr

2
Вы можете ()->{for(int i=0;;)System.out.print(i+" "+(1-i++));};
сыграть в

@KevinCruijssen Это трахает промежуток ...
Шон Уайлд

1
Учитывая бесконечное время, оно будет печатать каждое целое число бесконечное число раз каждое.
Оливье Грегуар

4

C #, 83 байта

void f(){for(decimal n=0;;n++){Console.Write(n+",");if(n>0)Console.Write(-n+",");}}

Ungolfed:

void f()
{
  for (decimal n=0;;n++)
  {
    Console.Write(n + ",");
    if (n > 0) Console.Write(-n + ",");
   }
}

Выходы:

0,1,-1,2,-2,3,-3,4,-4,5,-5,6,-6.......

Есть довольно много вещей, которые можно сделать, чтобы уменьшить количество персонажей. Во-первых, вашей программе не нужно пространство имен. Во-вторых, имя класса не должно быть таким длинным. Также вы делаете два вызова console.writeline, которые могут быть упрощены для делегата. В то время как true может быть упрощено до aa for (;;), а оператор if может быть удален с выводом нулевого значения сначала через делегат.
Нико

Благодарю. Я не знал, может ли делегат "обманывать"?
Пит Арден

Привет, добро пожаловать в PPCG! Я думаю, вам может быть интересно прочитать это: Советы по игре в гольф на C # . Кроме того, вам не нужна полная программа, подойдет только функция (если задача не говорит иначе). Так void f(){code_present_in_main}что достаточно для подсчета байтов. Что касается самого кода, вы можете поиграть в него примерно так: void f(){for(decimal n=1;;)Console.Write((1-n)+","+n+++",");}( 61 байт )
Кевин Круйссен,

1
О, здорово, сейчас 85 здоровее, спасибо! Я не буду чувствовать себя правильно, используя весь ваш ответ, но это определенно улучшение, и эти советы помогут моему будущему гольфу!
Пит Арден

@PeteArden Я понимаю, что не использую мой код, так как это другой подход. Хм, вы все еще можете сыграть 2 байта в своем собственном ответе, поместив decimal n=0и n++;внутри цикл for: void f(){for(decimal n=0;;n++){Console.Write(n+",");if(n>0)Console.Write(-n+",");}}:)
Кевин Круйссен,

4

C # 86 66 байт

Новый ответ:

void b(){for(var i=0;;i++)Console.Write(i==0?","+i:","+i+",-"+i);}

Чистый:

void b() 
{
    for(var i=0;;i++)
        Console.Write(i == 0 ? "," + i : "," + i + ",-" + i);
}

Старый ответ (86 байт):

void a(){Console.Write(String.Join(",",Enumerable.Range(int.MinValue,int.MaxValue)));}

Ungolfed:

void a()
{
    Console.Write(String.Join(",", Enumerable.Range(int.MinValue, int.MaxValue)));
}

1
Есть 2 бесполезных пробела. Один до Enumerable.Rangeи один раньше int.MaxValue.
Yytsi

1
Добро пожаловать в PPCG! +1 Возможно, вам будет интересно прочитать: Советы по игре в гольф на C # . В вашем текущем ответе (-ях) скобки для цикла for могут быть удалены, поскольку внутри всего одна строка. В качестве альтернативы это более короткий подход: void f(){for(var n=1;;)Console.Write((1-n)+","+n+++",");}( 57 байт ) .
Кевин Круйссен,

@KevinCruijssen Спасибо. Браслеты ушли.
Даниэль Лерпс

4

J, 25 байт

([:$:1:`-`(1+-)@.*[echo)0

Работает на сайте , но пока не могу проверить это на компьютере. Печатает номера как:

0
1
_1
2
_2
3
_3
4

и т.п.


4

Powershell, 20 19 18 байт

Улучшено, бесстыдно крадя из ответа TimmyD

0;for(){-++$i;$i}

Выход:

0
-1
1
-2
2
-3
3
-4
4

Старая версия:

for(){-$i;$i++;$i}

Не уверен, почему переменная tbh, но - undeclared (или - $ null) оценивается как 0, что позволило нам сэкономить 2 байта в этой версии ...


1
Добро пожаловать в PPCG!
AdmBorkBork


4

Брахилог , 2 байта

ẉ⊥

Попробуйте онлайн!

ẉ     Print with a newline
      the input,
 ⊥    then try again.

Поскольку программе не дается никаких входных данных, входная переменная основного предиката остается неограниченной. Сначала предполагается, что оно равно 0, но при выполнении выполнения оно возвращается к единственно возможной точке отказа: выбору значения для входной переменной. Затем он пробует 1, -1 и любое другое целое число, печатая каждое, отделенное символами новой строки, навсегда, потому что всегда вызывает возврат, и эффект выполняется немедленно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.