Najkrótszy kod do generowania niedeterministycznego wyniku


83

Musisz stworzyć wynik, który nie jest deterministyczny .

W takim przypadku zostanie to zdefiniowane w ten sposób, że wynik nie zawsze będzie taki sam.

Zasady:

  • Generator liczb pseudolosowych, który zawsze ma to samo ziarno, nie jest brany pod uwagę.

  • Możesz polegać na tym, że program jest uruchamiany w innym (nieznanym) czasie przy każdym uruchomieniu.

  • Identyfikator procesu twojego kodu (jeśli nie jest ustalony przez interpretera) może być uznany za niedeterministyczny.

  • Możesz polegać na losowości w sieci.

  • Twój kod nie może przyjmować niepustych danych wejściowych. Powiązany meta post .

  • Program nie musi się zatrzymywać, ale dane wyjściowe muszą zostać wyświetlone.

Tabela liderów


33
@ mbomb007 W C istnieje wiele rzeczy, które są po prostu „niezdefiniowanymi” zachowaniami. Dany tłumacz może robić, co chce, w dowolnej sytuacji. Z tego co wiemy, gcc może zamówić ci pizzę, jeśli spróbujesz przelać podpisaną liczbę całkowitą w deszczowy wtorek, ale we wszystkich pozostałych dniach wyskoczy z ekranu. Tak naprawdę nigdy nie dowiesz się, czy jest to rzeczywiście deterministyczne, czy nie w jakiejkolwiek implementacji.
Martin Ender

12
@MartinEnder Nie jestem pewien, czy to ma znaczenie. Tutaj definiujemy języki według ich implementacji, a nie specyfikacji (ponieważ języki bez implementacji są niedozwolone)
Nathan Merrill

2
@MartinEnder Tak, zgadzam się z Nathanem.
mbomb007

7
Zauważ, że niezdefiniowane zachowanie w C często prowadzi do awarii, a awarie w systemach UNIX i Linux prowadzą do plików podstawowych, które zawierają w sobie identyfikator procesu. Wydaje się to zgodne z obecnym brzmieniem pytania.

5
O ile nie zrozumiałem źle, pytanie nie wymagało kodu, który wykorzystuje niezdefiniowane zachowanie. Pyta o kod, który wykorzystuje zdefiniowane zachowanie, aby zagwarantować niedeterminizm.
WGroleau,

Odpowiedzi:


110

WinDbg, 1 bajt

#

Łał! Nigdy nie oczekiwałem rozwiązania 1-bajtowego od WinDbg!

#szuka wzorca dezasemblacji, ale ponieważ nie ma parametrów, wygląda na to, że zwróci następną instrukcję asemblera w jakimkolwiek zrzutie / procesie, do którego jesteś podłączony. Nie jestem pewien logiki ustawiania adresu początkowego, ale tak jest.

Przykładowe dane wyjściowe:

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
Jedna z najfajniejszych odpowiedzi tutaj, moim zdaniem, powinna zyskać na rozwiązaniu „bieżącej daty”.
Magic Octopus Urn

że powyżej wydaje się to przykro, krok po kroku początku jakiejś funkcji w 386 procesorach procesora
RosLuP,

60

Java 7, 33 30 27 bajtów

int a(){return hashCode();}

Ponieważ Java.


49
Ponieważ Java. Prawdopodobnie najlepsze wyjaśnienie języka Java w historii.
F. George

5
@ carusocomputing miałem toStringw poprzedniej wersji, ale wtedy typ zwracany Stringjest dłuższy niż int. Zapisz bajty! :]
Poke

12
Czy to jest prawidłowe jako funkcja? hashCode()jest tutaj skrótem this.hashCode(), więc działałaby tylko jako metoda instancji, a nie metoda statyczna. W takim przypadku potrzebujesz dodatkowego kodu, aby utworzyć obiekt w wywołującym. Jest to istotne tutaj, ponieważ to kod do stworzenia obiektu odpowiedzialnego za niedeterminizm.

15
W Javie 8: ()->hashCode()dla 14 bajtów. Po prostu mówię;)
Olivier Grégoire,

4
@pts Idę na podstawie meta postu omawiającego domyślną strukturę przesyłania postów. Funkcje są domyślnie dozwolone, chyba że wyzwanie określa, że ​​wymagany jest pełny program.
Poke

52

MATLAB, 3 bajty

why

whyzapewnia odpowiedzi na prawie każde pytanie. Kilka przykładów:

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?

To jest krótsze niż jakakolwiek randfunkcja, o której mogę myśleć.


33
MATLAB ma wbudowane do tego ? Dlaczego?
ETHproductions

59
@ETHproductions Programista zasugerował to
Eddie Curtis

40

R, 1 bajt

t

Wysyła kod źródłowy funkcji i adres wskaźnika pamięci, który zmienia się z każdym (ponownym) początkiem R.


36

co? , 0 bajtów


Pusty program nadal generuje dane wyjściowe. Ostatnie wiersze interpretera Pythona, które są wykonywane:

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")

Na końcu programu interpreter Pythona wydrukuje ..., a następnie utworzy / otworzy plik tekstowy o nazwie Notes.txti zapisze ciąg znaków zawierający bieżący czas z przodu.


5
Ze wszystkich rzeczy, o których myślałem, że ludzie będą używać na moim GitHubie, nie sądziłem, że tłumaczem żartów będzie jeden: P
Kade

@Kade miałem zamiar użyć go również do odpowiedzi na inne pytanie (najkrótszy kod do odtworzenia dźwięku, z jednym bajtem) - ale pytanie jest już zamknięte.
mbomb007,

Choć byłoby to niekonkurencyjne, chyba że spojrzałbym na oryginalny interpreter .NET, tak myślę.
mbomb007,

30

Labirynt , 5 bajtów

v
!
@

Odbitki 0lub brak (każda szansa 50%).

Wypróbuj online!

Istnieje bardzo szczególny przypadek, w którym Labirynt wykazuje losowe zachowanie:

  • Przed wskaźnikiem instrukcji i za nią musi znajdować się ściana.
  • Po lewej i prawej stronie wskaźnika instrukcji musi znajdować się brak ściany.
  • Bieżący szczyt stosu musi wynosić zero.

Jeśli wszystkie te warunki są spełnione, kierunek, w którym porusza się IP, jest wybierany (jednolicie) losowo. Najważniejsze jest to, że tych trzech warunków nie można spełnić przy regularnym przepływie kontroli, co oznacza, chyba że zmodyfikujesz kod źródłowy w czasie wykonywania.

(Może to wydawać się nieco arbitralne, ale w rzeczywistości jest to najbardziej spójne zachowanie, jakie mogę znaleźć w tych warunkach, ponieważ zwykle kierunek adresu IP zawsze zależy od poprzedniego kierunku, jego sąsiadów i znaku górnej części stosu, i wydawało się to eleganckim sposobem na uwzględnienie źródła losowości w języku).

Za pomocą instrukcji rotacji kodu źródłowego ( <^>v) można wprowadzić IP do tej sytuacji. Jeden taki przykład widać na górze. IP początkowo wskazuje wschód i zaczyna się na górze. Thev obraca obecna kolumna tak, że otrzymujemy:

@
v
!

IP porusza się wraz z tym obrotem, tak że wciąż jest na v, wskazując na wschód. Wszystkie warunki są teraz spełnione, więc IP losowo wzrośnie lub spadnie. Jeśli wzrośnie, program natychmiast się kończy. Jeśli spadnie, drukuje zero, ponownie obraca kolumnę, a następnie kończy.

Istnieją trzy inne programy korzystające z tego (jeden, który również drukuje 0, jeden, który drukuje, 00a drugi, który drukuje 000):

v
@
!

"
>@!

"
>!@

(W rzeczywistości istnieje o wiele więcej niż trzy inne programy, ponieważ można również użyć .zamiast !wypisać bajty zerowe lub zastąpić "je szeroką gamą poleceń, ale uważam, że wszystkie działają w zasadzie tak samo.)


30

Befunge (-93 i -98), 3 bajty

?.@

?Wysyła wykonanie w losowym kierunku. Jeśli idzie w górę lub w dół, zapętla się z powrotem do ?i przewija. Jeśli pójdzie w lewo, program zawija się do @i w ten sposób kończy pracę bez drukowania niczego. Jeśli pójdzie dobrze, drukuje 0(dane wyjściowe wyprodukowane, .gdy stos jest pusty), a następnie kończy działanie na @.


Nie ma gwarancji, że to się skończy, ale zamierzałem to opublikować dokładnie tak +1
Daniel

Możesz zmienić przecinek na kropkę, aby wyświetlać 0 jako liczbę zamiast znaku pustego (wartość ASCII 0). +1
Łagodnie Milquetoast,

Było to .w programie, którego ,używałem do testowania, ale jakoś stało się, gdy skopiowałem go na PPCG. Naprawiony.

7
@Dopapp kończy się prawie na pewno, z prawdopodobieństwem 1. Wziąłbym to za gwarancję;)
Oliphaunt

@JamesHolderness Myślę, że możesz to zrobić w 1. Nie jestem pewien, czy to się liczy ...
MildlyMilquetoast,

29

Minecraft, 5 4 bajtów

op 8

Używane, pisząc w konsoli serwera lub bloku poleceń i dając mu moc. Można uruchomić z interfejsu czatu, przygotowując /.

Zwykle nic to nie robi, ale jeśli na serwerze jest gracz o nazwie użytkownika „8”, otrzymają uprawnienia operatora. Pamiętaj, że chociaż Minecraft zwykle wymaga, aby nazwy użytkowników składały się z 3 znaków, niektóre konta o krótszych nazwach zostały utworzone przed tym ograniczeniem.

Wersja, którą można zademonstrować jako niedeterministyczną bez jednej z tych nazw użytkownika lub ryzyka nadania uprawnień operatorowi użytkownika, znajduje się tutaj:

me @r

Wyświetla wiadomość dla wszystkich, która jest nazwą użytkownika losowego gracza. opKomenda zajmuje tylko ciąg dosłowny, nie każdy skrypt, który zwraca ciąg znaków.

mePolecenie nie będzie naprawdę pracować dla pierwszego przykładu, to wyświetlane "<your-username> 8". Po uruchomieniu z bloku poleceń nie byłoby deterministyczne, ponieważ wszystkie bloki poleceń mają tę samą „nazwę użytkownika”, ale uruchomienie go z interfejsu czatu wymagałoby /jednego dodatkowego bajtu.


Więc /nie jest uwzględniony w liczbie bajtów?
Esolanging Fruit

11
@ Challenger5 Ukośnik jest opcjonalny w blokach poleceń, niedozwolony w konsoli serwera i obowiązkowy w interfejsie czatu.
Pavel

2
Właściwie powinno to być 4 bajty + 2 bloki (blok poleceń i źródło redstone) lub 6 blytów
RudolfJelin

2
@ RudolphJelinek Można go uruchomić z konsoli bez bloków poleceń.
Pavel

1
Inną niedeterministyczną opcją byłby helpblok poleceń, który ma 4 bajty (i nie wymaga pirackich gier).
Pokechu22,

21

sh + procps, 1 bajt

w

Jest to najkrótsze znane mi rozwiązanie, które działa poprzez wywołanie zewnętrznych plików wykonywalnych. procpsjest odpowiedzialnym pakietem za raportowanie informacji o bieżącym stanie systemu ( psi znajomych) i jest domyślnie instalowany w większości dystrybucji Linuksa; wjest najkrótszą w nim komendą i zwraca informacje o zalogowanych użytkownikach, ale także pewne niedeterministyczne informacje, takie jak czas pracy.


21

Poinformuj 7, 6 bajtów

x is y

To nie jest prawidłowy program Inform 7, ponieważ nie zdefiniowano ani „x”, ani „y”. To powoduje błąd.

Jednak niektóre komunikaty o błędach Inform 7 - w tym ten - są losowe. Tak więc tekst, który drukuje, jest technicznie niedeterministyczny.

Kilka możliwych wyników to:

Problem.Zdanie „x jest y” wydaje się mówić, że dwie rzeczy są takie same - czytam „x” i „y” jako dwie różne rzeczy, dlatego nie ma sensu mówić, że jedno jest drugie: to byłoby jak mówienie że „Adams to Jefferson”. Byłoby dobrze, gdyby drugą rzeczą było coś w rodzaju, być może z właściwościami: na przykład „Virginia to oświetlony pokój” mówi, że istnieje coś o nazwie Virginia i że jest to „pokój”, który znam o, w połączeniu z właściwością zwaną „oświetloną”, o której też wiem.

Problem. Zdanie „x jest y” wydaje się mówić, że dwie rzeczy są takie same - czytam „x” i „y” jako dwie różne rzeczy, dlatego nie ma sensu mówić, że jedno jest drugie: to byłoby jak mówienie że „Adam jest Ewą”. Byłoby dobrze, gdyby drugą rzeczą było coś w rodzaju, być może z właściwościami: na przykład „Kraina Nod to oświetlony pokój” mówi, że istnieje coś o nazwie Kraina Nod i że jest to „pokój”, który jest rodzaj, o którym wiem, w połączeniu z właściwością zwaną „oświetloną”, o której też wiem.

Problem. Zdanie „x jest y” wydaje się mówić, że dwie rzeczy są takie same - czytam „x” i „y” jako dwie różne rzeczy, dlatego nie ma sensu mówić, że jedno jest drugie: to byłoby jak mówienie że „Clark Kent to Lex Luthor”. Byłoby dobrze, gdyby drugą rzeczą było coś w rodzaju, być może z właściwościami: na przykład „Metropolis to oświetlony pokój” mówi, że istnieje coś zwanego Metropolis i że jest to „pokój”, który znam o, w połączeniu z właściwością zwaną „oświetloną”, o której też wiem.

Problem. Zdanie „x jest y” wydaje się mówić, że dwie rzeczy są takie same - czytam „x” i „y” jako dwie różne rzeczy, dlatego nie ma sensu mówić, że jedno jest drugie: to byłoby jak mówienie że „Ajschylos to Eurypides”. Byłoby dobrze, gdyby drugą rzeczą było coś w rodzaju, być może z właściwościami: na przykład „Underworld to oświetlony pokój” mówi, że istnieje coś o nazwie Underworld i że jest to „pokój”, który znam o, w połączeniu z właściwością zwaną „oświetloną”, o której też wiem.


7
Nawet komunikaty o błędach są pełne!
Destructible Lemon

21

JavaScript, 4 bajty

Date

Funkcja, która zwraca bieżącą datę / godzinę. Myślę, że to najkrótszy będzie ...

Wyjaśnienie

Ponieważ wydaje się, że powoduje to wiele nieporozumień, dlaczego jest to ważne, postaram się wyjaśnić.

W JavaScript wpis funkcji jest poprawny, jeśli można go przypisać do zmiennej i wywołać jak funkcję. Na przykład ta funkcja jest poprawnym wpisem:

function(){return Date()}

Ponieważ jest to funkcja, którą można przypisać do zmiennej takiej jak:

f=function(){return Date()}

A następnie biegnij f()tyle razy, ile to konieczne. Za każdym razem zwraca bieżący ciąg daty / godziny, który został uznany przez PO za niedeterministyczny.

Ta funkcja strzałki ES6 jest również ważna:

_=>Date()

Można go przypisać za pomocą f=_=>Date(), a następnie uruchomić z f()innym.

Oto kolejny ważny wpis:

Date

Dlaczego? Ponieważ podobnie jak dwa pozostałe wpisy, można go przypisać za pomocą, f=Datea następnie wywołać za pomocą f(), zwracając dokładnie to samo, co pozostałe dwa. Spróbuj:


1
Czy nie potrzebujesz, Date()aby wywołać tę funkcję?
mleko

4
@ mleko Datejest funkcją, która wywołana bez wprowadzania danych generuje bieżącą datę / godzinę. _=>Date()jest wyraźnie poprawnym wpisem, który robi dokładnie to samo, więc Datejest poprawnym wpisem.
ETHprodukcje

1
To ma sens.
mleko

2
Wpisując Datedo konsoli JavaScript w przeglądarce powoduje wyjście deterministyczny, to zawsze daje to: function Date() { [native code] }. Prawdopodobnie masz na myśli Date()6 bajtów.
pkt

2
jeśli powyższa „data” jest odpowiednia niż „malloc (8)” lub „czas (0)” również byłaby odpowiednia w C
RosLuP


11

Python 2, 11 bajtów

print id(1)

1
To właśnie znalazłem. Miałem id(0)jednak. :)
mbomb007

2
Technicznie cię pokonałem, ponieważ jestem OP i znalazłem to, zanim opublikowałem pytanie. Nie chciałem publikować pytania i natychmiast publikować najkrótszą odpowiedź.
mbomb007


10

PowerShell, 4 2 bajty

(przekreślone 4 nadal wygląda jak 4 )

ps

Jest to alias, dla Get-Processktórego bieżąca lista procesów wyświetli się w postaci tabeli, w tym uchwytów, pamięci prywatnej, czasu procesora itp.

Wykonaj to za pomocą czegoś takiego:

C:\Tools\Scripts\golfing>powershell.exe "ps"

1
Muszę przyznać, że sprawdziłem, czy rzeczywiście go przekreślono. Naprawdę nie możesz nawet powiedzieć.
Carcigenicate

@Carcigenicate Mogę stwierdzić, czy jest skrzyżowane bez zaznaczania tekstu (Ubuntu 16.04.1, Chrome 54.0.2840.100).
Erik the Outgolfer,

Widoczny również na
Androidzie

Wygląda dobrze w aplikacji na iOS.
Mateusz Piotrowski,

Nie mam przedstawiciela, który mógłby to zrobić sam, ale możesz zrobić 04 i wykreślić to.
Bobson,


9

Commodore 64 Basic, 4 bajty

1S|0

Podstawienie PETSCII: |=SHIFT+Y

Strona zerowa Commodore 64 to obszar 256 bajtów pamięci, do którego można uzyskać dostęp szybciej niż reszta pamięci RAM. W związku z tym programy (takie jak interpreter BASIC) używają go do często używanych danych, a sam procesor przechowuje tutaj część swojego wewnętrznego stanu. Treść może ulec zmianie bez powiadomienia.

Powyższy program BASIC, bez golfa, to 1 SYS 0np. przesyłanie wykonania do miejsca pamięci 0. To zaczyna wykonywanie strony zerowej jako kodu. Zwykle, gdy interpreter BASIC zaczyna uruchamiać program, pierwsze 16 bajtów to

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

więc SYS 0wykonaj następujące czynności

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

Ogólnym wynikiem jest wyświetlenie READY.monitu BASIC i zwrócenie kontroli użytkownikowi. Jednak lokalizacja pamięci 0x00 to rejestr kierunku we / wy procesora, a lokalizacja pamięci 0x01 to rejestr adresu we / wy procesora. Jeśli zrobiłeś coś, co je zmienia przed uruchomieniem programu, wyniki mogą być nieprzewidywalne, począwszy od wyrzucania śmieci do blokowania komputera (0x22 zwykle zawarty w pamięci 0x07, jeśli wykonany jako instrukcja, jest nieudokumentowanym HALTopcode) .

Alternatywnie, bardziej wiarygodnym nieprzewidywalnym programem jest czterobajtowy

1?TI

Drukuje czas, który upłynął, w jiffies (1/60 sekundy), od włączenia zasilania systemu.


8

05AB1E , 2 bajty

žd

Wypróbuj online!

Wysyła bieżące mikrosekundy z wewnętrznego zegara maszyny wykonującej.

Lub możesz zrobić coś takiego ...

05AB1E , 3 bajty

A.r

Wypróbuj online!

Wyprowadza losowo tasowane małe litery.

Lub to też działa:

A.R

Wypróbuj online!

Wysyła losową literę z alfabetu.

Lub to też działa i jest fajniejsze:

05AB1E , 9 bajtów

"ž"A.RJ.V

Wypróbuj online!

Generuje losowo jeden z tych:

ž 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

C, 25 21 bajtów

Dzięki pseudonimowi 117 za zapisanie 4 bajtów.

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

Skompilowałem gcc -o test lol.c(tak, jestem dość oryginalny z nazwą mojego pliku ...) i uruchomiłem z ./test.

Robi to, co mówi: drukuje znak odpowiadający adresowi pamięci izdefiniowanemu w czasie wykonywania, więc powinien być niedeterministyczny.


1. Czy możesz pominąć wartość, &ponieważ wartość zmiennej na stosie nie jest zdefiniowana? 2. Masz stałą liczbę rzeczy na stosie, więc czy adres pamięci jest istały?
Riley,

2
istaje się tym, co zwykle się nazywa argc, więc masz rację, zawsze będzie to 1, chyba że będzie więcej argumentów. Nie mogę uwierzyć, że tego nie pamiętam. Nadal nie jestem pewien, dlaczego zmienia się lokalizacja, ale jeśli działa, to działa.
Riley

1
Zmienia się w nowoczesnych systemach operacyjnych dzięki ASLR , funkcji bezpieczeństwa mającej na celu utrudnienie odgadnięcia adresów przez exploity. Uzyskasz spójny wynik w niektórych starszych systemach operacyjnych.

1
Można zaoszczędzić trochę zastępując putcharzreturn
ceilingcat

1
W nowoczesnych kompilatorach z ostrzeżeniami o main(){printf("%d");}
niezgłaszaniu

7

Python 2, 29 bajtów

import os
print os.urandom(9)

Niestety nie pierwszy raz pisze kod na smartfonie.


6

Perl, 5 bajtów

say$$

Wysyła identyfikator procesu i nowy wiersz.



5

Pyke, 1 bajt

C

Wypróbuj tutaj!

Wyświetla aktualny czas


1
Jestem całkiem pewien, że jest to deterministyczne.
Rɪᴋᴇʀ

@EasterlyIrk w usuniętym komentarzu mbomb powiedział, że było w porządku
Blue

W porządku Wydaje mi się deterministyczny, ale reguły OP.
Rɪᴋᴇʀ

W mojej historii edycji miałem 3-bajtową wersję z odpowiednią losowością
Blue

@EasterlyIrk Jeśli aktualny czas jest deterministyczny, to są to również liczby pseudolosowe, ponieważ są one zaszczepione. Celem nie jest „losowość”. Celem jest niedeterminizm.
mbomb007

5

C89 z GCC / Clang, 20 bajtów

Inne rozwiązanie C po prostu ulega awarii za każdym razem, gdy jest budowane z GCC lub Clang. To jednak.

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

Który wygląda jak:

$ 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

Dość dużo niepotrzebnych śmieci, ale to niedeterministyczne!


dlaczego „main (n) {puts (& n + 1);}”, a nie „main (n) {puts (& n);}”?
RosLuP,

@RosLuP Druga opcja, która wydaje się oczywista dla zwykłego obserwatora, daje bajt o wartości n (gdy n to 1, putsjego adres daje 1, a gdy n jest 2, putsjego adres daje 2). Dodanie 1 do adresu n, który powinien wskazywać na szerokość 4 bajtów int, daje adres śmieci z przechowywaną tam wartością śmieci z bardzo pewną liczbą bajtów do następnego bajtu NUL. To zachowanie jest powtarzalne między GCC i Clangiem i całkowicie poza mną. Myślę, że zapytam o StackOverflow.
kot

czytam „puts (& n)” w ten sposób: daje to puts adres n, załóżmy, że n = 0x01020304 puts wydrukowałby konwersję w znakach 04 03 02 01 lub odwrotnie
RosLuP

1
Pamiętaj, że nnadal inicjujesz to, co zwykle się nazywa, argcco jest 0w ogólnym przypadku testowym, więc za pomocą &n, putsdostaje dość deterministyczny wskaźnik do bajtu „\ 0”, co skutkuje pustym łańcuchem (zakładając rozmiar wskaźnika == rozmiar liczby całkowitej i wszystkie inne rzeczy) . &n+1jest to jednak adres tego, co zwykle się nazywa argv(przynajmniej na ABI, które przekazują parametry na stos w odwrotnej kolejności zamiast rejestrów, i na stosie, który rośnie z wysokich do niskich adresów), który przy założeniu ASLR powinien być innym wskaźnikiem co czas.
Guntram Blohm,

@GuntramBlohm Masz rację i to bardzo interesujące, chociaż dla mnie wskaźniki to 8 bajtów, a ints to 4 bajty.
kot

5

PHP, 12 bajtów

<?=uniqid();

Wysyła unikalny identyfikator 583f4da627ee3na podstawie bieżącego czasu w mikrosekundach.


<?=time();<- 10 bajtów.
Ismael Miguel

@ IsmaelMiguel uniqid()jest 1'000'000 razy bardziej nieokreślony niż time();)
Mario

Nie mówię przeciwnie. Ale zaproponowanie innej odpowiedzi. Możesz go wybrać.
Ismael Miguel

@ IsmaelMiguel ktoś inny już udzielił tej samej odpowiedzi ...
Mario,

5

Groovy, 9 bajtów

{print{}}

Wyjścia:

Script1$_run_closure1@2c8ec01c

Ponieważ wyprowadza adres pamięci zamknięcia, nie jest deterministyczny.


I myślałem, że Kotlin jest drogą do najkrótszego możliwego rozwiązania JVM.
F. George

Starając się umieścić to w pliku i działa groovy Script1.groovy, pojawia się błąd: Ambiguous expression could be either a parameterless closure expression or an isolated open code block;. Jak tego użyć?
Paŭlo Ebermann,

Przypisz ją do zmiennej zamknięcia, a następnie wywołaj ją.
Magic Octopus Urn

5

Emotinomicon, 15 bajtów

😀😅🎲⏬

Wyjaśnienie:

😀😅🎲⏬
😀      push 0. Stack: [0]
  😅    push 1. Stack: [1]
    🎲  random[pop;pop]. Stack: [1 or 0]
      ⏬output

Nazwa języka to Emotinomicon
acrolith

@daHugLenny Jak mi tego brakowało :)
Roman Gräf

5

Borland C w systemie Windows, 12 bajtów

m(){puts();}

Przepisałem go, ponieważ mówią, że można użyć jednej funkcji. Kompilator nie sprawdził argumentu, więc go skompiluj; ale stawia jeden adres „nikt” nie zna i zaczyna wypisywać, jaki punkt ten adres, aż do znalezienia bajtu 0x00. Może nie być w porządku, jeśli w tym adresie brakuje pamięci zarezerwowanej dla programu, ale tutaj coś wydrukuj


Nie daje to niedeterministycznego wyniku, po prostu segreguje za każdym razem.
kot

Ewentualnie, jeśli masz coś innego niż segfault, co kompilator ??
kot

@cat to jeden kompilator Borland C + Windows7 OS. Jak widzę: powyższy kod pobiera adres na górze stosu (gdzie w tym przypadku jest adres do zwrócenia w funkcji main ()) i odczytanie z tego adresu w kodzie głównej przestrzeni ... Więc to zależy od wyjścia kompilatora. Ale nie wiem w 100% ... Możliwe, że przestrzeń kodu nie jest czytelna w twojej OS i z tego => seg fault
RosLuP

1
@RosLuP: Po prostu wypisuje śmieci w pamięci stosu (lub w drugim rejestrze przekazującym arg, dla x86-64 i większości konwencji wywoływania RISC, które przekazują kilka pierwszych argumentów w rejestrach). Nie wydrukuje adresu stosu. W wersji x86-64 jest raczej prawdopodobne, że zostanie wydrukowany argv, ponieważ kompilator prawdopodobnie wywołałby printf z drugim argumentem main nadal w tym rejestrze. Tak właśnie dzieje się z gcc6.2 atakującym na Linuksa: Zobacz źródło + asm w eksploratorze kompilatora Godbolt : main nie dotyka wcześniej RSI call printf.
Peter Cordes,

1
@RosLuP: argvjest na stosie, ale nie na samej górze. Jednak na jego adres wpływa stos ASLR, więc to działa. To działałoby gorzej -m32. Prawdopodobnie zawsze miałbyś zero, ponieważ musiał mainzachować wyrównany stos, aby szczelina stosu nad ciągiem formatu mogła być świeżą pamięcią stosu, która nigdy nie została zmieniona (i prawdopodobnie jest zawsze zerowa, ponieważ jądro unika wycieków informacji poprzez zerowanie stron zamiast tego udostępniania stron przestrzeni użytkownika pełnych starych danych).
Peter Cordes,

5

Język dziecka , 0 bajtów



Nie przesłałem tego pierwotnie, ponieważ myślałem, że postdatował to pytanie. Myliłem się; język miał tłumacza utworzonego na czas. Jest to również prawdopodobnie najmniej oszukane rozwiązanie 0-bajtowe, jakie widziałem (biorąc pod uwagę, że program 0-bajtowy jest przeznaczony do robienia dokładnie tego, o co program prosi, a nie do oszukiwania w wyzwaniach golfowych).

Język dziecka jest określony, aby zignorować podany program i zrobić coś losowo. (Tłumacz, do którego link znajduje się na stronie Esolang, generuje losowy legalny program BF i uruchamia go.) Wydaje się, że idealnie pasuje do tego wyzwania.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.