Zaimplementuj Maszynę Prawdy

148

Prawda-maszyna (kredyty idzie do tego faceta za wymyślanie nim) Jest to bardzo prosty program przeznaczony do wykazania strumień we / wy i sterowania języka. Oto, co robi maszyna prawdy:

  • Pobiera liczbę (0 lub 1) z STDIN.

  • Jeśli ta liczba to 0, wydrukuj 0 i zakończ.

  • Jeśli liczba ta wynosi 1, wydrukuj 1 na zawsze.

Wyzwanie

Napisz maszynę prawdy, jak opisano powyżej, w wybranym języku. Maszyna prawdy musi być pełnym programem, który przestrzega następujących zasad:

  • pobrać dane ze STDIN lub akceptowalnej alternatywy
    • Jeśli twój język nie może przyjmować danych wejściowych ze STDIN, może pobierać dane ze zmiennej zakodowanej na stałe lub odpowiedniego odpowiednika w programie
  • musi generować do STDOUT lub akceptowalnej alternatywy
    • Jeśli twój język nie jest w stanie wypisać znaków 0lub 1, bajt lub jednoargumentowe We / Wy są dopuszczalne.
  • gdy wejście jest 1, musi stale drukować 1s i zatrzymywać się tylko wtedy, gdy program zostanie zabity lub zabraknie pamięci
  • po danych wyjściowych musi 0następować albo jedna, albo żadna nowa linia lub spacja, albo nieskończone 1s, każda 1po której następuje jedna lub żadna nowa linia lub spacja. Żadne inne dane wyjściowe nie mogą być generowane, z wyjątkiem stałych wyników tłumacza języka, których nie można stłumić (takich jak powitanie, kody kolorów ANSI lub wcięcia). Używanie znaku nowej linii lub spacji musi być spójne: na przykład, jeśli zdecydujesz się na wyjście 1za pomocą nowego wiersza po wszystkim, 1s musi mieć po nim nowy wiersz.

  • wtedy i tylko wtedy, gdy twój język nie może zakończyć się na wejściu 0, dopuszczalne jest, aby kod wszedł w nieskończoną pętlę, w której nic nie jest wyprowadzane.

Ponieważ jest to katalog, języki utworzone po tym wyzwaniu mogą konkurować. Pamiętaj, że musi być tłumacz, aby można było przetestować zgłoszenie. Dozwolone jest (a nawet zachęcane) samodzielne pisanie tego tłumacza dla wcześniej niewdrożonego języka. Poza tym wszystkie standardowe zasady . Zgłoszenia w większości języków będą oceniane w bajtach w odpowiednim wcześniej istniejącym kodowaniu (zwykle UTF-8).

Katalog

Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako listy najkrótszych rozwiązań dla każdego języka oraz b) jako ogólnej tabeli wyników.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

## Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

## Perl, 43 + 2 (-p flag) = 45 bytes

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes

spaghetto
źródło
Czy możemy założyć, że program zatrzymuje się, gdy procesor kończy wykonywanie napisanego kodu, w celu wprowadzenia kodu maszynowego?
lirtosiast
3
Zakładając, że jakiekolwiek zachowanie jest w porządku dla wszystkich nieprawidłowych danych wejściowych?
Cruncher,
3
@Cruncher Tak, jedyne dane, których powinieneś się spodziewać to 0 i 1.
spaghetto
4
Katalog jest wykorkowany.
Addison Crump,
2
Katalog wydaje się uważać Bfi bfbyć różne języki.
Mooing Duck,

Odpowiedzi:

188

Sześciokąt , 6 bajtów

Było to zaskakująco trudne i nie jestem przekonany, czy jest optymalne ...

<.@!$?

Po wypełnieniu i rozwinięciu kodu reprezentuje to następującą siatkę heksadecymalną:

wprowadź opis zdjęcia tutaj

Wykorzystuje to podobny przepływ kontrolny, jak mój ostatni bezbłędny program dla kotów , poruszający się po przekątnych. Aby to osiągnąć, zaczynamy od odchylenia wskaźnika instrukcji (IP) w lewo, gdzie fioletowa ścieżka otacza lewy dolny róg.

?odczytuje dane wejściowe jako liczbę całkowitą. !drukuje to z powrotem. .jest po prostu zakazem. Teraz róg siatki działa jak gałąź:

Jeśli dane wejściowe były 0, adres IP będzie kontynuowany wzdłuż czerwonej ścieżki, która po prostu kończy działanie programu @.

Jeśli dane wejściowe były 1, adres IP będzie kontynuowany na zielonej ścieżce. Ponownie, .to po prostu brak możliwości, ale $jest odpowiednikiem trampoliny Befunge: pomija następną instrukcję. Po zawinięciu następna instrukcja byłaby ?, ale ze względu na $wykonanie faktycznie kontynuuje na niebieskiej ścieżce, zaczynając od !wydrukowania kolejnej kopii 1. Ta pętla, która zawiera tylko, !..$jest teraz powtarzana w nieskończoność.

Badanie przepływu kontrolnego w Hexagony ...

Uważam, że powyższe rozwiązanie jest optymalne. Napisałem brutalny forcer, który sprawdza wszystkie 6-bajtowe programy Hexagony, które zawierają co najmniej jeden z nich ?!@(które są konieczne; sprawdziłem również :i %zamiast tego @kończyć się błędem dzielenia przez zero, ale to też nie pomogło). Czek wypisuje wszystkie programy, które a) wytwarzają 0wejście 0i kończą oraz b) wytwarzają co najmniej dwa 1s (i nic więcej) i nie kończą się w ciągu pierwszych 60 znaczników programu (200 znaczników dla rozwiązań 5-bajtowych) . Wątpię, aby każde prawidłowe rozwiązanie wymagało więcej niż 200 tyknięć, aby poprawnie wydrukować pierwszy 0lub drugi 1na tak małej siatce, więc nie sądzę, że nie przegapiłem żadnych potencjalnych rozwiązań.

Wyszukiwanie nie przyniosło żadnych wyników dla 5 bajtów, ale 57 wyników dla 6 bajtów (przy użyciu @; nie trzeba kończyć z błędem, jeśli możemy rozwiązać ten problem w tej samej ilości bajtów). Z tych 57 tylko 6 było fałszywie dodatnich, które w rzeczywistości wydrukowały tylko dwie 1sekundy, a następnie weszły w nieskończoną pętlę bez drukowania. Jedno rozwiązanie zostało wymienione dwukrotnie, ponieważ zawierało dwa !polecenia. Pozostawia dokładnie 50 poprawnych rozwiązań.

Istnieje pewna degeneracja między rozwiązaniami, w których jedna lub dwie postacie nie są znaczące, np. Dlatego, że i tak nie działają. Rozwiązania można pogrupować w 23 zestawy naprawdę odrębnych programów (w niektórych przypadkach istnieje tylko jedna różnica znaków między dwoma zestawami, ale zmienia to znacznie przepływ sterowania, więc policzyłem je osobno). Dwie grupy nawet wykorzystują wiele wskaźników instrukcji w bardzo nieoczekiwany sposób. Ponieważ nigdy nie wymyśliłem większości tych sposobów korzystania z rozgałęzień i luster, robią one bardzo interesujące studium tego, jaki rodzaj kontroli jest możliwy w Hexagony, i na pewno nauczyłem się nowych sztuczek dla przyszłych golfów.

Ogólny przepływ sterowania jest prawie zawsze taka sama: odczytać numer, wydrukować go. Jeśli 0znajdziesz sposób na @, jeśli nie, kontynuuj zapętlanie, utrzymując !jednocześnie wartość krawędzi 1. Istnieją cztery godne uwagi wyjątki:

  • Jedno rozwiązanie (jedno z dwoma !) drukuje dwie 1s na iterację przez siatkę, dlatego drukuje około dwa razy szybciej niż większość programów. Oznacziłem ten x2poniżej.
  • Kilka rozwiązań (te, które zawierają o) wymieni 1z 111(kodem znaku o), więc wydrukować trzy 1 s na iteracji, co czyni je wydrukować około trzy razy tak szybko, jak w większości programów. Oznacziłem je x3poniżej.
  • Dwa rozwiązania dodają a 1do wartości krawędzi w każdej iteracji (więc 1-> 11-> 111-> ...). Te drukują się bardzo szybko, ale w końcu zabraknie im pamięci. Oznacziłem je OoMponiżej.
  • Dwa rozwiązania wchodzą w bardzo ciasną pętlę, która jedynie odbija się w tę iz powrotem !, drukując co drugi tik (zamiast co piątego lub więcej), co czyni je nieco szybszymi (i bardziej uporządkowanymi). Oznacziłem je ><poniżej.

Oto całe zoo:

#1                #5                #12                #19
?!/$.@            ?$!>$@            .?!/$@             |!|?$@  # ><
?!/$1@  # OoM     ?$!|$@            =?!/$@
?!/$=@                                                 #20
?!/$\@            #6                #13                $@.?<!
?!/$o@  # x3      ?/!<|@            .?/!$@             $@1?<!  # OoM
?!/$!@  # x2                        =?/!$@             $@=?<!
                  #7                                   $@o?<!  # x3
#2                ?\!<|@            #14
?!>$)@                              \!?__@             #21
?!>$1@            #8                                   _>_!?@
?!>$o@  # x3      ?<!>$@  # ><      #15
?!|$)@                              \_?!$@             #22
?!|$1@            #9                                   <!@.$?
?!|$o@  # x3      ?\$!@$            #16                <!@/$?
                                    \_?!_@             <!@=$?
#3                #10                                  <$@!$?
?!|)$@            ?~#!@)            #17                <.@!$?
?!|1$@            ?~#!@1            $$?\@!             </@!$?
?!|o$@  # x3                                           <=@!$?
                  #11               #18
#4                ?$)\@!            \$?\@!             #23
?_!<@>            ?$1\@!                               <<@]!?
                  ?$o\@!  # x3

Poniżej znajduje się krótki przewodnik dla kilku bardziej reprezentatywnych grup. Szczególnie warto sprawdzić grupy 10 i 23. Istnieje wiele innych interesujących i czasami skomplikowanych ścieżek w innych grupach, ale myślę, że na koniec dość mi się nudziłem. Dla każdego, kto naprawdę chce nauczyć się heksagonii, zdecydowanie warto je zbadać, ponieważ wykazują jeszcze więcej możliwych zastosowań lusterek i $.

Grupa 1

To nie jest dużo bardziej skomplikowane niż moje oryginalne rozwiązanie, ale ścieżki idą w różnych kierunkach. Pozwala również na największą liczbę odmian w jednej komórce, ponieważ najbardziej prawy brak no-op można zastąpić 5 różnymi poleceniami, które nadal sprawiają, że jest to ważne bez zmiany struktury:

wprowadź opis zdjęcia tutaj

Grupa 2

Ten jest dość interesujący, ponieważ porusza się tylko w poziomie. Po zawinięciu do >adresu IP natychmiast się odwraca, biorąc gałąź w rogu. Nie jest to całkiem dobrze widoczny schemat, ale w przypadku ponownie 1przechodzimy do pierwszego rzędu, ale tym razem do tyłu. Oznacza to również, że ?ponownie się na nie natkniemy, co teraz zwraca 0(EOF). Jest to naprawione za pomocą )(przyrostu), aby zachować drukowanie 1. Ma to również 5 odmian, a )może być również 1lub o, i >może być także |:

wprowadź opis zdjęcia tutaj

Grupa 3

Ten wygląda prawie identycznie jak poprzedni, ale jest bałaganiarski jak diabli. |To samo dotyczy uderzenia, a następnie przejścia dolnego lub górnego rzędu. Ale w przypadku pętli $teraz przeskakuje nad ) na lustrze. Idziemy więc turkusową ścieżką po prawej stronie, teraz uderzamy o przyrost, przeskakujemy @przed, zanim | ponownie się zawiniemy, a następnie wracamy do zielonej ścieżki u góry.

wprowadź opis zdjęcia tutaj

Grupa 4

Myślałem, że ten był wyjątkowo fajny:

wprowadź opis zdjęcia tutaj

_Lustro w prawym górnym rogu jest początkowo no-op, więc drukować !i hit <. 0Ścieżka uderza teraz poziome lustro i kończy. 1Ścieżka trwa bardzo interesujący tor chociaż: to ugina w dół, zawija do !, zostanie przekierowany do linii poziomej, a następnie owija powrotem do ! ponownie . Następnie porusza się w tym kształcie rombu, drukując dwa razy na iterację (co trzeci tik).

Grupa 8

To jedno z dwóch rozwiązań z bardzo ciasną pętlą drukującą:

wprowadź opis zdjęcia tutaj

Że <działa jako oddział. Po dwukrotnym owinięciu 0trafienia @. 1z drugiej strony, najpierw przeskakuje ?, a następnie >przesyła go $ponownie do, więc przeskakuje @. Następnie IP owija się w turkusową ścieżkę, gdzie odbija się tam iz powrotem między >i <(owija się wokół krawędzi pomiędzy).

Grupa 10

Jedna z dwóch grup, które używają innych wskaźników instrukcji i jest absolutnie piękna. Sześciokąty mają 6 - każdy zaczyna się od innego rogu wzdłuż krawędzi zgodnej z ruchem wskazówek zegara, ale tylko jeden z nich jest aktywny na raz.

wprowadź opis zdjęcia tutaj

Jak zwykle czytamy ?. Teraz ~jest jednoargumentacja: zamienia on 1w -1. Następnie trafiliśmy na #. Jest to jeden ze sposobów przełączania między adresami IP: pobiera bieżącą wartość krawędzi modulo 6 i przełącza się na odpowiedni adres IP (adresy IP są ponumerowane 0zgodnie z ruchem wskazówek zegara). Więc jeśli dane wejściowe były 0, wtedy IP po prostu pozostaje takie samo i nudzi się prosto do przodu !@. Ale jeśli dane wejściowe były 1, to aktualna wartość jest taka, -1która jest 5 (mod 6). Przełączamy się więc na adres IP, który zaczyna się w tej samej komórce (zielona ścieżka). Teraz #nie ma opcji i ?ustawia krawędź pamięci na 0. )przyrosty, więc !drukuje a 1. Teraz uderzamy~ ponownie, aby to zapewnić#nadal nie działa (w przeciwieństwie do przełączania nas na IP 1, co kończy program). To niesamowite, jak dobrze wszystko pasuje do siebie w tym małym programie.

Grupa 22

Należy zauważyć, że jest to grupa, w której znajduje się moje oryginalne rozwiązanie. Zdarza się również, że jest to największa grupa, ponieważ brak operacji może znajdować się w dwóch różnych miejscach i istnieje kilka opcji dla rzeczywistego polecenia (efektywnego braku operacji).

Grupa 23

To druga grupa korzystająca z wielu adresów IP. W rzeczywistości ten wykorzystuje 3 różne adresy IP. W prawym górnym rogu jest trochę bałaganu, ale spróbuję przeprowadzić Cię przez to:

wprowadź opis zdjęcia tutaj

Tak więc początek, który widziałeś wcześniej: <odbija północno-wschodni, ?odczytuje dane wejściowe. Teraz ]jest inny sposób przełączania między adresami IP: przekazuje kontrolę do następnego adresu IP w kolejności zgodnej z ruchem wskazówek zegara. Przełączamy więc kontrolę na turkusową ścieżkę, która (wiem, że trudno ją zobaczyć) zaczyna się w narożniku północno-wschodnim i przechodzi na południowy wschód. Od razu odbija się to <tak, że owija się w południowo-wschodni róg, kierując się na północny zachód. To także uderza ]więc przejść do następnego OD. To jest szara ścieżka rozpoczynająca się we wschodnim rogu, prowadząca na południowy zachód. Drukuje dane wejściowe, a następnie zawija do północno-wschodniego rogu. <odchyla ścieżkę do poziomu, gdzie jest odbijana przez drugą < . Teraz prawa ręka<działa jak gałąź: jeśli dane wejściowe były0, IP przenosi się na północny wschód i opada na @. Jeśli dane wejściowe były 1, IP przesuwa się do !, zawija w lewą stronę, <gdzie jest odbijane ... teraz w rogu, zawija się z powrotem !, odbija się w prawo <, odbija w lewo, <a ścieżki zaczynają się koniec...

Całkiem bałagan, ale piękny bałagan. :)


Diagramy wygenerowane przez niesamowity HexagonyColorer Timwi .

Martin Ender
źródło
55
whoa. tylko whoa.
Conor O'Brien
6
^ zgodził się. Tak fajnie ...
El'endia Starman
28
Zamknij się i weź mój głos!
Mego
7
@ThomasOltmann Przyznaję, że ta odpowiedź zakłada podstawową znajomość języka. Jeśli naprawdę chcesz dowiedzieć się więcej na ten temat, zapoznałem się z podstawami tej odpowiedzi i tej odpowiedzi , ale nie będę cię winił, jeśli nie jesteś. ;)
Martin Ender
5
Tak ... model pamięci wygląda trochę bolesnie (ale chyba lepiej niż taśma 1D)
John Dvorak
144

Kod maszynowy Motorola MC14500B , 2 bajty

W hex:

58EC

Wyjaśnienie:

5  OR the register with input from the data bus
8  Write the register to the data bus
E  Skip next instruction if register is zero
C  Jump

Motorola MC14500B jest 1-bitowym mikrokontrolerem; ma jeden 1-bitowy rejestr i 1-bitową szynę danych. Ponieważ kody operacyjne mają po 4 bity, jest ich tylko szesnaście; połowa z nich wykonuje operację logiczną między rejestrem a bitem na szynie danych.

Instrukcja skoku ustawia flagę skoku; gdy nie podano adresu, zwykle ustawia się licznik programu na 0. Jeśli bit wejściowy wynosił zero, procesor nie skoczy. Jeśli bit wejściowy miał wartość 1, procesor przeskakuje z powrotem na początek; ponieważ korzystamy ORz wejścia, nie ma znaczenia, jaki będzie potem sygnał wejściowy - rejestr będzie miał 1 na zawsze.

Jak zwykle, rejestr jest inicjowany na 0.

Listę kodów operacyjnych można znaleźć w arkuszu danych lub tutaj .

lirtosiast
źródło
7
2 bajty to zdecydowanie minimum dla tego wyzwania.
Conor O'Brien
23
@ CᴏɴᴏʀO'Bʀɪᴇɴ Przez kilka godzin szukałem esolangów i list 4-bitowych procesorów, aby sprawdzić, czy jest 1 lub 1,5 i nie znalazłem.
lirtosiast
Zdecydowanie właściwe narzędzie do pracy.
Hugo Zink
Link jest zniszczony w bankomacie ...
TheDoctor,
@TheDoctor Oba linki działają dobrze dla mnie
Mego
85

Arnold C, 296 bajtów

IT'S SHOWTIME
    HEY CHRISTMAS TREE i    
    YOU SET US UP @NO PROBLEMO
    BECAUSE I'M GOING TO SAY PLEASE i
        STICK AROUND i
            TALK TO THE HAND i
        CHILL
    BULLSHIT
        TALK TO THE HAND i
    YOU HAVE NO RESPECT FOR LOGIC
YOU HAVE BEEN TERMINATED

Nie bardzo konkurencyjny, ale dla zabawy. Nie obsługuje stdin, wymienić @NO PROBLEMOsię @I LIEDdo wartości zerowej. @No Problemowynosi 1.

Uruchom z (zakładając, że plik ma wartość truemachine.arnoldc):

wget http://lhartikk.github.io/ArnoldC.jar
java -jar ArnoldC.jar truthmachine.arnoldc
java truthmachine
Usuń mnie
źródło
46
Piękny. Płakałem 10/10
spaghetto
10
BECAUSE I'M GOING TO SAY PLEASELOL
Eric Martinez,
8
Wygląda na to, że to robi if(i){while(i) print(i);} else {print(i);}Z pewnością byłoby to krótsze print(i);while(i) print(i);?
lirtosiast
16
Chociaż BULLSHITma duży wkład w wartość rozrywkową programu, technicznie nie jest to konieczne. Możesz uwzględnić całą BULLSHITgałąź, przechodząc TALK TO THE HAND iza nią YOU HAVE NO RESPECT FOR LOGIC.
gaborsch
4
@GaborSch Jest tylko jedna poprawna odpowiedź na to BULLSHIT
:;
65

Minecraft, 18 bajtów (wersja MC 15w45a)

szkic Minecraft

Jak widać, w powtarzającym się bloku poleceń znajduje się dźwignia, w której znajduje się polecenie say 1. Na wierzchu znajduje się sygnał odwracający pochodnię, który kieruje moc do bloku pojedynczego uruchomienia z poleceniem say 0w nim.

Ilekroć przełącznik jest skierowany w stronę prawdy, blok repeatera używa kodu say 1do wyprowadzania nieskończonych 1s. Gdy dźwignia zostanie przekierowana na false, wyprowadza pojedynczy 0.

Zauważ, że [@]domyślnie jest to wyjście a . Jeśli naprawdę chcesz po prostu zerować jedynki i zera, to staje się 34 bajtami, gdzie kod w blokach poleceń to tellraw @a [1]i tellraw @a [0]. Wykorzystuje to sugerowaną liczbę bajtów @ Cᴏɴᴏʀ O'Bʀɪᴇɴ dla MC, co można znaleźć w Meta .

Addison Crump
źródło
28
Używałeś gry wideo do golfa kodowego. +1
RK.
11
@RK. Jest to właściwie dość standardowa praktyka w przypadku prostych wyzwań. Istnieją co najmniej dwóch innych użytkowników, którzy używają MC jako języka golfowego - wypróbuj pasek wyszukiwania za pomocą is:answer Minecraft. c:
Addison Crump,
1
@FlagAsSpam lol ładnie wykonane. Dziękujemy również za wskazówkę dotyczącą wyszukiwania odpowiedzi MC.
Ashwin Gupta,
56

Narzędzia Bash + GNU, 13

grep 0||yes 1

Bash, 35

read n;for((;n;));{ echo 1;};echo 0
Cyfrowa trauma
źródło
3
Wiesz, zastanawiałem się, czy rozwiązanie bash z tak byłoby możliwe ...
spaghetto
2
Miły! To całkiem sprytne
spaghetto
38

Ruby, 20 lat

print while/1/||gets

Uruchom z wiersza poleceń, aby uniknąć ostrzeżeń, jak

ruby -e "print while/1/||gets" <<< 0
ruby -e "print while/1/||gets" <<< 1

Wyjaśnienie:

To jest mniej golfa

while /1/ || gets
  print
end

Kiedy Regexp jest używany w warunkach warunkowych, ocenia się go jako falsey, chyba że zmienna $_jest zapełniona i pasuje do wzorca. Za pierwszym razem przez pętlę $_jest pusty, więc przechodzimy do gets, który ustawia wartość $_do linii odczytanej ze STDIN. printbez drukowanych argumentów $_. Teraz ponownie oceniamy warunki warunkowe. Jeśli czytamy w 1, zwieramy i po prostu drukujemy 1 ponownie, i tak dalej. W przeciwnym razie przechodzimy do gets, ale ponieważ nie ma drugiego wiersza wejścia, getszwraca zero, więc pętla się kończy.

histocrat
źródło
18
To miłe, gdy trywialne zadania wciąż pozwalają na zadziwiające rozwiązania nawet w „normalnych” językach. :)
Martin Ender
Ta ||getsczęść jest fajna, ale czy nie możesz po prostu zrobić gets;print while/1/bajtu?
daniero
Nie, to w ogóle nie drukuje 0.
histocrat 28.08.16
37

Microscript, 3 bajty

i{p

Najkrótszy, jaki znam.

Wyjaśnienie:

i  Takes numeric input and puts it in register 1
{  while register 1 is truthy
  p  Print the contents of register 1

Po skasowaniu mikrokrypt ma niejawne drukowanie rejestru 1, co powoduje, że dane wejściowe 0są drukowane jeden raz.

spaghetto
źródło
@ quartata Dopasowałem cię: D
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ: O
spaghetto
2
Naprawdę zastanawiam się, czy najpierw napisałeś pytanie, czy odpowiedź ...
John Dvorak
1
Pytanie. Chciałem tylko to opublikować, ponieważ był to najkrótszy, jaki wymyśliłem podczas pisania pytania. Jest to katalog, więc nie ma żadnych prawdziwych zwycięzców.
spaghetto
36

Kod maszynowy Turinga, 32 bajty

Za pomocą składni tabeli reguł znajdującej się tutaj.

0 0 0 * halt
0 1 1 r 1
1 _ 1 r 1
SuperJedi224
źródło
Naprawdę to lubię. +1
spaghetto
Wiedziałem, że ktoś już to opublikował!
YoYoYonnY
25

JavaScript, 28 bajtów

Pętle są często krótsze niż pętle while.

alert(x)zwraca undefined, co jest fałszem, więc operator bitowy lub operator, rzutuje |na 0. Tak więc, jeśli xjest "0", zaalarmuj raz, w przeciwnym razie kontynuuj zapętlenie. Używa alertSTDOUT jak ta odpowiedź .

for(x=prompt();alert(x)|x;);
intrepidcoder
źródło
Strzelaj, pobiłeś mnie do tego. Właśnie miałem opublikować dokładnie to! :) GG
Domino,
Wow, to trochę mądrzejsze niż moje :) Miej +1!
ETHprodukcje
Nie potrzebujesz końcowego średnika.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Z jakiej przeglądarki korzystałeś? Przetestowałem to na Firefox i Chrome i dostaję SyntaxErrorbez niego.
intrepidcoder,
@intrepidcoder Och, przepraszam, mój zły. Mój umysł był w trybie „końcowe średniki są bezużyteczne”. ^^ "
Conor O'Brien
24

Python 2, 29 bajtów

a=input()
while 1:print a;1/a

Kończy się z włączonym błędem podziału 0, który jest domyślnie dozwolony .

xnor
źródło
Wyjście STDERR jest w porządku. Używa go również odpowiedź> <>.
spaghetto
To jest genialne ^ _ ^
ABcDexter
Czy podczas drukowania wydrukuje pracę? Przepraszam, nie znam Pythona.
Rohan Jhunjhunwala
1
@RohanJhunjhunwala Dla 0, nic by nie wydrukowało, ale powinno to wydrukować raz.
xnor
1
@ xnor oh, mój zły.
Rohan Jhunjhunwala
20

Brainfuck, 41 36 31 30 bajtów

Skrócono, drukując jeden raz zaraz po wprowadzeniu danych i przy pomocy Ethana i użytkownika46915.

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

Poprzednia wersja: odejmij 48 od wejścia, a jeśli nie jest zero, dodaj 1 do 48, aby wydrukować ASCII na 1zawsze, w przeciwnym razie wydrukuj 0.

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

Uruchomiłem go tutaj , ale z powodu buforowanego wyjścia nie widać żadnego wyjścia, ponieważ program nigdy się nie kończy 1.

Edycja: zapomniałem wydrukować 0na wejściu 0. Naprawiono teraz. Na końcu lubię te >.<twarze.

mbomb007
źródło
1
@ThomasKwa Chyba nie, ale nie jestem pewien, ponieważ nie widzę algorytmu specjalnie dla modulo 2. Algorytm divmod jest trochę długi.
mbomb007,
2
Możesz go jeszcze trochę skrócić, łącząc fragmenty kodu razem lepiej i bezpośrednio przy użyciu rejestru wejściowego zamiast osobnego rejestru „48”:,.[>+>+<<-]-[>-<-----]>+++[>.<]
Ethan
Podjęto próbę rozwiązania za pomocą mod 2. Zdecydowanie wygląda na to, że odjęcie 48 jest właściwą drogą. ,.[->+>+<<]>>[->[>-<[-]]>+[<+>-]<<]>[<<.>>]
cardboard_box
1
@ Promień Jest to ustawienie domyślne i zazwyczaj jest zakładane. Gdybym użył innej implementacji, powiedziałbym to.
mbomb007
1
Możesz uzyskać jeszcze jeden bajt, łącząc odejmowanie i kopiowanie razem:,.+++[->>+<-----<]>>---<-[>.<]
user46915
19

Piet, 27 18 16 kodów

(Codel to fantazyjna nazwa piksela używana w celu uniknięcia pomyłek podczas rozciągania obrazu do oglądania. Liczyłem kodery zamiast bajtów, ponieważ skrypty piet są zapisywane jako obrazy, więc rozmiar fizyczny może się różnić. Myślę, że idealny format pliku, który można zapisać ten plik tak efektywnie, jak to możliwe, zająłby 11 bajtów. W praktyce mój mały plik gif ma 62 bajty, z optymalnymi danymi palety. Powiedz mi, czy powinienem użyć tego jako rozmiaru mojego wpisu zamiast wielkości kodu.)

Oryginalny obraz: mała wersja

Powiększony: powiększona wersja

W trybie piet różnica między dwoma kolorami decyduje o tym, które polecenie zostanie uruchomione, więc dwukrotne zobaczenie tego samego koloru nie oznacza, że ​​wykonuje tę samą akcję. Wykonanie rozpoczyna się w lewym górnym kodzie. Następnie przesuwa się w poziomie, wykonując następujące czynności:

  1. Przeczytaj numer i umieść go na stosie
  2. Zduplikuj górę stosu
  3. Pop i wyślij górną część stosu
  4. Pop u góry stosu i obracaj tę liczbę razy zgodnie z ruchem wskazówek zegara.

Jeśli wartością wejściową było 1, kursor przesuwa się w dół do kodera limonki, który wypycha 1 na stos. Następnie egzekucja trwa nadal w lewo. Kiedy kursor przechodzi z koloru na biały i z białego na kolor, nic się nie dzieje. Ponieważ czarny jest również uważany za ściany, kursor wraca do kodera limonki w górnym wierszu i powtarza całą rzecz z kroku 2.

Jeśli jednak wartość wejściowa wynosiła 0, kursor nigdy nie spadnie w dół i skończy na niebieskim J po prawej stronie (zamierzona gra słów, było warto), jeśli pozostanie uwięziony (ponieważ góra, prawo, lewo i dolne boki tego bloku w kształcie litery J znajdują się obok czarnych kodów lub krawędzi obrazu). Ponieważ kursor jest w pułapce, wykonywanie się kończy.

Nieoczekiwane wartości:
jeśli użytkownik zapisze inną liczbę, nadal będzie drukowana, a następnie kursor będzie się obracał mniej więcej w zależności od wartości.

  • Wiele 4 lub 0: wykonywanie jest kontynuowane w poziomie i kończy się.
  • Wielokrotność 3: Ponieważ wchodzenie w górę jest niemożliwe, kursor natychmiast obraca się zgodnie z ruchem wskazówek zegara i kontynuuje poziomo, a następnie się kończy.
  • Wielokrotność 2, a nie wielokrotność 4: kursor obraca się i zaczyna przesuwać się w lewo. Na szczęście wszystko to polega na wykonaniu szeregu operacji, które nie wpływają na przebieg programu i kończą się opróżnianiem stosu. Jeśli nie można wykonać operacji, ponieważ stos jest pusty, jest po prostu ignorowany. Kiedy uderza w lewy górny róg, kursor nie ma dokąd pójść, ale znów w prawo, skutecznie ponownie uruchamiając program.
  • Inne wartości: Kursor przesuwa się w dół, jakby to było z 1, co powoduje, że drukuje 1 na zawsze. Jeśli wejście to 5, wyjście będzie5111111111111...

Każda wartość nie będąca liczbą całkowitą spowoduje zakończenie programu. Wykonanie będzie kontynuowane normalnie, ale wszystkie operacje zostaną zignorowane, ponieważ na stosie nie ma nic. W pewien sposób program nigdy się nie zawiesza - albo zatrzymuje się normalnie, albo zapętla na zawsze.


Wersja przyjazna dla PietDev

PietDev (bardzo podstawowy internetowy Piet IDE) wydaje się mieć problem z białymi kodami, dlatego stworzyłem nową wersję, która ręcznie obraca się z powrotem w górę, zamiast polegać na prawidłowym automatycznym obracaniu białego kodu. I nawet nie musiałem używać nowego koloru! Jeśli chcesz go przetestować, narysuj czarną ramkę wokół kodu, ponieważ PietDev nie obsługuje niestandardowych rozmiarów programów.

mała wersja

powiększona wersja


starsza wersja

Pierwsza wersja nie wypchnęła 1 z powrotem na stos i zamiast tego zapętliła poprzednią instrukcję duplikacji. Miał także ozdobne, bezużyteczne kody.

Mały wzór, który w rzeczywistości jest kodem piet

Wersja powiększona

Potem wpadłem na pomysł, aby nacisnąć 1 na stosie, aby usunąć pustą linię. To zabawne, jak o tym pomyślałem dzięki moim ozdobnym kodom.

mała wersja

duża wersja

Potem zdałem sobie sprawę, że mam obcy duplikat, który nie był już potrzebny, i zmniejszyłem liczbę kolorów, aby zaoszczędzić na danych palety na obrazie. Pozbyłem się również jednego ozdobnego kodu, ponieważ nie wiem.

Domino
źródło
7
Nigdy nie widziałem odpowiedzi Piet zdobytej w niczym innym niż kodele, ale myślę, że optymalna liczba bajtów jest również interesująca: :)
metro
1
Istnieje 20 różnych wartości kodowania, co oznacza, że ​​powinieneś być w stanie spakować trzy kody w 13 bitów, a następnie osiem tripletów w 13 bajtach, aby uzyskać gęstość pamięci wynoszącą 2,6 kodeli na bajt. Ale ktoś musi najpierw zdefiniować ten język. Sugeruję nazwę DPPi = gęsto upakowane ciasto.
John Dvorak,
1
@JanDvorak Zliczyłem 21 wartości, aby dodać specjalną dla podziału linii, a gdy już dostaniesz pierwszą linię podziału, parser może zgadnąć, gdzie powinny być pozostałe. Ale nie posunąłem się tak daleko do łączenia kodeli w trojaczki, co ma o wiele większy sens niż marnowanie 5 bitów na kodel. Sprytny.
Domino,
1
Po prostu dodaj wymiary jako pierwszą parę bajtów. Nie potrzebujesz dodatkowego symbolu.
John Dvorak,
1
@ każdy, kto chce to wypróbować: Nie wypróbuj tego rozwiązania z PietDev, ponieważ PietDev drukuje tylko jeden 1 i kończy działanie. Ale rozwiązanie działa poprawnie z npiet.
ML
19

Pyth 4 3) 2)

Wp

Jest nie! końcowe spacje (dzięki isaac :)). Kiedyś wymagana była przestrzeń do kompilacji pętli while, ale od tego czasu Pyth został zaktualizowany. Zwykle dyskwalifikuje to korzystanie z niego, ale ponieważ jest to katalog, powinien być ważny.

Wyjaśnienie:

Wp        : implicit Q = eval(input)
W         : while
 p        : print and return the value of Q, to be evaluated as the while condition
          : Functions without enough arguments automatically use Q now
          : do nothing in the body of the while loop
FryAmTheEggman
źródło
5
Ta odpowiedź zainspirowała mnie do dodania niejawnego passdo Pytha. Przestrzeń jest teraz niepotrzebna. pyth.herokuapp.com/?code=WpQ&input=0&debug=0
isaacg
52
Skrzyżowane cztery nadal wyglądają jak cztery.
Conor O'Brien,
1
Ech, tak mi się nudzi patrzenie, jak pyton cały czas dominuje :(. LOL.
Ashwin Gupta
1
@AshwinGupta mój język technicznie go pokonał, więc nie jest całkowicie dominujący :)
Cyoce
@Cyoce tak! Dobra robota! Zapewniam cię, że coś może pokonać Pyth Lol.
Ashwin Gupta,
16

Chip , 6 bajtów

e*faAs

Chip to język 2D, który zachowuje się trochę jak układ scalony. Pobiera dane wejściowe, jeden bajt na raz, i dzieli bity na poszczególne elementy wejściowe. Dane wyjściowe łączą wartości elementów wyjściowych z powrotem w bajty.

Rozbijmy to:

*jest sygnałem źródłowym, wyśle ​​prawdziwą wartość do wszystkich sąsiednich elementów. ei fodpowiadają piątemu i szóstemu bitowi wyjścia. Tak więc e*ftworzy binarny 00110000, który jest znakiem ASCII „0”.

Teraz Ajest pierwszym bitem wejściowym i apierwszym bitem wyjściowym, więc aAkopiuje ten bit z wejściowego na wyjściowy. Tak więc, w połączeniu z e*f, wejście ASCII „0” daje „0”, a „1” daje „1”. (Nie ma interakcji między fi a, ponieważ żaden nie wytwarza żadnego sygnału.)

Na skońcu, gdy zostanie aktywowany przez prawdziwy sygnał, zapobiegnie przejściu sygnału wejściowego do następnego bajtu, co oznacza, że ​​cała rzecz będzie działać ponownie z tym samym wejściem.

Ponieważ pierwszy bajt „0” ma wartość zero, nie aktywuje tego elementu, a program wypisze „0”, a tym samym wyczerpie swoje wejście, co pozwoli mu zakończyć. Jednak „1” aktywuje ten element, co oznacza, że ​​„1” jest wyprowadzane, ale nie jest zużywane na wejściu, umożliwiając powtarzanie cyklu w nieskończoność.

Jeśli wartości wyjściowe 0x0 i 0x1 są używane, a nie ASCII, możemy wyeliminować e*fczęść, co daje tylko 3 bajty :

aAs

Jeśli zero musi się samo zakończyć, zamiast oczekiwać, że stdin się zamknie, otrzymamy następujący wynik, który odwraca pierwszy bajt ~i przekazuje wynik do t, który kończy program ( 10 bajtów ):

aA~te*f
 s

( trównież nie wytwarza sygnału, więc nie ma interakcji między ti e.)

Phlarx
źródło
2
Niezła odpowiedź! Ponieważ jest to wyzwanie katalogowe, nie ma potrzeby oznaczać tego jako niekonkurującego, więc usunąłem ten kawałek. Witamy w PPCG!
Mego
4
Pozwoliłem sobie dodać Chipa do TIO. Wypróbuj online!
Dennis
@Dennis, pytanie do ciebie: jak mogę zmusić TIO do aktualizacji źródła? W zeszłym tygodniu naprawiłem błąd w interpretatorze Chipów, ale nie propagował zmiany w TIO. Czy to coś, o co muszę poprosić kogoś, aby dla mnie zrobił?
Phlarx,
Wyciągnąłem Chipa. Jeśli potrzebujesz czegoś zaktualizowanego, zostaw wiadomość w talk.tryitonline.net .
Dennis
14

Brainbool , 5 bajtów

,.[.]

Brainbool jest Brainfuck, ale działa tylko na bitach i wykonuje operacje wejścia / wyjścia 0i 1znaków.

lirtosiast
źródło
3
Wiedziałem, że musi istnieć pochodna BF, gdzie można to zrobić.
spaghetto
14
Wydaje mi się, że „Boolfuck” może być lepszą nazwą, ale dobrze zrobione niezależnie od tego.
James Murphy,
2
@JamesMurphy wydaje się, że istnieje już: esolangs.org/wiki/Boolfuck
DLeh
13

LOLCODE, 119 bajtów

GIMMEH n
n R SUM OF n AN 0
BOTH SAEM n AN 0, O RLY?
YA RLY
 VISIBLE 0
NO WAI
 IM IN UR l
  VISIBLE 1
 IM OUTTA UR l
OIC

Nie golfowany:

HAI

BTW, Read n as a string from STDIN and convert to an integer
GIMMEH n
n R SUM OF n AN 0

BTW, Test n for equality with 0
BOTH SAEM n AN 0, O RLY?
YA RLY
    BTW, Write 0 to STDOUT and exit
    VISIBLE 0
NO WAI
    BTW, Loop forever, printing 1
    IM IN YR l
        VISIBLE 1
    IM OUTTA YR l
OIC

KTHXBYE
Alex A.
źródło
1. Z którego tłumacza korzystasz? 2. Czy potrafisz MAEK n A NUMBRrzucić? 3. Czy możesz używać DIFFRINTzamiast BOTH SAEMi zmieniać warunki warunkowe?
lirtosiast
@ThomasKwa Korzystałem z LOLCOFFEE, tego z repl.it. (Wydaje się, że w tej chwili nie działa, więc przetestuję twoje sugestie, gdy zostaną ponownie utworzone.)
Alex A.,
Nie O RLY?rzuca się na boolean?
Leaky Nun
@LeakyNun Nie ...? O RLY?jest jak postfiks if.
Alex A.,
12

C, 37 bajtów

Inne podejście do tego, jak to zrobić w C.

main(c){for(gets(&c);putchar(c)&1;);}

cdomyślnie przyjmuje intwartość 1. gets(&c)pobiera ciąg znaków stdin, tutaj spychając wartość c, w sposób hackerski, ponieważ cnie jest to char*. putchar(c)wypisuje wartość cdo stdouti zwraca c. Ponieważ '0'jest 48 i '1'jest 49 w ASCII, możemy użyć ostatni kawałek ( &1), aby określić, który to jest. Jeśli tak '0', pętla pęka. W przeciwnym razie będzie trwać wiecznie.

Kompiluje (z ostrzeżeniem o gets) i działa w gcc-4.8systemie Linux.

Cbojar
źródło
2
Przypuszczalnie działa to tylko na architekturze little-endian.
Neil,
@ Nee Zakładam, że tak.
cbojar
@Neil Endianness wpływa tylko na kolejność bajtów w wartościach wielobajtowych.
LegionMammal978,
1
@ LegionMammal978 cdomyślnie intma wartość wielobajtową, a w architekturze big-endian getsustawi niepoprawny bajt.
Neil,
11

Labirynt , 7 bajtów

 ?+
@!:

Labirynt to język oparty na stosie 2D, w którym przepływ sterowania zależy od znaku górnego elementu stosu, sprawdzanego po każdej instrukcji. Wykonanie zaczyna się przesuwać w prawo od pierwszej ważnej instrukcji w górnym rzędzie, którą jest tutaj ?.

Odpowiednie instrukcje to:

?      Input integer
+      Add top two elements (Labyrinth's stack has infinite 0s on the bottom)
:      Duplicate top element
!      Output as number
@      Terminate program

Jeśli wartość wejściowa wynosi 0, adres IP odczytuje wartość wejściową za pomocą ?, dodaje dwie górne części stosu ( 0 + 0 = 0), a następnie duplikuje :i wyprowadza !wartość 0. W tym miejscu spotykamy jedyne połączenie w programie i musimy sprawdzić górę stosu, aby ustalić Gdzie iść. Ponieważ górna jest 0, idziemy do przodu i kończymy na @.

Z drugiej strony, jeśli wartością wejściową jest 1, wykonujemy tę samą instrukcję jak poprzednio (ale wypisujemy 1) przed dotarciem do skrzyżowania na !. Teraz wierzch stosu jest dodatni, co powoduje, że skręcamy w prawo w ?. Na EOF Labirynt wypycha 0, więc robimy to 0 + 1 = 1na +duplikacie :i wyjściu !. Ponownie mamy 1 na górze stosu i pętla trwa.

Aby uzyskać bonus, oto 7-bajtowe rozwiązanie @ MartinBüttner, które działa podobnie:

?+!@
1!

Zauważ, że w przeciwieństwie do większości języków, 1faktycznie wyskakuje nze stosu i wypycha n*10 + 1, co ułatwia tworzenie dużych liczb. Ponieważ jednak górna część stosu jest pusta, nie różni się niczym od pchnięcia 1.

Sp3000
źródło
10

> <> , 7 bajtów

i2%:n:,

Wykorzystuje to fakt, że> <> wypycha -1 na EOF, czyli 1 mod 2. Używa również dzielenia przez 0 do zakończenia (co najwyraźniej jest w porządku, ponieważ konsensus jest taki, że wyjście STDERR jest ignorowane).

Dla porównania, czyste wyjście bez błędów to dodatkowy bajt:

i2%:n?!;
Sp3000
źródło
10

APL, 6 bajtów

→⎕←⍣⍲⎕

Wyjaśnienie:

     ⎕ Read the input, then
 ⎕←    write it out
   ⍣   repeatedly
    ⍲  until NAND of it with itself becomes true.
→      Branch to zero to avoid printing the result again.
użytkownik46915
źródło
1
Czy druga i ostatnia postać mają wyglądać inaczej? Ponieważ nie są dla mnie.
John Dvorak
@JanDvorak Nie, są takie same.
Alex A.,
1
OK, teraz patrzę na to na telefonie komórkowym i wszystko oprócz dwóch strzał wygląda dla mnie tak samo :-D
John Dvorak
10

Brian & Chuck , 21 bajtów

,}<-{-?<SOH>_{+?
_>+{?<.p

Tutaj <SOH>należy zastąpić odpowiednim znakiem sterującym (0x01).

Wyjaśnienie

Podstawową ideą jest odjęcie kodu znakowego wejścia (48 lub 49) od pkońca Chucka, co da albo ?(co jest poprawną komendę) albo a, @który nie działa.

,wczytuje znak wejściowy do pierwszej komórki Chucka (oznaczonej _). Chcemy zmniejszyć tę wartość do 0pętli, jednocześnie wprowadzając inne zmiany:

}<przesuwa się do pi -zmniejsza. Następnie {wraca do -dekrementacji komórki wejściowej, która również. Dopóki nie jest to jeszcze zero, ?daje kontrolę Chuckowi. Teraz >przesuwa taśmę Briana o jedną komórkę w prawo (która jest inicjowana 1) i +zwiększa to. Następnie resetujemy pętlę za pomocą {?.

Do czasu trafienia pierwszej komórki Chucka 0, <SOH>komórka zostanie zwiększona do znaku, który odczytaliśmy ze STDIN i pbędzie ?do wprowadzania 1lub @wprowadzania 0.

Teraz ?nie przełącza już kontroli. Opcja „ 0lub 1po” oznacza brak operacji, podobnie jak bajt zerowy (reprezentowany przez _). {przesuwa się z powrotem do pierwszej komórki Chucka i +wykonuje przyrosty, aby upewnić się, że jest dodatnia, tak że ?ręce kontrolują Chucka.

Tym razem >+zwiększa komórkę po zakończeniu początkowej taśmy Briana. Ta komórka to śmieci, ale nigdy jej nie wykorzystamy. Teraz {nie skanuje do końca taśmy Briana, ale tylko do _. Dlatego ?nie ma możliwości, ponieważ obecna komórka ma zero. Następnie <.przesuwa jeden w lewo (kopia znaku wejściowego) i drukuje go.

Wreszcie napotykamy ?lub @. Jeśli dane wejściowe były, 0a ta komórka @to brak operacji, a program zostanie zakończony. Ale jeśli dane wejściowe były 1i ta komórka jest ?przekazywana Brianowi, który {+?zresetuje pętlę na Chucku, a teraz drukujemy na 1zawsze (dopóki liczba całkowita w komórce na końcu taśmy Briana nie pasuje do pamięci więcej, jak sądzę ...).

Premia

Sp3000 i ja grałem w golfa od kilku dni. Zaczęliśmy od około 40 bajtów i doszliśmy do dwóch zupełnie różnych, ale powiązanych rozwiązań, po 26 bajtów. Dopiero kiedy zacząłem pisać moje wyjaśnienie, przyszło mi do głowy powyższe 21-bajtowe rozwiązanie. Ogromne podziękowania dla Sp za podzielenie się pomysłami i nauczenie się kilku sztuczek golfowych w B&C. :)

Oto jego 26-bajtowe rozwiązanie:

>,----{?{>1?0
#I<?_}<.<<<?

A to jest moje:

,{>-<-?_0+?_1{<?
_®{?_{>.?

Gdzie ®jest bajt o wartości 174 (np. Po prostu zapisz plik jako ISO 8859-1).

W rdzeniu kopalnia działa podobnie do 21-bajtowego rozwiązania, w którym ®staje się }dla danych wejściowych 1i ~(bez 0operacji ) dla danych wejściowych , ale wykonanie jest znacznie mniej eleganckie.

Jego rozwiązanie jest całkiem fajne, ponieważ kod źródłowy jest tylko ASCII i że nie wymaga pętli do przetworzenia danych wejściowych. Zamiast tego ----zamienia się 1w -i 0w ,(no-op dla Chucka). To -zmieni pierwszą ?taśmę Briana w a >, tworząc w ten sposób inny przepływ sterowania dla 1skrzynki.

Martin Ender
źródło
10

Bitowy cykliczny znacznik , 3 bity lub <1 bajt

Bitowy cykliczny tag jest jednym z najprostszych dostępnych języków Turinga. Działa z dwoma ciągami bitów, programem i danymi . Bity programu są odczytywane cyklicznie i interpretowane w następujący sposób:

  • 0: Usuń pierwszy bit danych (i wyślij go w implementacjach, które mają wyjście).
  • 1x: Jeśli pierwszym bitem danych jest 1, dołącz x(reprezentujący albo 0lub 1) na końcu danych. (Jeśli pierwszy bit danych to 0, nic nie rób.)

Program działa, dopóki ciąg danych nie będzie pusty.

Maszyna prawdy

110

Gdy ciąg danych jest ustawiony na 0:

  • 11nie dołącza niczego, ponieważ nie jest to pierwszy bit danych 1.
  • 0usuwa / wyjścia 0.
  • Łańcuch danych jest teraz pusty i program zatrzymuje się.

Gdy ciąg danych jest ustawiony na 1:

  • 11dołącza 1.
  • 0usuwa / wyjścia 1.
  • Ciąg danych powrócił do jednego, 1a program powrócił do miejsca, w którym się zaczął, więc zapętlamy na zawsze.
DLosc
źródło
9

GNU sed, 10

:;/1/{p;b}

Wyjaśnienie

  • : zdefiniuj nienazwaną etykietę
  • /1/Jeśli wejście pasuje do wyrażenia regularnego 1, to
  • p wydrukuj przestrzeń wzoru (tj. 1)
  • b i wróć do nienazwanej etykiety (na zawsze)
  • Jeśli wejście nie było 1 (tj. 0), wówczas przestrzeń wzoru jest drukowana w niezmodyfikowany sposób i program się kończy.
Cyfrowa trauma
źródło
Ogol 1 znak za pomocą :;p;/1/bi flagi n , w sumie 9 bajtów. Ponieważ i sed -ftak jest używany do uruchomienia pliku skryptu, dodanie tej dodatkowej flagi nie wymaga 2 bajtów.
seshoumara,
9

Poważnie , 4 3 bajty

Przekreślone 4 to wciąż 4 :(

,W■

,odczytuje wartość ze STDIN. Wuruchamia pętlę, która działa, gdy wartość na szczycie stosu jest zgodna z ciałem . drukuje element górnego stosu bez wyskakiwania. Pętla jest domyślnie zamknięta w EOF.

Na wejściu 0pętla nigdy się nie uruchamia (ponieważ 0jest to falsey), a program kończy się na EOF, automatycznie wyskakując i wypisując każdą wartość na stosie. Na wejście 1(lub wartość, która nie ma 0, ""lub []), pętla działa w nieskończoność.

W rzeczywistości , wiodące ,nie jest potrzebne (dzięki niejawnemu wprowadzeniu), co zmniejsza wynik do 2 bajtów.

Mego
źródło
8

Czw. 34 bajty

1::=12
2::=~1
0::=~0
@::=:::
::=
@

Wyjaśnienie:

1::=12 Instancje podłańcucha „1” mogą mieć postać „12”

2::=~1 Wystąpienia podciągu „2” można usunąć, drukując „1”

0::=~0 Instancje podłańcucha „0” można usunąć, drukując „0”

@::=::: Instancje podłańcucha „@” można zastąpić ciągami z danych wejściowych

::= Koniec listy reguł podstawiania

@ Początkowy ciąg to „@”

SuperJedi224
źródło
8

Arnold C, 134 bajty

IT'S SHOWTIME
HEY CHRISTMAS TREE i
YOU SET US UP 0         //or 1
STICK AROUND i
TALK TO THE HAND 1
CHILL
TALK TO THE HAND 0
YOU HAVE BEEN TERMINATED

Chociaż nie jest to tak zabawne jak inne odpowiedzi ArnoldC , jest w golfa. Na przykład wcięcie nie jest konieczne, podobnie jak makra @NO PROBLEMOi @I LIED.

Przetestowano z tą wersją języka , która nie może przyjmować danych wejściowych.

lirtosiast
źródło
8

Cubix , 5 6 bajtów

Cubix to nowy, dwuwymiarowy język @ETHproductions, w którym polecenia są owijane wokół ścian sześcianu. Tłumacz online Dzięki @ETHproductions dla oszczędności.

!I\@O

To kończy się rozszerzeniem do kostki

  !
I \ @ O
  .

To zaczyna się od Ipolecenia. Wprowadź liczbę całkowitą na stos.
\, przekierowuje wskaźnik instrukcji w dół nad no op.
O, wyświetla wartość liczbową początku stosu.
!, pomiń następną komendę ( @), jeśli true na szczycie stosu. Spowoduje to przeskok \przekierowania, jeśli 1
\, przekieruje wskaźnik instrukcji do @programu obsługi wyjścia.

Wykorzystuje to fakt, że stos nie jest otwierany przez O ? !polecenia.

MickyT
źródło
Miły. Naprawdę cieszę się, że ktoś inny używa mojego języka :) Mam inne 6-bajtowe rozwiązanie, które wykorzystuje tylko 5 instrukcji (plus brak operacji), więc może to opublikuję.
ETHprodukcje
@ETHproductions na pewno to opublikuje.
Wydaje
Możesz zapisać bajt, usuwając ?i po prostu używając !:!I\@O
ETHprodukcje
@ETHproductions bardzo ładne
MickyT
1
Napisałem brute-Forcer tego (ostrzeżenie: zawiesza przeglądarkę na minutę lub dwie), który pojawia się z dokładnie pięciu roztworów 5-bajtowych: @IOw!, @I?Ov, @!IOw, !IOW@,!I\@O
ETHproductions
7

Foo , 6 bajtów

&1($i)

Wejście jest zakodowane jako drugi znak, ponieważ Foo nie ma wejścia STDIN. Czy nie zgadzamy się, że Foo jest teraz niesamowite? :)

Wyjaśnienie

&1          Set current cell to 1
  (  )      Do-while loop (or, at least according to the interpreter)
   $i       Print current cell as int
Sp3000
źródło
2
Zawsze lubiłem Foo.
spaghetto
7

Perl, 18 + 1 = 19 13 + 1 = 14 bajtów

print while$_

Uruchom tak:

echo -n NUM | perl -p truth.pl

Dzięki ThisSuitIsBlackNot (który jest lepszy w golfie w Perlu ode mnie) za grę w golfa na pięć bajtów.

spaghetto
źródło
2
Modyfikatory instrukcji są twoim przyjacielem! Ponadto, jeśli upewnisz się, że na wejściu nie ma końcowego nowego wiersza, możesz upuścić +0: echo -n 0 | perl -pe'print while$_'(13 bajtów + 1 dla -p). perl -M5.010 -pe'say while$_'byłby jeszcze krótszy, ale skutkuje to niespójnymi
znakami
@ThisSuitIsBlackNot Ah-ha! Próbowałem wydrukować podczas $ _, ale nie mogłem zrozumieć, dlaczego to nie działa. Nie zdawałem sobie sprawy, że na wejściu nie ma końca nowej linii.
spaghetto
Tak, ciąg 0jest fałszywy, ale 0+ nowa linia jest prawdą. Zobaczyć perldoc perlsyn.
ThisSuitIsBlackNot
2
sayjest krótszy, nawet jeśli liczysz -Ejako dodatkowy bajt.
Dennis
2
@Dennis ... które właśnie sobie uświadomiłem, można naprawić za pomocą -l: perl -lpE 'say while$_'(11 bajtów + 2 dla -lp).
ThisSuitIsBlackNot
7

> <> , 6 bajtów

::n?!;

Przesuwa dane wejściowe na stosie, aby rozpocząć

:        copy top element on stack
 :       copy top element on stack again
  n      pop and outputs top element
   ?     condition trampoline - pops top element, if it is zero skips next instruction
    !    trampoline skips next instruction
     ;   finish execution
Blake Lockley
źródło
1
Tutaj w PPCG kochamy nasze wyjaśnienia. +1
spaghetto
3
Jestem prawie pewien, że działa to tylko z dosłownymi wejściami 0 i 1, kiedy powinno działać z 48 ( '0') i 49 ( '1'). Czy się mylę?
undergroundmonorail
@ quartata Gdybym to ja powiedziałbym, że aby być uczciwym wobec odpowiedzi, które korzystają z bardziej tradycyjnych metod pozyskiwania danych wejściowych, powinieneś umieścić 48 lub 49 na stosie. To jednak twoje wyzwanie i tak naprawdę nie jest to wielka sprawa, więc ¯ \ _ (ツ) _ / ¯
undergroundmonorail
2
Jest z tym kolejny problem: jeśli stos jest wstępnie zapełniony, musisz dodać 3 bajty dla -vflagi.
El'endia Starman
1
@Aaron: Dla tego, co jest warte, ja też myślałem, że to 2 bajty -v, a potem zostałem poprawiony. Więc nie jesteś jedyny. :)
El'endia Starman