Самый короткий код для получения недетерминированного вывода

83

Вы должны произвести вывод, который является недетерминированным .

В этом случае это будет определено как означающее, что выходные данные не всегда будут одинаковыми.

Правила:

  • Генератор псевдослучайных чисел, который всегда имеет одинаковое начальное число, не считается.

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

  • Идентификатор процесса вашего кода (если он не зафиксирован интерпретатором) можно считать недетерминированным.

  • Вы можете положиться на случайность в сети.

  • Ваш код не может принимать непустые данные. Связанный мета пост .

  • Программа не обязана останавливаться, но вывод должен быть отображен.

Leaderboard

mbomb007
источник
33
@ mbomb007 В C есть много вещей, которые просто "неопределенное" поведение. Любой данный переводчик может делать все, что захочет, в любой ситуации. Насколько нам известно, gcc может заказать вам пиццу, если вы попытаетесь переполнить целое число со знаком в дождливый вторник, но заставит форель выпрыгнуть из вашего экрана во все остальные дни. Таким образом, вы никогда не узнаете, детерминистичен он или нет в какой-либо конкретной реализации.
Мартин Эндер
12
@MartinEnder Я не уверен, если это имеет значение. Здесь мы определяем языки по их реализации, а не по спецификации (поскольку языки без реализации недопустимы)
Натан Меррилл
2
@MartinEnder Да, я согласен с Натаном.
mbomb007
7
Обратите внимание, что неопределенное поведение в C часто приводит к сбоям, а сбои в UNIX и Linux приводят к файлам ядра, которые содержат идентификатор процесса внутри них. Казалось бы, это соответствует вопросу, сформулированному в настоящее время.
5
Если я не понял неправильно, вопрос не задавался для кода, который использует неопределенное поведение. Он запрашивает код, который использует преимущества определенного поведения, чтобы гарантировать недетерминизм.
WGroleau

Ответы:

110

WinDbg, 1 байт

#

Вау! Никогда не ожидал 1-байтовое решение от WinDbg!

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

Образец вывода:

0:000> #
Search address set to 75959556 
user32!NtUserGetMessage+0xc
75959556 c21000          ret     10h

0:000> #
user32!NtUserGetMessage+0xf 
75959559 90              nop

0:000> #
user32!NtUserMessageCall 
7595955a 90              nop

0:000> #
user32!NtUserMessageCall+0x1 
7595955b 90              nop

0:000> #
user32!NtUserMessageCall+0x2 
7595955c 90              nop

0:000> #
user32!NtUserMessageCall+0x3 
7595955d 90              nop

0:000> #
user32!GetMessageW
7595955e 8bff            mov     edi,edi

0:000> #
user32!GetMessageW+0x2 
75959560 55              push    ebp

0:000> #
user32!GetMessageW+0x3 
75959561 8bec            mov     ebp,esp

0:000> #
user32!GetMessageW+0x5 
75959563 8b5510          mov     edx,dword ptr [ebp+10h]
молоко
источник
9
Один из лучших ответов здесь, на мой взгляд, должен победить решение «Текущая дата».
Волшебная Урна Осьминога
то, что выше, кажется бессмысленным, пошаговым началом начала работы какой-либо функции в сборке процессора Intel 386
RosLuP
60

Java 7, 33 30 27 байт

int a(){return hashCode();}

Потому что Java.

совать
источник
49
Потому что Java. Возможно, лучшее объяснение Java когда-либо.
Ф. Джордж
5
@carusocomputing Я имел toStringв предыдущей версии, но затем возвращаемый тип, Stringкоторый длиннее, чем int. Сохранить байты! :]
Poke
12
Это действительно как функция? hashCode()это сокращение здесь this.hashCode(), так что он будет работать только как метод экземпляра, а не как статический метод. В этом случае вам понадобится дополнительный код для создания объекта в вызывающей стороне. Это актуально, потому что это код для создания объекта, который отвечает за недетерминизм.
15
В Java 8: ()->hashCode()для 14 байтов. Просто говори;)
Оливье Грегуар
4
@pts Я собираюсь исходить из мета-поста, обсуждающего структуру отправки по умолчанию для постов. Функции разрешены по умолчанию, если в запросе не указано, что требуется полная программа.
Ткни
52

MATLAB, 3 байта

why

whyдает ответы практически на любой вопрос. Несколько примеров:

why
The programmer suggested it.

why
To fool the tall good and smart system manager. 

why
You insisted on it.

why
How should I know?

Это короче любой randфункции, о которой я могу думать.

Стьюи Гриффин
источник
33
MATLAB имеет встроенный для этого ? Почему?
ETHproductions
59
@ETHproductions Программист предложил это
Эдди Кертис
40

R, 1 байт

t

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

chrki
источник
36

да? 0 байт


Пустая программа все еще производит вывод. Последние строки интерпретатора Python, которые выполняются:

print "..."
f = open('Notes.txt', 'w')
f.write(time.strftime("%c") + " - The user tried to give me commands again. I still have no idea what they are talking about...\n")

В конце программы интерпретатор Python напечатает ..., затем создаст / откроет текстовый файл с именем Notes.txtи напишет строку, которая содержит текущее время впереди.

mbomb007
источник
5
Из всех вещей, которые я думал, люди будут использовать на моем GitHub, я не думал, что переводчик языка шутки будет одним из них: P
Kade
@ Kade Я собирался использовать его, чтобы ответить и на другой вопрос (самый короткий код для воспроизведения звука, только с одним байтом) - но вопрос сейчас закрыт.
mbomb007
Хотя я думаю, что это было бы неконкурентоспособным, если бы я не посмотрел на оригинальный интерпретатор .NET.
mbomb007
30

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

v
!
@

Либо печатает, 0либо ничего (50% шанс каждого).

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

Существует очень специфический случай, когда Лабиринт проявляет случайное поведение:

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

Если все эти условия выполнены, направление, в котором движется IP, выбирается (равномерно) случайным образом. Суть в том, что эти три условия невозможно выполнить в обычном потоке управления, что означает, если вы не измените исходный код во время выполнения.

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

С помощью инструкций ротации исходного кода ( <^>v) можно привести IP в эту ситуацию. Один такой пример виден сверху. IP изначально указывает на восток и начинается сверху. В vвращает текущий столбец так , что мы получаем:

@
v
!

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

Есть три другие программы, использующие это (одна, которая также печатает 0, одна, которая печатает, 00и другая, которая печатает 000):

v
@
!

"
>@!

"
>!@

(На самом деле существует гораздо больше, чем три другие программы, потому что вы также можете использовать .вместо !печати нулевых байтов или заменить "это большим количеством разнообразных команд, но я считаю, что они все работают по существу одинаково.)

Мартин Эндер
источник
30

Befunge (-93 и -98), 3 байта

?.@

?Передает исполнение в случайном направлении. Если он поднимается или опускается, он возвращается к ?и возвращается. Если он уходит влево, программа оборачивается @и, таким образом, завершает работу, ничего не печатая. Если он идет правильно, он печатает 0(вывод, полученный, .когда стек пуст), а затем выходит на @.


источник
Это не гарантировано прекратится, но я собирался опубликовать это именно так +1
Даниэль
Вы можете изменить запятую на точку, чтобы вывести 0 в виде числа вместо нулевого символа (значение ASCII 0). +1
MildlyMilquetoast
Это было .в программе, которую я использовал для тестирования, но каким-то образом стало, ,когда я скопировал его в PPCG. Исправлена.
7
@Dopapp завершает работу почти наверняка, хотя, с вероятностью 1. Я бы принял это как гарантию;)
Олифонт
@JamesHolderness Я думаю, что вы можете сделать это в 1. Не уверен, если это считается, хотя ...
MildlyMilquetoast
29

Minecraft, 5 4 байта

op 8

Используется, набрав в консоли сервера или командном блоке и предоставив ему питание. Можно запустить из интерфейса чата, добавив a /.

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

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

me @r

Отображает сообщение для всех, сообщение является именем пользователя случайного игрока. Команда opпринимает только строковый литерал, а не скрипт, который возвращает строку.

Команда meне будет действительно работать для первого примера, она будет отображаться "<your-username> 8". При запуске из командного блока это не будет детерминированным, поскольку все командные блоки имеют одно и то же «имя пользователя», но для запуска его из интерфейса чата потребуется /один дополнительный байт.

Павел
источник
Так /не входит в число байтов?
Esolanging Fruit
11
@ Challenger5 Косая черта является необязательной в командных блоках, не допускается в консоли сервера и обязательна в интерфейсе чата.
Павел
2
На самом деле, это должно быть 4 байта + 2 блока (командный блок и источник красного камня) или 6 байт
RudolfJelin
2
@RudolphJelinek Вы можете запустить его из консоли без командных блоков.
Павел
1
Другая недетерминированная опция будет helpв командном блоке, который составляет 4 байта (и не требует пиратских игр).
Pokechu22
21

sh + procps, 1 байт

w

Это самое короткое из известных мне решений, которое работает через вызов внешних исполняемых файлов. procpsявляется ответственным пакетом для сообщения информации о текущем состоянии системы ( psи друзьях) и по умолчанию устанавливается в большинстве дистрибутивов Linux; wэто команда с самым коротким именем, которая возвращает информацию о вошедших в систему пользователях, а также некоторую недетерминированную информацию, например, время работы.


источник
21

Сообщите 7, 6 байтов

x is y

Это не действительная программа Inform 7, так как ни "x", ни "y" не были определены. Так что это выдает ошибку.

Тем не менее, некоторые сообщения об ошибках в Inform 7, в том числе и это, рандомизированы. Таким образом, текст, который он печатает, технически недетерминирован.

Несколько возможных выходов включают в себя:

Проблема. Фраза «х есть у» говорит о том, что две вещи одинаковы - я читаю «х» и «у» как две разные вещи, и поэтому нет смысла говорить, что одно является другим: это все равно, что сказать что «Адамс - Джефферсон». Было бы хорошо, если бы вторым было название какого-то вида, возможно, со свойствами: например, «Вирджиния - освещенная комната» говорит, что существует нечто, называемое Вирджиния, и что это «комната», что я знаю как о, в сочетании со свойством под названием «освещенный», о котором я также знаю.

Проблема. Фраза «х есть у» говорит о том, что две вещи одинаковы - я читаю «х» и «у» как две разные вещи, и поэтому нет смысла говорить, что одно является другим: это все равно, что сказать что «Адам Ева». Было бы хорошо, если бы вторым было название какого-то рода, возможно, со свойствами: например, «Земля Нод - освещенная комната» говорит, что существует нечто, называемое Земля Нод, и что это «комната», которая вид, о котором я знаю, в сочетании со свойством под названием «освещенный», о котором я также знаю.

Проблема. Фраза «х есть у» говорит о том, что две вещи одинаковы - я читаю «х» и «у» как две разные вещи, и поэтому нет смысла говорить, что одно является другим: это все равно, что сказать что «Кларк Кент - это Лекс Лютор». Было бы хорошо, если бы вторым было название какого-то вида, возможно, со свойствами: например, «Метрополис - это освещенная комната» говорит, что существует нечто, называемое «Метрополис», и что это «комната», которую я знаю о, в сочетании со свойством под названием «освещенный», о котором я также знаю.

Проблема. Фраза «х есть у» говорит о том, что две вещи одинаковы - я читаю «х» и «у» как две разные вещи, и поэтому нет смысла говорить, что одно является другим: это все равно, что сказать что «Эсхил - это Еврипид». Было бы хорошо, если бы вторым было название какого-то вида, возможно, со свойствами: например, «Подземный мир - это освещенная комната» говорит, что существует нечто, называемое Подземным миром, и что это «комната», и я знаю это о, в сочетании со свойством под названием «освещенный», о котором я также знаю.

Draconis
источник
7
Даже сообщения об ошибках многословны!
Разрушаемый лимон
21

JavaScript, 4 байта

Date

Функция, которая возвращает текущую дату / время. Я думаю, что это самое короткое, что он получит ...

объяснение

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

В JavaScript запись функции действительна, если ее можно присвоить переменной и вызвать как функцию. Например, эта функция является допустимой записью:

function(){return Date()}

Потому что это функция, которая может быть назначена переменной, например:

f=function(){return Date()}

А затем бегите f()столько раз, сколько необходимо. Каждый раз он возвращает текущую строку даты / времени, которая была определена OP как недетерминированная.

Эта функция стрелки ES6 также действительна:

_=>Date()

Он может быть назначен с помощью f=_=>Date(), а затем запустить, f()как и другой.

Теперь вот еще одна действительная запись:

Date

Почему? Поскольку, как и две другие записи, он может быть назначен с, f=Dateа затем вызван с f(), возвращая точно то же самое, что и две другие. Попробуй:

ETHproductions
источник
1
Вам не нужно, чтобы это было Date()для вызова функции?
молоко
4
@milk Date- это функция, которая при вызове без ввода выводит текущую дату / время. _=>Date()является явно действительной записью, которая делает то же самое, так Dateи действительной записью.
ETHproductions
1
Это имеет смысл.
молоко
2
Набрав Dateна консоль JavaScript в браузере производит детерминированный вывод, он всегда производит это: function Date() { [native code] }. Вы, наверное, имеете в виду Date()6 байтов.
оч
2
если «date» выше в порядке, чем «malloc (8)» или «time (0)» также будет в порядке в C
RosLuP
12

Bash (procps-ng), 2 байта

ps

$$ это тоже решение.

Rɪᴋᴇʀ
источник
1
Если это так, wкороче и также происходит от procps.
Лиори
1
Вы отредактировали это в дубликате моего ответа .
@ ais523 Ой, прости.
августа
11

Python 2, 11 байт

print id(1)
синий
источник
1
Это тот, который я нашел. Я имел id(0), хотя. :)
mbomb007
2
Технически я победил вас, так как я являюсь ОП и нашел его до того, как опубликовал вопрос. Я не хотел публиковать вопрос и немедленно публиковать мой кратчайший ответ.
mbomb007
11

Pyth, 2 байта

O0

Объяснение:

 0 0
O  Random float in [0, 1)

Дело в том, что, когда Oимеет в 0качестве аргумента, он просто возвращает случайное значение с плавающей запятой между 0и 1, исключая.

Давайте сделаем это просто ради этого!

Кроме того, кажется, что это может быть что-то вроде ретро (спасибо 34718 / mbomb007):

Дилберт: 8 сентября 1992 г.


Pyth, 2 байта

OT

Объяснение:

 T 10
O  Random integer in [0, 10]

Попробуйте вместо этого версию boooooooooooooooring>:(

Эрик Outgolfer
источник
10

PowerShell, 4 2 байта

(зачеркнуто 4 по- прежнему выглядит как 4 )

ps

Это псевдоним для Get-Process которого будет выведен текущий список процессов в виде таблицы, включая дескрипторы, личную память, время процессора и т. Д.

Выполните это через что-то вроде следующего:

C:\Tools\Scripts\golfing>powershell.exe "ps"
AdmBorkBork
источник
1
Я должен признать, я проверил, было ли это фактически вычеркнуто. Вы действительно не можете даже сказать.
Carcigenicate
@Carcigenicate Я могу сказать, если он пересекается без выделения текста (Ubuntu 16.04.1, Chrome 54.0.2840.100).
Эрик Outgolfer
Видно и на
андроиде
Это выглядит хорошо в приложении для iOS.
Матеуш Пиотровский
У меня нет представителя, чтобы сделать это самостоятельно, но вы могли бы сделать 04 и вычеркнуть это.
Бобсон
9

Commodore 64 Basic, 4 байта

1S|0

Замена PETSCII: |=SHIFT+Y

Нулевой страницы из Commodore 64 является областью 256 байт памяти , которые могут быть доступны быстрее , чем остальная часть оперативной памяти. Следовательно, программы (такие как интерпретатор BASIC) используют его для часто используемых данных, и сам ЦП хранит здесь часть своего внутреннего состояния. Содержание может быть изменено без предварительного уведомления.

Программа BASIC, приведенная выше, не имеет смысла 1 SYS 0, т.е. передача выполнения в ячейку памяти 0. Это начинает выполнение нулевой страницы в виде кода. Обычно, когда интерпретатор BASIC начинает выполнение программы, первые 16 байтов

2F 37 00 AA  B1 91 B3 22
22 00 00 4C  00 00 00 00

так SYS 0выполнил бы следующее

00: ROL-AND $37,A  - Undocumented opcode: rotate the value at memory location 0x37 left, and store the result in the accumulator
02: BRK            - Call the interrupt vector

Общий результат - вывод READY.приглашения BASIC и возврат управления пользователю. Однако ячейка памяти 0x00 является регистром направления ввода-вывода CPU, а ячейка памяти 0x01 является регистром адреса ввода-вывода CPU. Если вы сделали что-то, что изменяет их перед запуском программы, результаты могут быть непредсказуемыми, начиная с вывода мусора и заканчивая блокировкой компьютера (0x22, обычно содержащийся в ячейке памяти 0x07, если выполняется как инструкция, является недокументированным).HALT кодом операции) ,

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

1?TI

Печатает истекшее время в секундах (1/60 секунды) с момента включения системы.

отметка
источник
8

05AB1E , 2 байта

žd

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

Выводит текущие микросекунды от внутренних часов исполняющей машины.

Или вы могли бы сделать что-то вроде этого ...

05AB1E , 3 байта

A.r

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

Выводит случайным образом перемешанный строчный алфавит.

Или это тоже работает:

A.R

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

Выводит случайную букву из алфавита.

Или это тоже работает и круче

05AB1E , 9 байтов

"ž"A.RJ.V

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

Выводит случайным образом один из них:

ž 23  > ža           push current hours
        žb           push current minutes
        žc           push current seconds
        žd           push current microseconds
        že           push current day
        žf           push current month
        žg           push current year
        žh           push [0-9]
        ži           push [a-zA-Z]
        žj           push [a-zA-Z0-9_]
        žk           push [z-aZ-A]
        žl           push [z-aZ-A9-0_]
        žm           push [9-0]
        žn           push [A-Za-z]
        žo           push [Z-Az-a]
        žp           push [Z-A]
        žq           push pi
        žr           push e
        žs           pop a, push pi to a digits (max. 100000)
        žt           pop a, push e to a digits (max. 10000)
        žu           push ()<>[]{}
        žv           push 16
        žw           push 32
        žx           push 64
        žy           push 128
        žz           push 256
Урна волшебного осьминога
источник
8

BrainfuckX и маленький скрипт (и т. Д.) Полиглот - 2 байта

?.

? - рандомизировать значение в текущей ячейке

, - Отправить текущую ячейку на стандартный вывод

wyldstallyns
источник
8

C 25 21 байт

Спасибо псевдониму 117 за сохранение 4 байта.

main(i){putchar(&i);}

Скомпилирован с gcc -o test lol.c(да, я довольно оригинален с именем моего файла ...), и побежал с ./test.

Он делает то, что говорит: печатает символ, соответствующий адресу памяти i, который определен во время выполнения, поэтому он должен быть недетерминированным.

Пол Пикард
источник
1. Можете ли вы пропустить, &поскольку значение переменной в стеке не определено? 2. У вас в стеке постоянное количество вещей, поэтому адрес памяти iпостоянен?
Райли
2
iстановится тем, что обычно называется argc, так что вы правы, оно всегда будет равно 1, если нет больше аргументов. Я не могу поверить, что я не помнил это. Я все еще не уверен, почему местоположение изменяется, но если это работает, это работает.
Райли
1
Он изменяется в современных операционных системах благодаря ASLR , функции безопасности, разработанной для того, чтобы затруднять эксплойту угадывание адресов. Вы получите последовательный результат на некоторых старых ОС.
1
Вы можете немного сэкономить, заменив putcharнаreturn
floorcat
1
На современных компиляторах с предупреждениями о том, что они не объявляют тип параметра, вы можете сделать следующее:main(){printf("%d");}
Myria
7

Python 2, 29 байт

import os
print os.urandom(9)

К сожалению, не первый раз пишу код на смартфоне.

Павел
источник
6

Perl, 5 байт

say$$

Выводит идентификатор процесса и новую строку.


источник
5

Пайк, 1 байт

C

Попробуй это здесь!

Выводит текущее время

синий
источник
1
Я вполне уверен, что это детерминистично.
Rɪᴋᴇʀ
@EasterlyIrk в удаленном комментарии mbomb сказал, что все в порядке
Blue
Ох, ну ладно. Кажется детерминированным для меня, но OP правил.
августа
В моей истории редактирования у меня была 3-байтовая версия с правильной случайностью
Blue
@EasterlyIrk Если текущее время является детерминированным, то и псевдослучайные числа, так как это то, с чем они засеваются. Цель не "случайность". Целью является недетерминизм.
mbomb007
5

C89 с GCC / Clang, 20 байтов

Другое решение на С каждый раз при сбое с GCC или Clang просто сбивается. Это, правда.

main(n){puts(&n+1);}

Который выглядит как:

$ for _ in `seq 1 50`; do ./test_89; done
���z�U
�VW��U
�F��U
�v�f2V
��FV
���*=V
�6���U
�20wU
��
�+V
�6
   �U
��V�uU
�v��V
���K�U
��7�qU
�6S�jU
�&�WU
��wV
��6l�U
���U
�F�ߨU
�f���U
���s7V
�f��?V
��;B�U
�;��U
��GV
�� ��U
�vKV
�V?]wU
�����U
��.�U
�v"�XU
��uhpU
��LD�U
�����U
�6X�U
��M�.V
�69��U
��ԤV
���U
����U
�vx4.V
�֝+xU
�F��U
�֤BQV
��#�U
���1^U
����sU
��4�U
��AݗU

Довольно много непечатного хлама, но он недетерминирован!

кошка
источник
почему "main (n) {put (& n + 1);}", а не "main (n) {put (& n);}"?
РосЛюП
@RosLuP Ваш второй вариант, который кажется очевидным для случайного наблюдателя, дает байт со значением n (когда n равно 1, если putsего адрес равен 1, а когда n равно 2, то putsего адрес дает 2). Добавление 1 к адресу n, который должен указывать на ширину 4 байта int, дает адрес нежелательной почты с сохраненным там значением нежелательной почты с очень определенным числом байтов до следующего байта NUL. Это поведение воспроизводимо между GCC и Clang и полностью вне меня. Я думаю, я пойду спросить на StackOverflow.
кот
Я читаю «put (& n)» таким образом: это дает для put адреса n, предположим, что n = 0x01020304 put вывел бы преобразованные в символы 04 03 02 01 или наоборот
RosLuP
1
Помните , ваш nеще инициализируется , что обычно называется , argcкоторый 0в своем общем тесте, так и с &n, putsполучает вполне детерминированный указатель на «\ 0» байт , что приводит к пустой строке (предполагается , что размер указателя == целочисленный размер и все такое) , &n+1однако это адрес того, что обычно argvвызывается (по крайней мере, для ABI, которые передают параметры в стеке в обратном порядке вместо регистров и со стеком, который растет от высоких до низких адресов), который, предполагая ASLR, должен быть разным указателем каждый время.
Гунтрам Блум
@GuntramBlohm Вы правы, и это очень интересно, хотя для меня указатели - 8 байтов, а целые - 4 байта.
кот
5

PHP, 12 байт

<?=uniqid();

Выводит уникальный идентификатор 583f4da627ee3на основе текущего времени в микросекундах.

Марио
источник
<?=time();<- 10 байт.
Исмаэль Мигель
@IsmaelMiguel uniqid()в 1'000'000 раз больше неопределенных, чем time();)
Марио
Я не говорю о противоположности. Но предлагая другой ответ. Вы можете выбрать это.
Исмаэль Мигель
@IsmaelMiguel кто-то другой уже дал такой же ответ ...
Марио
5

Groovy, 9 байт

{print{}}

Выходы:

Script1$_run_closure1@2c8ec01c

Поскольку он выводит адрес памяти замыкания, он недетерминирован.

Урна волшебного осьминога
источник
И я подумал, что Kotlin - это путь к кратчайшему решению JVM.
Ф. Джордж
Попытка поместить это в файл и работает groovy Script1.groovy, я получаю сообщение об ошибке: Ambiguous expression could be either a parameterless closure expression or an isolated open code block;. Как мне это использовать?
Paŭlo Ebermann
Присвойте его закрывающей переменной, затем вызовите ее.
Волшебная Урна Осьминога
5

Emotinomicon, 15 байт

😀😅🎲⏬

Объяснение:

😀😅🎲⏬
😀      push 0. Stack: [0]
  😅    push 1. Stack: [1]
    🎲  random[pop;pop]. Stack: [1 or 0]
      ⏬output
Роман Греф
источник
Название языка - Emotinomicon
акролит
@daHugLenny Как я это пропустил :)
Roman Gräf
5

Borland C на Windows, 12 байт

m(){puts();}

Я переписал его, потому что они говорят, что можно использовать одну функцию. Компилятор не проверил аргумент, поэтому скомпилируйте его; но выводит один адрес «никто» не знает и начинает печатать, в какой точке этот адрес, пока не найдет байт 0x00. Это может быть не хорошо, если этот адрес не хватает памяти, зарезервированной для программы, но здесь выведите что-то

RosLuP
источник
Это не дает недетерминированного вывода, это просто segfaults каждый раз.
кот
В качестве альтернативы, если вы получаете что-то, кроме segfault, какой компилятор?
кот
@cat это один компилятор Borland C + Windows7 Os. Как я вижу: приведенный выше код получает адрес вершины стека (где в этом случае есть адрес, который нужно вернуть в функцию main ()) и считывать с этого адреса в коде основного пространства ... Так что это зависит от вывода компилятора. Но я не знаю 100% ... Возможно, кодовое пространство не читается в вашей операционной системе, и из-за ошибки => seg
RosLuP
1
@RosLuP: Он просто напечатал бы любой мусор, который был в памяти стека (или во втором регистре передачи аргументов, для x86-64 и большинства соглашений о вызовах RISC, которые передают первые несколько аргументов в регистрах). Это не будет печатать адрес стека. В x86-64 это скорее всего будет печатать argv, так как компилятор, вероятно, вызовет printf со вторым аргументом main в этом регистре. Это именно то, что происходит с gcc6.2 для Linux: см. Source + asm в проводнике компилятора Godbolt : main раньше не касался RSI call printf.
Питер Кордес
1
@RosLuP: argvнаходится в стеке, но не на самом верху. Его адрес зависит от стека ASLR, так что это работает. Это будет работать не так хорошо с -m32. Вы, вероятно, всегда получите ноль, поскольку mainнеобходимо поддерживать выравнивание стека, чтобы слот стека над строкой форматирования мог быть свежей стековой памятью, которая никогда не была затронута (и, вероятно, всегда равна нулю, поскольку ядро ​​избегает утечки информации, обнуляя страницы вместо этого предоставления страниц пользовательского пространства, заполненных старыми данными).
Питер Кордес
5

Baby Language , 0 байт



Я не представил это первоначально, потому что я думал, что это задолго до вопроса. Я ошибался; на языке действительно был создан переводчик во времени. Это также, вероятно, наименее обманчивое 0-байтовое решение, которое я когда-либо видел (учитывая, что 0-байтовая программа указана для выполнения именно того, о чем просит программа, а не для того, чтобы обманывать проблемы игры в гольф).

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


источник