Scrivi un interprete per *


20

Il compito è semplice. Scrivi un interprete per la lingua * .

Ecco un link più grande al wiki.

Esistono solo tre programmi * validi:

  • * Stampe "Ciao mondo"
  •  *  Stampa un numero casuale compreso tra 0 e 2.147.483.647
  • *+* Funziona per sempre.

Il terzo caso deve essere un ciclo infinito secondo le specifiche in questa domanda

Ingresso:

  • L'input può essere preso tramite qualsiasi metodo di input accettabile dalle nostre regole I / O standard
  • Sarà sempre uno dei programmi sopra elencati

Produzione:

  • Il primo caso dovrebbe essere stampato esattamente Hello World, con o senza un'interruzione di riga finale.
  • Nel secondo caso, se il numero intero massimo della tua lingua è inferiore a 2.147.483.647, utilizza il numero intero massimo della tua lingua
  • Il primo e il secondo caso possono stampare su qualsiasi output accettabile dalle nostre regole I / O standard.
  • Il terzo caso non dovrebbe dare alcun risultato.

punteggio:

Dato che si tratta di , la risposta più breve, in byte, vince.


7
Quando dici "tra 0e 2,147,483,647", è inclusivo o esclusivo? (Ad esempio, è 0un output valido?)
Chas Brown

7
La modifica delle specifiche dopo aver inviato una richiesta e l'invalidazione delle soluzioni esistenti è automatica -1per me.
Shaggy,

2
Per le lingue che non hanno un modo integrato di generare un numero casuale, esiste un modo accettabile per soddisfare il requisito "stampa un numero casuale"?
Tanner Swett,

2
Se i numeri interi della nostra lingua non hanno un massimo o un massimo, possiamo usare un limite superiore più alto?
Jonathan Allan, il

7
@Shaggy Non vedo alcuna modifica delle regole nel wiki per la domanda, solo uno spazio in uno spazio non-break (controlla la scheda markdown), perché il renderer di markdown SE non lo stava eseguendo il rendering, ma guardando la revisione originale , è chiaro che dovrebbero essere spazi normali e la "modifica" viene eseguita solo per problemi di rendering del
markdown

Risposte:


20

* , 0 byte


Poiché * non ha modo di leggere l'input, le regole predefinite consentono di specificare che l'input deve essere dato concatenandolo sul programma .

(... Penso. C'è una condizione "almeno il doppio dei voti positivi rispetto ai voti negativi" che non ho il rappresentante da verificare).


4
La tua meta collegata è effettivamente uno standard del sito attualmente accettato (+31 -7).
Jonathan Allan, il

2
@A__: Mi sembra che debba essere stato progettato appositamente per soddisfare la definizione proposta di "linguaggio di programmazione" ("Puoi scrivere ciao mondo!" "Puoi scrivere un ciclo infinito!" "Puoi scrivere un programma che non fai sempre la stessa cosa! ").
Henning Makholm,

Credo che tecnicamente Malbolge non sia neanche un linguaggio di programmazione.
Bob Jansen,

1
Malbolge è un linguaggio di programmazione per automi finiti, uguale a * e, ad esempio, Befunge-93. Pertanto Malbolge è un linguaggio di programmazione formale, uguale a *, tecnicamente uguale ai linguaggi enumerativi ricorsivi quando si tratta di definire un linguaggio di programmazione (sebbene i linguaggi formali siano meno potenti).
Krzysztof Szewczyk l'

A mio avviso negativo, perché onestamente, questa risposta è così noiosa che in realtà è già una scappatoia standard , anche se ignoriamo la domanda se * è un linguaggio di programmazione
AlienAtSystem

8

R , 69 byte

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

Provalo online!

switchcerca di abbinare gli argomenti nominati e se non c'è corrispondenza, seleziona il primo senza nome dopo il primo, che in questo caso è il ciclo infinito repeat{}.


6

Gelatina ,  21  20 byte

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

Un collegamento monadico che accetta un elenco di caratteri.

Provalo online!

vL’... funziona anche (vedi sotto).

Come?

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

Alternativa

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 byte

Grazie ad attinat per i -3 byte.

Devo solo controllare il secondo carattere: se l'LSB è impostato, è un +(quindi il programma è " *+*") e il programma scorre. Dopodiché, se è un NUL, il programma era " *" e mostriamo Hello World; in caso contrario, visualizza un valore casuale ("  * ", l'unica altra opzione rimasta.)

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

Provalo online!



Radere un byte:f(char*s){*++s&1?f(s-1):printf(*s?"%d":"Hello World",rand());}
Roman Odaisky il

Nota pedante: randnon è garantito per restituire un valore sufficientemente grande; RAND_MAXe INT_MAXnon è garantito che siano gli stessi (e non sono compilatori del mondo reale, ad esempio Visual Studio RAND_MAXè 32767, mentre INT_MAX[sui moderni sistemi derivati ​​x86] è il 2147483647valore specificato nella domanda dell'OP).
ShadowRanger

@ShadowRanger è del tutto vero, ma considerando che> 90% di tutte le voci CGCC basate su C si basano su comportamenti indefiniti e non specificati, non me ne preoccupo! Anche oggi non avevo voglia di implementare un LCG codificato. :-)
ErikF

5

Python 2 , 103 93 89 87 byte

Ho unito la mia risposta in precedenza con Chas Browns di risposta e ottenuto qualcosa pochi byte più breve.

Il numero casuale sarà compreso tra 0 e 2 ** 31-1 incluso.

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

Provalo online!

Versione precedente:

103 byte

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

93 byte

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

Salva 2 byte sostituendo randint(0,2**31-1)con randrange(2**31).
Chas Brown,

while'*'<isalva 2
Jonathan Allan il

Salvare un altro byte cambiando randrange(2**31)in getrandbits(31)(quest'ultimo non restituisce long, intma printstampa il strmodulo, non il reprmodulo, quindi il trascinamento Lnon sarà presente).
ShadowRanger,

Relativamente inesperto con il sito, quindi un rapido chiarimento: ti è permesso richiedere che il tuo contributo sia quotato? i=input()Funziona solo se gli input sono quotati, se si immette semplicemente plain */ * /*+*, morirebbe con un SyntaxError(perché inputinclude un implicito eval); dovresti inserire '*'/' * '/'*+*'(o equivalente con virgolette invece). Non ho visto nulla di ovvio nelle regole I / O standard che lo consentirebbe, il che potrebbe significare che dovresti usarlo raw_input(), costando quattro byte.
ShadowRanger,

@ShadowRanger input()prende una stringa come input e la valuta. Non sto davvero aggiungendo all'input, sto semplicemente prendendo una stringa come input e le stringhe hanno virgolette. Questo è piuttosto standard, nello stesso modo in cui posso prendere un array come [1,2,3]invece di una stringa delimitata che devo quindi dividere e analizzare. L'obiettivo del sito non è quello di rendere rigoroso l'input, ma di semplificare l'I / O in modo da poter concentrare il codice sulla sfida a portata di mano.
mbomb007,

5

Barilotto , -lp, -ir 30 26 25 24 20 19 byte

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

-1 byte tramite flag

Provalo online!

Cronologia delle risposte

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

Provalo online!

Abbreviato Hello Worldin stringa del dizionario

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

Provalo online!

Non ho mai smesso di stupirmi del potere di Keg. Crediti all'utente EdgyNerd per un altro byte salvato.

Versioni precedenti

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

Provalo online!

Accredito all'utente A__ per il byte extra salvato.

Vecchia versione

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

In sostanza, prende il programma di input e:

  • Verifica se la lunghezza di input è 1, stampando "Hello World" se vero
  • Verifica se l'ultimo carattere è uno spazio e stampa un numero casuale
  • Altrimenti esegue un ciclo infinito

Quindi stampa implicitamente la pila.

?                               #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 byte salvati a causa del fatto che ciao mondo non ha bisogno di punteggiatura.

Provalo online! Vecchia versione

Provalo online! Nuova versione


Puoi tagliare 4 byte, non hai bisogno della virgola o del punto esclamativo in "Hello World".
TheOnlyMrCat

1
Ora devo imparare un'altra lingua impopolare per rispondere alle sfide qui normalmente.
A̲̲

1
-1 byte: TIO . Sono contento di non aver perso la capacità di giocare a golf in Keg.
A̲̲

@A__ Ti stai divertendo con Keg su TIO?
Jono 2906


3

Befunge-93 , 54 byte

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

Provalo online!

commentata:

~"*"-                      _                ~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

La casualità non è uniforme. Ad ogni incremento c'è una probabilità del 50% di interrompere l'incremento.


3

Japt , 22/25 byte

La prima soluzione è per le specifiche originali che avevano *<space>come secondo programma e l'altra è per le specifiche aggiornate che le hanno arbitrariamente modificate <space>*</space>, grazie a EoI per la "correzione" suggerita.

Entrambi generano un errore di overflow entrando nel ciclo infinito del terzo programma ma, teoricamente, con memoria sufficiente (che possiamo supporre ai fini del ), funzionerebbero per sempre.

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

Prova il programma 1
Prova il programma 2
Prova il programma 3

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

Prova il programma 1
Prova il programma 2
Prova il programma 3


Penso che il secondo programma sia "[SPAZIO] * [SPAZIO]", non "[SPAZIO] *", quindi il tuo programma non funziona
Incarnazione dell'ignoranza

@EmbodimentofIgnorance, al momento della pubblicazione, il secondo programma nelle specifiche era *<space> . Non ho tempo di aggiornare ora.
Shaggy,

Puoi risolverlo in tre byte con UÌ>Sanziché ¢sul secondo ternario
Incarnazione dell'ignoranza il

@Downvoter, per favore, abbi la cortesia di lasciare un commento.
Shaggy,

2

JavaScript (ES7), 66 byte

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

Provalo online! (Ciao mondo)

Provalo online! (numero casuale)

Provalo online! (ciclo infinito)


Non x=(z=>x())&&x()funzionerebbe per -1 byte dal codice di ciclo infinito, supponendo un browser senza dimensioni massime dello stack di chiamate?
Geza Kerecsenyi,

@GezaKerecsenyi Potremmo semplicemente definirci ( come questo ) ma non sono sicuro che sarebbe accettabile.
Arnauld,

è giusto. Mi chiedo se ci sia qualche oscuro browser là fuori che continua a funzionare (almeno, fino a quando la RAM si esaurisce)
Geza Kerecsenyi,

1
@Arnauld, teoricamente, avrebbe funzionato per sempre con una memoria infinita, che possiamo supporre per il golf del codice.
Shaggy,

2

Gelatina , 23 21 byte

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

Provalo online!

Un collegamento monadico che prende un singolo argomento e ritorna Hello World, un intero casuale a 31 bit o un ciclo infinito secondo la specifica.

Tutte le opzioni: * * *+*

Spiegazione

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

Carbone , 30 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Abusa del formato di input predefinito di Charcoal che si divide in spazi se esiste solo una riga, quindi l'input di numeri casuali in realtà assomiglia a tre input. Spiegazione:

W№θ*

Ripeti mentre il primo input contiene a *.

F⁼θ*

Se il primo input è un *solo ...

≔Hello Worldθ

... quindi sostituiscilo con Hello World, facendo terminare il loop. *+*non viene sostituito, generando un ciclo infinito.

∨θ

Se il primo input non è vuoto, emetterlo.

I‽X²¦³¹

Ma se è vuoto, genera un numero intero casuale nell'intervallo desiderato.


1

Aggiungi ++ , 78 byte

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

Provalo online!

Spiegazione

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 byte

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

Provalo online!

Prende il programma come una stringa attraverso la variabile di input e ignora la variabile di output. Sfrutta pesantemente la garanzia che l'input sia solo uno dei tre programmi validi: qualsiasi input di lunghezza tre si comporterà come uno " * "o in "*+*"base al fatto che il primo carattere sia uno spazio o meno e qualsiasi altro input si comporterà come "*".

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!".

Oops, errore "Hello World" - risolto ora
Unrelated String

1

PHP , 51 byte

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

Provalo online! (Ciao mondo)

Provalo online! (Numero casuale)

Provalo online! (Ciclo infinito)

Prende secondo carattere di ingresso che può essere '', '*'o '+'. Nel caso in cui '+'il valore '*'<'+'sarà vero e il ciclo sarà infinito, altrimenti, dopo il ciclo, viene visualizzato "Hello World" o un numero casuale. La rand()emette automaticamente un numero compreso tra 0 e getrandmax()che utilizzi definiti RAND_MAXnella libreria standard C e di default è 2147483647per la maggior parte piattaforme / ambienti, compreso TIO.


1

05AB1E , 21 byte

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

Provalo online. (NOTA: il buildin casuale è piuttosto lento con grandi elenchi, quindi potrebbe essere necessario un po 'di tempo prima che venga dato il risultato.)

Spiegazione:

'*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)

Vedere questo suggerimento 05AB1E mio (sezione Come utilizzare il dizionario? ) Per capire il motivo per cui ”Ÿ™‚ïè "Hello World".


1

Pyth , 32 byte

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

Provalo online!

Spiegazione (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"

Stampa un numero compreso tra 0 e 2 ^ 32, non 0 e 2 ^ 31. Un modo più breve di scrivere hC*4\ÿè ^2 32, ma per far sì che la soluzione sia corretta, dovresti usare ^2 31invece. Inoltre, utilizzare zinvece di Jw, salva 1 byte in più. E la tua spiegazione salta la riga con tprima lJ.
randomdude999,

Inoltre, è possibile rilevare il comando "loop forever" controllando se l'input contiene +caratteri, salva 1 byte perché non è necessario diminuirlo.
randomdude999,

0

APL (Dyalog Unicode) , SBCS da 39 byte

Prefisso anonimo lambda.

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

Provalo online!

{ "DFN"; è l'argomento:

'+'∊⍵: se plus è un membro dell'argomento:

  ∇⍵ ricorso della coda sull'argomento

' '∊⍵ se lo spazio è un membro dell'argomento:

  ?0 float casuale (0–1)

  2E31× scala su (0–2³¹)

   pavimento

'Hello World' altrimenti restituisce la stringa


0

Commodore BASIC (VIC-20, C64, TheC64Mini ecc.) - 170 byte BASIC tokenizzati

 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

Penso che per fare questo in modo più preciso, dovrò approfondire lo strano mondo del linguaggio assembly 6502, ma questa è una prima bozza.

Primo punto, la INPUTparola chiave in Commodore BASIC ignora gli spazi bianchi, quindi la sub-routine alla linea 9è un modo rapido e sporco di accettare le voci della tastiera inclusi gli spazi.

Secondo punto, gli interi BASIC di Commodore hanno un intervallo di 16 bit con segno, quindi da -32768 a +32767 sorgente - quindi ho mantenuto il numero casuale generato tra 0 e 32767 incluso


0

Wren ,143 135 byte

Non sono un buon giocatore di golf ... L'RNG genera lo stesso valore ogni volta perché è un generatore di numeri pseudo-casuale.

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

Provalo online!


0

JavaScript, 63 byte, nessun infinito ricorsivo

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

rete difettosa, quindi nessun collegamento TIO

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.