Napisz tłumacza dla *


20

Zadanie jest proste. Napisz tłumacza języka * .

Oto większy link do wiki.

Istnieją tylko trzy prawidłowe * programy:

  • * Drukuje „Hello World”
  •  *  Drukuje liczbę losową z przedziału od 0 do 2 147 483 647
  • *+* Działa wiecznie.

Trzeci przypadek musi być nieskończoną pętlą zgodnie ze specyfikacjami w tym pytaniu

Wejście:

  • Dane wejściowe można pobierać dowolną akceptowalną metodą wprowadzania danych, stosując nasze standardowe reguły we / wy
  • Zawsze będzie to jeden z powyższych programów

Wynik:

  • Pierwszy przypadek powinien zostać wydrukowany dokładnie Hello World, z lub bez znaku końca linii.
  • W drugim przypadku, jeśli maksymalna liczba całkowita twojego języka jest mniejsza niż 2 147 483 647, użyj maksymalnej liczby całkowitej twojego języka
  • Pierwszy i drugi przypadek mogą być drukowane na dowolnym akceptowalnym wyjściu według naszych standardowych reguł I / O.
  • Trzeci przypadek nie powinien dać żadnego wyniku.

Punktacja:

Ponieważ jest to , wygrywa najkrótsza odpowiedź w bajtach.


7
Kiedy mówisz „pomiędzy” 0i 2,147,483,647„ czy ” jest to włączające czy wyłączne? (Np. Czy jest 0to prawidłowy wynik?)
Chas Brown,

7
Zmiana specyfikacji po opublikowaniu wyzwania i unieważnienie istniejących rozwiązań jest -1ode mnie automatyczna .
Kudłaty

2
Czy dla języków, które nie mają wbudowanego sposobu generowania liczb losowych, istnieje akceptowalny sposób spełnienia wymogu „wydrukuj liczbę losową”?
Tanner Swett,

2
Jeśli liczby całkowite w naszym języku nie mają wartości maksymalnej lub wyższej, czy możemy zastosować wyższą górną granicę?
Jonathan Allan,

7
@Shaggy Nie widzę żadnych zmian reguł w wiki dla pytania, tylko spacja do niełamliwego spacji (sprawdź zakładkę Markdown), ponieważ mechanizm renderujący SEdown nie renderował go, ale patrzył na oryginalną wersję , jasne jest, że powinny to być normalne spacje, a „hack” jest wykonywany tylko w przypadku problemów z rendererem
znaczników

Odpowiedzi:


20

* , 0 bajtów


Ponieważ * nie ma możliwości odczytu danych wejściowych, domyślne reguły pozwalają określić, że dane wejściowe należy podać, łącząc je z programem .

(... myślę. Istnieje warunek „co najmniej dwa razy więcej głosów pozytywnych niż głosów negatywnych” , którego nie mam do zweryfikowania przez przedstawiciela).


4
Twoje połączone meta jest rzeczywiście akceptowanym obecnie standardem witryny (+31–7).
Jonathan Allan

2
@A__: Wydaje mi się, że musiało to być specjalnie zaprojektowane, aby spełnić proponowaną przez kogoś definicję „języka programowania” („Możesz napisać witaj świecie!” „Możesz napisać nieskończoną pętlę!” „Możesz napisać program, który nie zawsze rób to samo! ”).
hmakholm pozostawił Monice

Uważam, że technicznie Malbolge również nie jest językiem programowania.
Bob Jansen

1
Malbolge to język programowania automatów skończonych, taki sam jak *, i na przykład Befunge-93. Dlatego Malbolge jest formalnym językiem programowania, takim samym jak *, technicznie takim samym jak rekurencyjnie wyliczalne języki, jeśli chodzi o definicję języka programowania (choć języki formalne są słabsze).
Krzysztof Szewczyk

Oddaj ode mnie opinię, bo szczerze mówiąc, ta odpowiedź jest tak nudna, że ​​w rzeczywistości jest to już standardowa luka , nawet jeśli zignorujemy pytanie, czy * jest językiem programowania
AlienAtSystem

8

R , 69 bajtów

switch(scan(,""),"*"="Hello, World!"," * "=sample(2^31,1)-1,repeat{})

Wypróbuj online!

switchpróbuje dopasować nazwane argumenty, a jeśli nie ma dopasowania, wybiera pierwszy nienazwany po pierwszym, którym w tym przypadku jest nieskończona pętla repeat{}.


6

Galaretka ,  21  20 bajtów

ḊOSØ%HX’¤“½,⁾ẇṭ»¹Ḃ¿?

Monadyczny link akceptujący listę znaków.

Wypróbuj online!

vL’... działa również (patrz poniżej).

W jaki sposób?

ḊOSØ%HX’¤“½,⁾ẇṭ»¹Ḃ¿? - Link: list of characters   e.g.: "*"        or  " * "    or  "*+*"
Ḋ                    - dequeue                          ""             "* "         "+*"
 O                   - to ordinals                      []             [42,32]      [43,42]
  S                  - sum                              0              74           85
                   ? - if...
                  ¿  - ...if-condition: while...
                 Ḃ   -    ...while-condition: modulo 2  0              0            1
                ¹    -    ...while-true-do: identity                                85
                     -                                  0              74           (looping)
        ¤            - ...then: nilad followed by link(s) as a nilad:
   Ø%                -    literal 2^32                                 2^32
     H               -    half                                         2^31
      X              -    random integer in [1,n]                      RND[1,2^31]
       ’             -    decrement                                    RND[0,2^31)
         “½,⁾ẇṭ»     - ...else: dictionary words        "Hello World"

Alternatywny

vL’... - Link: list of characters                 e.g.: "*"        or  " * "    or  "*+*"
 L     - length                                         1              3            3
v      - evaluate (left) as Jelly code with input (right)
       -                                                1^1            3^3          (3^3+3)^3
       -                                                1              27           27000
  ’    - decrement                                      0              26           26999
   ... - continue as above                              "Hello World"  RND[0,2^31)  (looping)

5

C (gcc) , 66 63 bajtów

Dzięki attinat za -3 bajty.

Muszę tylko sprawdzić drugi znak: jeśli ustawiony jest LSB, to jest to +( a więc program to „ *+*”) i program się zapętla. Następnie, jeśli jest NUL, program był „ *” i wyświetla się Hello World; w przeciwnym razie wyświetla losową wartość („  * ”, jedyna pozostała opcja.)

f(char*s){for(s++;*s&1;);printf(*s?"%d":"Hello World",rand());}

Wypróbuj online!



f(char*s){*++s&1?f(s-1):printf(*s?"%d":"Hello World",rand());}
Ogol

Uwaga pedantyczna: randnie gwarantuje się zwrócenia wystarczająco dużej wartości; RAND_MAXi INT_MAXnie ma gwarancji, że będą takie same (i nie są dostępne w kompilatorach świata rzeczywistego, np. Visual Studio's RAND_MAXjest 32767, podczas gdy INT_MAX[na nowoczesnych systemach pochodnych x86] jest 2147483647wartością określoną w pytaniu PO).
ShadowRanger

@ShadowRanger to prawda, ale biorąc pod uwagę, że> 90% wszystkich wpisów CGCC opartych na C opiera się na niezdefiniowanym i nieokreślonym zachowaniu, nie martwię się o to! Nie miałem też dzisiaj ochoty na grę LCG w golfa. :-)
ErikF

5

Python 2 , 103 93 89 87 bajtów

I w połączeniu z moją wcześniejszą odpowiedź Chas Browns męska odpowiedź i coś kilka bajtów krótszy.

Liczba losowa będzie wynosić od 0 do 2 ** 31-1 włącznie.

from random import*
i=input()
while'*'<i:1
print["Hello World",randrange(2**31)][i<'!']

Wypróbuj online!

Poprzednie wersje:

103 bajty

from random import*
exec['print"Hello World"','while 1:1','print randint(0,2**31-1)'][cmp(input(),'*')]

93 bajty

from random import*
i=cmp(input(),'*')
while i>0:1
print["Hello World",randint(0,2**31-1)][i]

Zaoszczędź 2 bajty, zastępując randint(0,2**31-1)je randrange(2**31).
Chas Brown,

while'*'<isaves 2
Jonathan Allan

Zapisz kolejny bajt, zmieniając randrange(2**31)na getrandbits(31)(ten ostatni zwraca long, intale nie , ale printwydrukuje strformularz, a nie reprformularz, więc Lnie będzie końca).
ShadowRanger

Stosunkowo niedoświadczony z witryną, więc szybkie wyjaśnienie: czy możesz żądać podania swoich danych? i=input()działa tylko wtedy, gdy dane wejściowe są cytowane, jeśli wpiszesz zwykły */ * /*+*, umrze z SyntaxError(ponieważ inputzawiera niejawne eval); musisz wpisać '*'/' * '/'*+*'(lub równoważny z podwójnymi cudzysłowami). Nie widziałem niczego oczywistego w standardowych regułach I / O, które by na to pozwalały, co może oznaczać, że będziesz musiał użyć raw_input(), kosztując cztery bajty.
ShadowRanger

@ShadowRanger input()pobiera ciąg wejściowy i ocenia go. Tak naprawdę nie dodam do danych wejściowych, po prostu biorę ciąg znaków jako dane wejściowe, a łańcuchy mają cudzysłowy. Jest to dość standardowe, w ten sam sposób, w jaki mogę wziąć tablicę [1,2,3]zamiast jako ciąg rozdzielany, który następnie muszę podzielić i przeanalizować. Celem witryny nie jest ścisłe wprowadzanie danych, ale ułatwienie wejścia / wyjścia, abyśmy mogli skoncentrować kod na danym wyzwaniu.
mbomb007

5

Keg , -lp, -ir 30 26 25 24 20 19 bajtów

!1=[_“H%c¡“| =[~.|{

-1 bajt za pomocą flag

Wypróbuj online!

Historia odpowiedzi

?!1=[_“H%c¡“| =[~.|{

Wypróbuj online!

Skrócony Hello Worlddo ciągu słownika

!1=[_Hello World| =[~.|{

Wypróbuj online!

Nigdy nie przestałem się dziwić potędze Keg. Kredyty dla użytkownika EdgyNerd dla innego zapisanego bajtu.

Poprzednie wersje

_!0=[Hello World|\*=[~.|{

Wypróbuj online!

Kredyt dla użytkownika A__ za zapisany dodatkowy bajt.

Stara wersja

?!1=[_Hello World| =[__~|{

Zasadniczo pobiera program wejściowy i:

  • Sprawdza, czy długość wejściowa wynosi 1, jeśli to prawda, wypisuje „Hello World”
  • Sprawdza, czy ostatni znak jest spacją, i drukuje losową liczbę
  • W przeciwnym razie działa nieskończona pętla

Następnie niejawnie wydrukuj stos.

?                               #Get input from the user
 !1=                            #Compare the stack's length to 1
    [_Hello World           #Push "Hello, World!" to the stack
                     | =        #See if top item is a space
                        [__~|{  #If so, generate a random number, otherwise, infinite loop.

4 bajty zapisane ze względu na fakt, że witaj świecie, nie potrzebujesz interpunkcji.

Wypróbuj online! Stara wersja

Wypróbuj online! Nowa wersja


Możesz odciąć 4 bajty, nie potrzebujesz przecinka ani wykrzyknika w „Hello World”.
TheOnlyMrCat

1
Teraz muszę nauczyć się innego niepopularnego języka, aby normalnie odpowiadać na wyzwania.

1
-1 bajty: TIO . Cieszę się, że nie straciłem umiejętności gry w golfa w Keg.

@A__ Podoba ci się Keg na TIO?
Jono 2906,


3

Befunge-93 , 54 bajty

~"*"-_~1+#^_"dlroW olleH">:#,_@.%*2**:*::*88:*`0:?1#+<

Wypróbuj online!

Adnotacja:

~"*"-                      _                ~1+                   #^_        "dlroW olleH">:#,_    @      .%*2**:*::*88:   *`0:             ?1#+<
Compare first      If equal, go right       Compare second       If equal,        Output          Exit    Modulo by 2^31   If less than      Add 1
character to       Otherwise, go left       character to       loop forever   "Hello World"                 and output     0, multiply     a random amount
'*'                and wrap around          -1 (EOF)                                                                         by 0            of times

Losowość nie jest jednolita. Przy każdym wzroście istnieje 50% szans na zatrzymanie przyrostu.


3

Japt , 22/25 bajtów

Pierwsze rozwiązanie dotyczy oryginalnej specyfikacji, która miała *<space>jako drugi program, a drugie dotyczy zaktualizowanej specyfikacji, która arbitralnie ją zmieniła <space>*</space>, dzięki EoI za sugerowaną „poprawkę”.

Oba generują błąd przepełnienia po wejściu w nieskończoną pętlę trzeciego programu, ale teoretycznie przy wystarczającej pamięci (którą możemy założyć na potrzeby ) działałby wiecznie.

Å?¢?ß:2pHÉ ö:`HÁM Wld

Wypróbuj program 1
Wypróbuj program 2
Wypróbuj program 3

Å?UÎ>S?ß:2pHÉ ö:`HÁM Wld

Wypróbuj program 1
Wypróbuj program 2
Wypróbuj program 3


Myślę, że drugim programem jest „[SPACE] * [SPACE]”, a nie „[SPACE] *”, więc twój program nie działa
wcielenie ignorancji

@EmbodimentofIgnorance, kiedy pisałem, drugi program w specyfikacji był *<space> . Nie masz czasu na aktualizację teraz.
Kudłaty

Możesz to naprawić w trzech bajtach UÌ>Szamiast ¢w drugim trójskładniku
Embodiment of Ignorance

@Downvoter, prosimy o uprzejmość w pozostawieniu komentarza.
Kudłaty

2

JavaScript (ES7), 66 bajtów

s=>s[1]?s<'!'?Math.random()*2**31|0:eval(`for(;;);`):'Hello World'

Wypróbuj online! (Witaj świecie)

Wypróbuj online! (Liczba losowa)

Wypróbuj online! (nieskończona pętla)


Czy x=(z=>x())&&x()nie działałoby dla -1 bajtów z nieskończonego kodu pętli, zakładając, że przeglądarka nie ma maksymalnego rozmiaru stosu wywołań?
Geza Kerecsenyi

@GezaKerecsenyi Możemy po prostu zadzwonić do siebie (w ten sposób ), ale nie jestem pewien, czy byłoby to do przyjęcia.
Arnauld

to uczciwe. Zastanawiam się, czy istnieje jakaś niejasna przeglądarka, która po prostu działa (przynajmniej do wyczerpania pamięci RAM)
Geza Kerecsenyi

1
@Arnauld, teoretycznie, działałby wiecznie, biorąc pod uwagę nieskończoną pamięć, którą możemy założyć dla kodu golfa.
Kudłaty

2

Galaretka , 23 21 bajtów

OS¹Ḃ¿ịØ%HX’;““½,⁾ẇṭ»¤

Wypróbuj online!

Łącze monadyczne, które przyjmuje pojedynczy argument i zwraca Hello World, losową 31-bitową liczbę całkowitą lub nieskończoną pętlę zgodnie ze specyfikacją.

Wszystkie opcje: * * *+*

Wyjaśnienie

O                     | Convert to codepoints
 S                    | Sum
  ¹Ḃ¿                 | Loop the identity function while odd 
     ị              ¤ | Index into the following as a nilad:
      Ø%              | - 2 ** 32
        H             | - Halved
         X            | - Random integer in the range 1..2**31
          ’           | - Decrease by 1 
           ;          | - Concatenated to:
            ““½,⁾ẇṭ»  |   - "", "Hello World"








1

Węgiel drzewny , 30 bajtów

W№θ*F⁼θ*≔Hello Worldθ∨θI‽X²¦³¹

Wypróbuj online! Link jest do pełnej wersji kodu. Nadużywa domyślnego formatu wejściowego Charcoal, który dzieli się na spacje, jeśli jest tylko jedna linia, a zatem wprowadzanie liczb losowych w rzeczywistości wygląda jak trzy wejścia. Wyjaśnienie:

W№θ*

Powtórz, gdy pierwsze wejście zawiera *.

F⁼θ*

Jeśli pierwsze wejście jest *tylko ...

≔Hello Worldθ

... następnie zamień na Hello World, powodując zakończenie pętli. *+*nie zostanie zastąpiony, co spowoduje nieskończoną pętlę.

∨θ

Jeśli pierwsze wejście nie jest puste, wyślij je.

I‽X²¦³¹

Ale jeśli jest pusty, wypisz losową liczbę całkowitą w żądanym zakresie.


1

Dodaj ++ , 78 bajtów

z:"Hello World"
`y
xR2147483647
x:?
a:"*"
b:" * "
c:"*+*"
Ix=a,Oz
Ix=b,O
Wx=c,

Wypróbuj online!

Wyjaśnienie

z:"Hello World"	; Set z = "Hello World"
`y		; Set y as the active variable
xR2147483647	; Set y to a random number between 0 and 2147483647
x:?		; Set x to the input
a:"*"		; Set a = "*"
b:" * "		; Set b = " * "
c:"*+*"		; Set c = "*+*"
Ix=a,		; If x == a then...
	Oz	;	...output z
Ix=b,		; If x == b then...
	O	;	...output y
Wx=c,		; While x == c then...
		;	...do nothing

1

Brachylog , 26 23 bajtów

l₃∈&hṢ∧2^₃₁-₁ṙw∨Ḥ⊇ᶠ³⁶tw

Wypróbuj online!

Pobiera program jako ciąg znaków przez zmienną wejściową i ignoruje zmienną wyjściową. Mocno wykorzystuje gwarancję, że dane wejściowe są zawsze tylko jednym z trzech poprawnych programów: każde wejście o długości trzy będzie zachowywać się tak samo, jak " * "i "*+*"zależnie od tego, czy pierwszy znak jest spacją, a każde inne dane wejściowe będą się zachowywać "*".

l₃                         The input has length 3
  ∈                        and is an element of something,
   &h                      and the input's first element
     Ṣ                     is a space
  ∈                        (if not, try some other thing it's an element of),
      ∧2^₃₁-₁              so take 2,147,483,647 and
             ṙw            print a random number between 0 and it inclusive.
               ∨           If the input's length isn't 3,
                Ḥ⊇ᶠ³⁶tw    print the 36th subsequence of "Hello, World!".

Ups, błędne „Hello World” - naprawianie teraz
Niepowiązany ciąg

1

PHP , 51 bajtów

for(;'*'<$l=$argn[1];);echo$l?rand():'Hello World';

Wypróbuj online! (Witaj świecie)

Wypróbuj online! (Liczba losowa)

Wypróbuj online! (Nieskończona pętla)

Zajmuje drugie charakter wejścia, które mogą być '', '*'albo '+'. W przypadku, '+'gdy '*'<'+'będzie to prawdą, a pętla będzie nieskończona, w przeciwnym razie po pętli zostanie wyświetlony „Hello World” lub liczba losowa. rand()Automatycznie generuje liczbę między 0 a getrandmax()które zastosowania zdefiniowanych RAND_MAXw standardzie biblioteki C i domyślnie 2147483647na większość platform / środowisk, włącznie TIO.


1

05AB1E , 21 bajtów

'*KgDi[ë<ižIL<Ω딟™‚ï

Wypróbuj online. (UWAGA: losowe budowanie jest dość wolne z dużymi listami, więc może upłynąć trochę czasu, zanim wynik zostanie podany).

Wyjaśnienie:

'*K           '# Remove all "*" from the (implicit) input
   g           # Get the length of what's remain (either 0, 1, or 2)
    D          # Duplicate this length
     i         # If the length is exactly 1:
      [        #  Start an infinite loop
     ë<i       # Else-if the length is 2:
        žI     #  Push builtin 2147483648
          L    #  Create a list in the range [1,2147483648]
           <   #  Decrease each by 1 to make the range [0,2147483647]
            Ω  #  Pop and push a random value from the list
               #  (after which the top of the stack is output implicitly as result)
     ë         # Else:
      ”Ÿ™‚ï    #  Push dictionary string "Hello World"
               #  (after which the top of the stack is output implicitly as result)

Zobacz moją wskazówkę 05AB1E (sekcja Jak korzystać ze słownika? ), Aby zrozumieć, dlaczego tak ”Ÿ™‚ïjest "Hello World".


1

Pyth , 32 bajty

It/Jw\*#;?tlJOhC*4\ÿ"Hello World

Wypróbuj online!

Objaśnienie (Python-ish)

I                                   # if 
  /Jw\*                             #    (J:=input()).count("*"))
 t                                  #                             - 1:
       #;                           #     try: while True: pass;except: break;
         ?                          # if (ternary)
           lJ                       #    len(J):
             O                      #     randInt(0,                    )
               C                    #                int(     , 256)
                *4\ÿ                #                    4*"ÿ"
              h                     #                                + 1
                    "Hello World    # else: (implicitly) print "Hello World"

To wypisuje liczbę od 0 do 2 ^ 32, a nie od 0 do 2 ^ 31. Krótszy sposób pisania hC*4\ÿto ^2 32, ale aby rozwiązanie było poprawne, powinieneś użyć ^2 31zamiast tego. Również użyj zzamiast Jw, zapisuje 1 bajt więcej. Twoje wyjaśnienie pomija linię z twcześniej lJ.
randomdude999

Ponadto można wykryć polecenie „zapętlone na zawsze”, sprawdzając, czy dane wejściowe zawierają jakiś +znak, zapisuje 1 bajt, ponieważ nie trzeba go zmniejszać.
randomdude999

0

APL (Dyalog Unicode) , 39 bajtów SBCS

Anonimowy przedrostek lambda.

{'+'∊⍵:∇⍵⋄' '∊⍵:⌊2E31×?0'Hello World'}

Wypróbuj online!

{ „dfn”; jest argument:

'+'∊⍵: jeśli plus jest członkiem argumentu:

  ∇⍵ ogon powraca na argument

' '∊⍵ jeśli spacja jest członkiem argumentu:

  ?0 random float (0–1)

  2E31× skaluj do (0–2³¹)

   piętro

'Hello World' w przeciwnym razie zwróci ciąg


0

Commodore BASIC (VIC-20, C64, TheC64Mini itp.) - 170 tokenizuje bajty BASIC

 0a%=32767:goS9:b$=leF(b$,len(b$)-1):ifb$="*"tH?"hello world
 1ifb$=" * "tH?int(rN(ti)*a%)
 2ifb$="*+*"tHfOi=.to1:i=.:nE
 3end
 9b$="":fOi=.to1:geta$:i=-(a$=cH(13)):b$=b$+a$:?a$;:nE:reT

Myślę, że aby to zrobić dokładniej, będę musiał zagłębić się w dziwny świat języka asemblera 6502, ale to pierwszy szkic.

Po pierwsze, INPUTsłowo kluczowe w Commodore BASIC ignoruje białe spacje, więc podprogram w linii 9jest szybkim i brudnym sposobem akceptowania pozycji klawiatury, w tym spacji.

Drugi punkt, liczby całkowite Commodore BASIC mają zakres 16-bitowych znaków, więc od -32768 do +32767 źródła - więc zachowałem liczbę losową wygenerowaną na 0 - 32767 włącznie


0

Strzyżyk ,143 135 bajtów

Nie jestem dobrym golfistą ... RNG generuje tę samą wartość za każdym razem, ponieważ jest generatorem liczb pseudolosowych.

Fn.new{|a|
import"random"for Random
if(a=="*+*"){
while(1){}
}else System.write(a[0]==" "?Random.new(9).int((1<<31)-1):"Hello World")
}

Wypróbuj online!


0

JavaScript, 63 bajty, brak nieskończonej rekurencji

s=>s[1]?Math.random()*2**31|eval("while(s>'!');"):'Hello World'

zła sieć, więc brak linku TIO

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.