Найкоротший код для отримання нескінченного виводу


121

Напишіть найкоротший код, який можна створити нескінченний вихід.

Це все. Ваш код буде дискваліфікований, лише якщо він перестане виробляти вихід у певний момент. Як завжди в коді гольф, виграє найкоротший код.

Ось список відповідей, які я вважаю справді розумними, тому вони можуть отримати кредит:

Таблиця лідерів


118
Усі відповіді дискваліфікуються, оскільки в якийсь момент Земля буде проковтнута сонцем, а в якийсь момент Всесвіт загине: P
Дверна ручка

17
Чи враховується "нескінченність, поки комп'ютер не вийде з ладу"? <_ <
Ізката

5
Якщо я пишу моє в Piet , чи можу я рахувати пікселі тексту, які використовуються інші програми? Я вважаю, що найменша програма, що повторюється, складе 6 пікселів. Це перемагає Befunge, якщо пікселі "off" все ж рахуються.
DampeS8N

9
@Izkata Отже, будь-яка відповідь, що збиває ваш комп’ютер, також дозволена: D
ɐɔıʇǝɥʇuʎs

7
@Doorknob Отже, справді, завдання полягає в тому, щоб виробляти нескінченний обсяг продукції за обмежений час. Звучить досить легко.
Санчіз

Відповіді:


212

Befunge (1)

.

Виходи 0назавжди. Це працює, тому що в Befunge лінії загортаються, і ви отримуєте, 0якщо вискочите з порожнього стека.


6
Я думаю, що у нас є переможець.
прим

96
Я клянусь, що тут я десь був коротший клас Java. +1
l0b0

56
Ця одна точка тепер здобула мені більше репутації, ніж мої наступні дві відповіді разом.
marinus

3
Так ... Це не справедливо :) Давайте зробимо так: я зменшую розмір цього зображення на пару пікселів, і ми відображаємо його дуже маленьким .. Так що воно виглядає як крапка? І називати це навіть? :)
Бенджамін Подшун

4
Чому це не прийнята відповідь?
Клавдіу

101

x86 .COM Виконавчий, 7

у шістнадцятковій формі:

b8 21 0e cd 10 eb fc

Інші потребують кілобайт або більше системних бібліотек та часу виконання. Повернутися до основ:

$ echo -ne '\xb8!\xe\xcd\x10\xeb\xfc' > A.COM
$ dosbox A.COM

вихід

Ви можете змінити 2-й байт ( 0x21або !), щоб змінити вихід.

Використовує переривання BIOS для виведення; не потрібен DOS, але у мене не було налаштовано QEMU.


Пояснення

Код машини відповідає наступній збірці:

        mov     ax, 0x0e21
again:  int     0x10
        jmp     again

Вихід є у intвиклику - згідно з цим посиланням , int 0x10 з 0x0e в AH надрукує байт в AL на екрані.

Знаючи, що зареєструвати AX - це 16-бітове слово, що складається з AH у високому байті та AL у низькому байті, ми можемо зберегти додаткове навантаження (і тим самим байт у машинному коді), завантаживши їх разом.


2
Ого. Це дійсно добре
tbodt

46
мала довжина машинного коду повинна коштувати більше балів, ніж мови високого рівня.
pwned

12
Це найкоротший код у реальному розумінні.
мікробій

4
Це не тільки працює, але працює швидше, ніж усі інші записи. :)
Thane Brimhall

14
@ThaneBrimhall Який, звичайно, найважливіший критерій на сьогоднішній день для нескінченного циклу ... Якщо мій комп'ютер зависне, я хочу, щоб це було зробити найефективнішим чином!
kratenko

91

Пакетний файл Windows, 2 символи

%0

Називає себе нескінченно.


12
Друге місце, людина. Молодці. Я бачив лише одну відповідь, де його виграв Батч.
нечисте м'ясо

Це справді чудово !!!
Qwertiy

Це круто!
Патрік Перселл

Як це працює: %0не має @, тому він постійно виводить щось подібне ...> %0. Це може просто з'їсти всю оперативну пам’ять десь, хоча вона є рекурсивною.
Ерік Аутгольфер

2
@EriktheOutgolfer може ? Як це не стане крахом в якийсь момент через нескінченну рекурсію? Я не бачу, як це може тривати протягом декількох годин
phil294

68

Befunge 98 - 2

,"

Виходи ",,,,,,,,,,," на вічність.


2
Насправді дещо розумні.
tbodt

Дякую. Дивно, що "," версія виводить пробіли (або ". Виходи 32 32 32), використовуючи найбільш поширену реалізацію b98. Поняття не має, звідки це береться.
AndoDaan

1
Дуже погано, що він похований під 82 395 справді хитрими відповідями.
tbodt

7
@tbodt Добре, згідно з специфікацією, моя маленька програма має всю вічність, щоб прокласти шлях вгору. Отож ... пальці схрестили ...
AndoDaan

@AndoDaan: ", створює рядок з комами та пробілами INT_MAX-2, а потім друкує останній пробіл. Таким чином, стек заповнить пробіли
кодами INT_MAX

62

ш, 3 байти

yes

виводить yбезперервно


10
Хоча yesце зовнішній бінарний, а не частина баш (строго кажучи).
Боб

55
У баші, (майже) все є зовнішнім бінарним.
Йоганнес Кун

5
Зазвичай у вас немає псевдоніму, y=yesі якщо ваша система не езотерична, ви можете припустити, що вона yesє у вашому $PATH(див. Основні утиліти GNU ). Вашою логікою можна припустити дивні сузір'я для кожного рішення.
klingt.net

5
Так, але це не тількиbash можливості: I'ts в POSIX оболонки основна частина ядра утилітами . (Тобто: будь ласка, змініть назву для sh: 3 chars ;-)
F. Hauri

2
Як каже технозавр, у busbox це вбудований, але в sh це не так, ви повинні сказати, що sh + coreutils.
Erik the Outgolfer

42

Haskell: 8 персонажів

Стара нитка, але весела

 fix show

у Haskell він друкує

\\\\\\\\\\\\\....

назавжди, оскільки це в основному працює

 let x = show x in x

Він знає, що xце рядок, тому перший символ є ", тому цього потрібно уникати \", але знайте, що \потрібно уникати так \\\x, і так далі, і так далі.


... Ого. Тепер мені цікаво, чи fix$showбуло б естетичніше :-)
Джон Дворак

7
Оскільки для цього потрібно import Data.Function, і тому що він повертає рядок, а не друкує її, я сумніваюся у справедливості підрахунку символів. Також рядок насправді "\" \\\ "\\\\\\\" \\\\\\\\\\\\\\ "\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\ "\\\\\\\\\\\\\\\\ ...".
Anders Kaseorg

36

Пакетний файл Windows, 8 символів

:a
goto a

1
Це не дає нескінченного виходу, чи це ...?
Doorknob

38
це робиться ... без @echo off, він друкує "goto a", поки ви не закриєте його
Патрік Персел

11
нам потрібен мор БАТ тут
Ейнасіо

35
Я рахую десять символів: :a\r\ngoto aадже Windows використовує CRLF
wchargin

1
@WChargin Я щойно перевірив за допомогою шестигранного редактора. 3a 61 0a 67 6f 74 6f 20працює на моїх Windows 8 ...: P
YoYoYonnY

32

Brainfuck, 4

+[.]

Крім того,

-[.]

8
Ні, \x01ні \xFFсимволи для друку. Я думаю, це не було вимогою, хоча: - /
Джон Дворак

Спосіб зробити його виведення символів для друку буде замінити + на, це означає, що він вимагає введення, хоча
Prismo

31

Java, 54 символи

Найкраща спроба на Java:

class A{static{for(int i=0;i<1;)System.out.print(1);}}

7
Функціональний, відповідає правилам, гольф. Цікаво, чому це було знижено.
манастирство

14
Чи забороняє Java класичний for(;;)візерунок? Про що while(true)?
CodesInChaos

17
@CodesInChaos, Java зазвичай не забороняє ці зразки, і зазвичай я вважаю їх більш чистими та ідіоматичними. Тут ми намагаємось пропустити нескінченний цикл повз компілятор (ці форми змушують компілятор скаржитися на відсутність статичного {} блоку).
Річ Сміт

2
@Mechanicalsnail Так, статичні блоки не можуть виконуватися поодинці з java 7.
Fabinout

1
@OliverNi Але ви не можете використовувати staticблок.
Okx

30

Bash, 4 байти

$0&$

Виходи ./forever2.sh: line 1: $: command not foundбезперервно.

Оскільки у $0фоновому режимі кожен батько помирає після недійсної команди $, тому стек / пам'ять не з'їдається, і це має тривати нескінченно.

Дивно, але вихід стає повільнішим і повільнішим з часом. topповідомляє про те, що використання системного процесора близько 100%, але є процеси пам'яті чи процесора. Імовірно, деякий розподіл ресурсів у ядрі стає менш ефективним.


2
можливо поведінка stdout чи подібного ...
masterX244

1
звільнення ресурсів конкурує з процесами розгортання / Щоб зупинити його, ви не можете вбити процес, оскільки PID змінює єдиний спосіб зупинити його - перейменувати сценарій, так що він $0не вдається.
Еммануїл

29

ЛОЛКОД (36)

HAI IZ 1<2? VISIBLE "0" KTHX KTHXBYE 

Думав, я б дав LOLCODE знімок, має напрочуд великий обсяг функціональності.


2
Не потрібно питати про stdio.
кіт

У версії реплікації LOLCODE вам не потрібно HAIіKTHXBYE
MilkyWay90

24

JavaScript: 14

ПОПЕРЕДЖЕННЯ: Ви дійсно не хочете запускати це у своєму браузері

for(;;)alert()

31
Просто встановіть прапорець "Захистити цей сайт відкривати більше діалогів".
Йоганнес Кун

1
@JohannesKuhn не перевіряйте цього, і вам потрібно перезавантажити
Ілля Газман

8
Або просто нічого не робити, і це не відображає подальших результатів.
Йоганнес Кун

щойно біг alert()дає мені цю помилкуError: Not enough arguments [nsIDOMWindow.alert]
Клайд Лобо

3
Це дійсно нескінченний вихід, коли процес блокується і виконання зупиняється до взаємодії гуманоїдів?
Morten Bergfall

24

Машина Тьюрінга - 6 персонажів:

#s->1Rs

де #порожній символ (на стрічці за замовчуванням), sописує єдиний існуючий (стартовий) стан, 1друкує цифру, Rозначає зміщення вправо, sв кінці залишається в тому ж стані.


3
Я рахую 7 символів !?
Ф. Хаурі

9
У, можливо, найпоширенішій позначці з 5-ти кордонами це може бути написано просто як 5 символів s#1Rs(поточний стан, поточний-символ, символ-для запису, напрям-до-зрушення, наступний стан).
res

19

Хаскелл, 10

print[1..]

Я думаю, що це найкоротший код

  1. Щось надрукуйте.
  2. Створіть нескінченну Showздатну структуру даних.

Для зацікавлених він друкує:

[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,...

4
Чи є якась причина, що ви вибрали магічне число 32, щоб зупинитися?
ike

12
Це здавалося приємним і круглим, він також максимально добре заповнив простір блоку коду, не потребуючи наступного рядка.
shiona

2
Якщо машина має обмежений об'єм пам'яті, вона може закінчитися, коли ціле число зросте занадто величезним, щоб зберігати в пам'яті?
Джеппе Стіг Нільсен

3
@JeppeStigNielsen Так. Однак ціле число, яке заповнило б навіть один мегабайт пам'яті, було б 2 ^ (2 ^ 20), або близько 6,7 * 10 ^ 315652. До цього гігабайт пам'яті і число стане 2 ^ (2 ^ 30), монстр з майже півмільярда цифр. Я цілком впевнений, що якби ми спробували надрукувати серію, тепла смерть Всесвіту вдарила б нас до того, як пам’ять вичерпалася. І несправність жорсткого диска до цього.
shiona

5
У коментарях під ОП зазначається, що «нескінченна до моменту аварії на вашому комп’ютері» також вважається.
11684

19

Марбельний 4

24MB

Марбелус тут дивно добре. Це опублікує нескінченну кількість знаків долара $, хоча це досягне межі стека досить швидко.

Як це працює.

24 - це літеральна мова, яка випаде з дошки та буде надрукована в STDOUT як її відповідний символ ascii. MB - ім’я, яке імпліцитно вказано на головній платі, оскільки основна плата не має входу, вона запустить кожну галочку. А оскільки комірки оцінюються зліва направо, то буквальний завжди буде надруковано перед наступним рекурсивним викликом.

Отже, це грубо еквівалентно цьому псевдокоду:

MB() {
    print('$');
    while(true) MB();
}

Розчин без нескінченної рекурсії 11

24@0
@0/\..

Цей працює, перемикаючи буквально між двома порталами @0, щоразу, коли 24 потрапляє на нижній, @0він переноситься до комірки під верхнім @0. Це земля на /\, який є оператором-клоном, він кладе одну копію мармуру (буквально) ліворуч (назад на порталі) та іншу праворуч. Потім цей coopy падає з дошки (оскільки ..це порожня клітинка) і надрукується в STDOUT. У псевдокоді це перекладається на:

MB() {
    while(true) print '$'
}

Більш короткий розчин без нескінченної рекурсії 9

24
\\/\..

Цей постійно підкидає мармур між клонером і дефлектором, поклавши одну копію на крайню праву клітинку, щоб її скинути з дошки. У псевдокоді це буде виглядати приблизно так:

MB() {
    List charlist = ['$'];
    while(true) {
        charlist.add(charlist[0];
        charlist.add(charlist[0];
        charlist.pop();
        print(charlist.pop());
        // Wait, what?
    }
}

Примітка

У ..клітинах необхідні на два останніх платах , так як мармур приземлиться з дошки (і бути відкинутий) в іншому випадку. Для додаткової забави ви замінюєте 24мармур на, FFа порожню ..клітинку на a ??, яка перетворює будь-який мармур у мармур між 0 і його поточним значенням, перш ніж скидати його. Здогадайтесь, як це виглядатиме на STDOUT.


зробіть свій "/ \ / \" "\\ / \", щоб уникнути створення зайвого мармуру з лівого краю? суто естетичне вдосконалення.
Спарр

@Sparr, точка прийнята, я відредагував пост.
суперактор

5
Чи не повинно це рішення бути 25165824 байт (24 МБ)? ; P
HyperNeutrino

18

C, 23 символи

Трохи коротший, ніж найкращий відповідь C / C ++ на даний момент. Друкує порожні рядки нескінченно (але якщо їх складено без оптимізацій, переповнює стек).

main(){main(puts(""));}

1
22 символи: putc(0)(або 1, або 2, ..., або 9). Це би спрацювало?
CompuChip

@CompuChip, putcвимагає 2 параметра.
ugoren

10
@tdbot, Просто зауважте, що це прийнята відповідь. Я ціную комплімент, але не можу зрозуміти, чому. Там, очевидно, коротша відповідь
ugoren

@tbodt, не tdbot. ftfy
nyuszika7h

5
@ nyuszika7h, таким чином я міг би показати, наскільки я скромний, тримаючись за 15 представників.
угорен

14

Python 3: 15, 17 або 18 символів

Відповідь mdeitrick довша в Python 3, який замінює printоператор викликом функції (15 символів):

while 1:print()

Це залишається найкоротшим, що я виявив у Python 3. Однак є кілька більш цікавих способів друку у нескінченному циклі, який лише на кілька символів довший.

  • print()повертає None, що! = 9, роблячи це нескінченним циклом; the 8no-op, що замінює pass(18 символів):

    while print()!=9:8
    
  • iter(print, 9)визначає ітерабельний, який повертає результат до print()тих пір, поки він не дорівнює 9(що ніколи не відбувається). anyспоживає вхідний ітерабельний пошук справжнього значення, яке ніколи не надходить, оскільки print()завжди повертається None. (Ви також можете використовувати setтой же ефект.)

    any(iter(print,9))
    
  • Або ми можемо спожити споживач, перевіривши, чи містить він 8(17 символів):

    8in iter(print,9)
    
  • Або розпакуйте його за допомогою оператора splat :

    *_,=iter(print,9)
    
  • Дивний спосіб , яким я думав , що це використовувати пейнтбольні деструктурірующій у виклику функції function(*iterable). Здається, що Python намагається спожити весь ітерабельний, перш ніж навіть спробувати виклик функції - навіть якщо виклик функції невірний. Це означає, що нам навіть не потрібна реальна функція, оскільки помилка типу буде видана лише після вичерпання ітерабельного (тобто ніколи):

    8(*iter(print,9))
    

*iter(print,1),працює і має лише 15 символів, але споживає зовсім небагато пам'яті.
ivzem


14

x86 .COM Виконаний, 5 байт

нескінченний вихідний діапазон ASCII

у шістнадцятковій формі:

40 CD 29 FF E6

в зоні:

inc ax
int 0x29
jmp si

Пояснення:

inc axзбільшує регістр AX на одиницю. int 0x29є рутином MSDOS "швидкого постачання", який просто виводить значення в AL (нижня частина AX) і просуває курсор на одиницю. jmp siце просто дивний спосіб повернутися до вершини, оскільки реєстр SI становить 0x100 майже на кожній DOS-подібній операційній системі, де також починається програма .com;) Також можна зробити замість цього короткий стрибок, який також використовує 2 байти.

Джерела:

Початкові значення MSDOS

Розмір кодування WIKI


13

Bitxtreme , 0,25 байт

Бінарне представництво:

00

З документації:

Перший біт кожної пари - це вказівник на положення пам'яті, яке містить значення для віднімання від акумулятора. Результат зберігається в тому самому положенні пам'яті, на яке вказує операнд. Якщо результат негативний (біти є у складі двох доповнень), то другий біт пари буде доданий до поточного ПК, модуль 2.

Лічильник програми та акумулятор ініціалізуються до нуля; потім у акумулятора віднімається вміст місця пам'яті 0. Це буває 0, а акумулятор залишається на нулі. Оскільки перенесення не було, другий біт не додається до лічильника програм.

Потім лічильник програм збільшується на 2 модуля 2, повертаючи його до початку і викликаючи нескінченний цикл. На кожному кроці спеціальне місце пам'яті 0 змінюється, в результаті чого його вміст (a 0) записується до виводу.

Можна стверджувати, що цю програму слід оцінювати як 1 байт, оскільки офіційний перекладач у Python вимагає нульового набивання. Однак, я не думаю, що нульова накладка справді є кодом .


12

Короткий зміст: Ruby - 9, Golfscript - 6,> <> - 2, Whitespace - 19, Perl - 2

Я знаю одну мову, і дві, яку я ніколи не використовував раніше: D
EDIT: Perl не працював, коли я встановив Perl, щоб спробувати :(

Рубі, 9

loop{p 1}

Просто друкуйте 1 на окремих лініях постійно.

Також купа альтернатив:

loop{p''} # prints [ "" ]  on separate lines continually
loop{p p} # prints [ nil ] on separate lines continually

10-карткове рішення:

p 1while 1

Мене насправді здивувало, що я можу прибрати простір між першим 1і тим while, але, мабуть, це працює

Гольфскрипт, 6

{1p}do

Моя перша програма Golfscript! : P

> <> ( Риба ), 2

1n

Пробіл , 19

lssslssstltlsslslsl

Де sпредставляє пробіл, tпредставляє вкладку та lпередачу рядків.


11
Кожного разу, коли хтось набирає слова: "У мене немає Perl", Бог вбиває кошеня.
прим

2
@primo: P Ну принаймні зараз я.
Дверна ручка

2
Це код гольфу. Створіть одну відповідь на кожне подання.
JB

21
@primo Добре, я ненавиджу котів. І я не маю Perl.
SQB

5
Програма GS {1p}doтільки друкує 1і закриває, тому що do є послідовністю exec-pop-test, яка продовжується, лише якщо вона перевіряє правду. (Оскільки вводу немає, спочатку стек "", який після виконання 1p, вискакує і перевіряє хибність.) Однак, просто додавання копій буде працювати, тобто {1.p}do(у 7 байт).
res

12

С, 25 24

main(){main(puts("1"));}

4
s/while/main/
угорен

2
Я не впевнений, що в C є виняток stackoverflow, але щось погане відбудеться, коли у вас не вистачить пам'яті.
Ілля Газман

9
Оптимізація Tailcall ftw.
Йоганнес Кун

4
@JohannesKuhn: це не хвостик. Якби це було return main(puts("1"))тоді, це був би хвіст.
marinus

4
@psgivens. Функція ca без будь-яких параметрів може приймати будь-яку кількість параметрів. Тільки підпис methodName(void)приймає точно нульові параметри.
Джеймс Вебстер

12

> <> (Риба) , 2

Творчий спосіб використання нескінченного кодового коду риб:

"o

Оскільки вказівник інструкції повертається назад до початку рядка після досягнення кінця, цей код по суті може бути прочитаний як

"o"o

що означає "прочитати рядок" o ", а потім вивести його".

Ви можете перевірити код тут


11

perl, 10 символів

Ось ще 10 принципових рішень з різними вигідними рішеннями. Зокрема, для запуску не потрібен прапор -n або введення користувача. Однак це все-таки їсть пам’ять ad infinitum.

warn;do$0

збережіть у файл, виконайте цей файл, і ви отримаєте, наприклад:

Warning: something's wrong at /tmp/foo.pl line 1.
Warning: something's wrong at /tmp/foo.pl line 1.
Warning: something's wrong at /tmp/foo.pl line 1.

Чи не могли ви зробити це коротше, використовуючи say(який завжди друкує новий рядок, навіть якщо він не може знайти аргумент з будь-якого місця), а не warn? (Для цього потрібно вибрати сучасний варіант Perl, використовуючи -M5.010, але це не


10

VBA: 12

Звук виводиться, правда?

do:beep:loop

Помістіть це в улюблений файл MS Office з улюбленим макросом, який підтримує макрос, для деякої «забави»!

Private Sub Workbook_Open()
    Do:Beep:Loop
End Sub

Бонусні бали, якщо вони використовують навушники.


Данг, я переглядав відповіді, щоб побачити, чи хтось ще думав надрукувати дзвіночку. +1
mbomb007

9

Насіння , 4 байти

99 5

Спробуйте в Інтернеті! Виводи 11нескінченно

Створює таку програму Befunge-98:

[glzgx"Lz^v*M7TW!4:wi/l-[, s44~s;|Sa3zb|u<B/-&<Y a@=nN>Nc%}"gq!kCW $1{2hyzABRj*glr#z(@Zx@xT=>1'.b
/

Спробуйте в Інтернеті!


Відповідна частина полягає лише в цьому:

[>1'.b
/

bпритискає 11до стопки і .друкує її. 1і 49їх також висувають до стека, але ніколи насправді не друкують.

Анімація запущеного коду:

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


1
Чи не закінчиться це в кінцевому підсумку, якщо значення постійно висуваються на стек, не висуваючись?
caird coinheringaahing

8

C, 26 25 24 (без рекурсії)

main(){for(;;puts(""));}

Друкує нескінченні '\n'символи. Це байт довший, ніж найкоротший відповідь C, але не покладається на оптимізацію хвостових викликів, щоб уникнути переповнення стека.


2
Ви можете поголити персонажа, скориставшись for(;;)замістьwhile(!
Алекс Гіттемейер

1
ні, !як це продовжує виводити\n
l4m2


7

PowerShell 2.0: 17 11 8

Моє початкове рішення:

while(1 -eq 1){1}

Спасибі:

while(1){1}

Я думаю, що Данько Дурбич має тут переможця. Я навіть не впевнений, чому це має працювати, але це так, і поки що я не можу придумати щось коротше.

for(){1}

1
Спробуйте while(1){1}.
res

@res Я збирався обрізати його двома, while($true){1}але ваше рішення безумовно виграє - я забув це в PowerShell $true -eq 1. Опублікуйте це як відповідь, і я дам вам голос.
Іссі

Не соромтесь редагувати його у своєму, якщо вам подобається.
res

6
Спробуйте for(){1}.
Данько Дурбич

@ DankoDurbić Чи можете ви пояснити, чому це працює? Я не зовсім розумію. Здається, це має помилитися для мене.
Іссі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.