Escribe un intérprete para *

20

La tarea es simple. Escribe un intérprete para el idioma * .

Aquí hay un enlace más grande a la wiki.

Solo hay tres programas válidos *:

  • * Imprime "Hola mundo"
  •  *  Imprime un número aleatorio entre 0 y 2,147,483,647
  • *+* Corre por siempre.

El tercer caso debe ser un bucle infinito de acuerdo con las especificaciones de esta pregunta.

Entrada:

  • La entrada se puede tomar a través de cualquier método de entrada aceptable según nuestras reglas estándar de E / S
  • Siempre será uno de los programas anteriores.

Salida:

  • El primer caso debe imprimirse exactamente Hello World, con o sin un salto de línea final.
  • Para el segundo caso, si el número entero de su idioma es menor que 2,147,483,647, use el número entero de su idioma
  • El primer y el segundo caso pueden imprimirse en cualquier salida aceptable según nuestras reglas de E / S estándar.
  • El tercer caso no debe dar ningún resultado.

Puntuación:

Como se trata de , la respuesta más corta, en bytes, gana.

TheOnlyMrCat
fuente
77
Cuando dices 'entre 0y 2,147,483,647', ¿eso es inclusivo o exclusivo? (Por ejemplo, ¿es 0una salida válida?)
Chas Brown
77
Cambiar la especificación después de publicar un desafío e invalidar las soluciones existentes es algo automático -1.
Shaggy
2
Para los idiomas que no tienen una forma integrada de generar un número aleatorio, ¿hay alguna forma aceptable de satisfacer el requisito de "imprimir un número aleatorio"?
Tanner Swett
2
Si los enteros de nuestro lenguaje no tienen un máximo o un máximo, ¿podemos usar un límite superior más alto?
Jonathan Allan
77
@Shaggy No veo ningún cambio de regla en la wiki para la pregunta, solo un espacio en un espacio que no se rompe (verifique la pestaña de reducción), porque el renderizador de reducción de SE no lo estaba procesando, sino mirando la revisión original , está claro que debería ser espacios normales, y el "pirateo" solo se realiza para problemas de renderizado de rebajas SE
Ferrybig

Respuestas:

20

* , 0 bytes


Como * no tiene forma de leer la entrada, las reglas predeterminadas permiten especificar que la entrada se debe dar concatenando en el programa .

(... creo. Hay una condición de "al menos el doble de votos positivos que negativos" que no tengo el representante para verificar).

Henning Makholm
fuente
44
Su meta enlazado es de hecho un estándar de sitio actualmente aceptado (+31 -7).
Jonathan Allan
2
@A__: Me parece que debe haber sido diseñado específicamente para satisfacer la definición propuesta por alguien de 'lenguaje de programación' ("¡Puedes escribir hola mundo!" "¡Puedes escribir un bucle infinito!" "Puedes escribir un programa que no ¡No hagas siempre lo mismo! ").
Henning Makholm
Creo que técnicamente Malbolge tampoco es un lenguaje de programación.
Bob Jansen
1
Malbolge es un lenguaje de programación para autómatas finitos, igual que * y, por ejemplo, Befunge-93. Por lo tanto, Malbolge es un lenguaje de programación formal, lo mismo que *, técnicamente lo mismo que los lenguajes recursivamente enumerables cuando se trata de la definición del lenguaje de programación (aunque los lenguajes formales son menos poderosos).
Krzysztof Szewczyk
Voto negativo de mí, porque honestamente, esta respuesta es tan aburrida que en realidad ya es una escapatoria estándar , incluso si ignoramos la pregunta de si * es un lenguaje de programación
AlienAtSystem
8

R , 69 bytes

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

Pruébalo en línea!

switchintenta hacer coincidir los argumentos con nombre y si no hay coincidencia, selecciona el primero sin nombre después del primero, que en este caso es el bucle infinito repeat{}.

Giuseppe
fuente
6

Jalea ,  21  20 bytes

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

Un enlace monádico que acepta una lista de personajes.

Pruébalo en línea!

vL’... También funciona (ver más abajo).

¿Cómo?

Ḋ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)
Jonathan Allan
fuente
5

C (gcc) , 66 63 bytes

Gracias a attinat por los -3 bytes.

Solo tengo que verificar el segundo carácter: si el LSB está configurado, es un +(por lo tanto, el programa es " *+*") y el programa se repite. Después de eso, si es a NUL, el programa fue " *" y mostramos Hello World; de lo contrario, muestra un valor aleatorio ("  * ", la única otra opción que queda).

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

Pruébalo en línea!

ErikF
fuente
63 bytes
attinat
Afeitarse un byte:f(char*s){*++s&1?f(s-1):printf(*s?"%d":"Hello World",rand());}
Roman Odaisky
Nota pedante: randno se garantiza que devuelva un valor suficientemente grande; RAND_MAXy INT_MAXno se garantiza que sean iguales (y no están en compiladores del mundo real, por ejemplo, Visual Studio RAND_MAXes 32767, mientras que INT_MAXes [en sistemas modernos derivados de x86] el 2147483647valor especificado en la pregunta del OP).
ShadowRanger
@ShadowRanger es completamente cierto, pero teniendo en cuenta que> 90% de todas las entradas de CGCC basadas en C dependen de un comportamiento indefinido y no especificado, ¡no me preocupa eso! Tampoco tenía ganas de implementar un LCG con código de golf hoy. :-)
ErikF
5

Python 2 , 103 93 89 87 bytes

Combiné mi respuesta anterior con Chas Cafés de respuesta y tengo algo unos pocos bytes más corto.

El número aleatorio estará entre 0 y 2 ** 31-1 inclusive.

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

Pruébalo en línea!

Versión anterior:

103 bytes

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

93 bytes

from random import*
i=cmp(input(),'*')
while i>0:1
print["Hello World",randint(0,2**31-1)][i]
mbomb007
fuente
Ahorre 2 bytes reemplazando randint(0,2**31-1)con randrange(2**31).
Chas Brown
while'*'<isalva 2
Jonathan Allan
Guarde otro byte cambiando randrange(2**31)a getrandbits(31)(este último devuelve long, no int, pero printimprimirá el strformulario, no el reprformulario, por lo que el final Lno estará allí).
ShadowRanger
Relativamente inexperto con el sitio, por lo que una aclaración rápida: ¿Se le permite solicitar que se cite su entrada? i=input()solo funciona si las entradas se citan, si solo ingresa simple */ * /*+*, moriría con un SyntaxError(porque inputincluye un implícito eval); necesitaría ingresar '*'/' * '/'*+*'(o equivalente con comillas dobles). No vi nada obvio en las reglas estándar de E / S que permitieran esto, lo que podría significar que necesitaría usar raw_input(), con un costo de cuatro bytes.
ShadowRanger
@ShadowRanger input()toma una cadena como entrada y la evalúa. Realmente no estoy agregando a la entrada, simplemente estoy tomando una cadena como entrada, y las cadenas tienen comillas. Esto es bastante estándar, de la misma manera que puedo tomar una matriz como en [1,2,3]lugar de una cadena delimitada que luego tengo que dividir y analizar. El objetivo del sitio no es hacer que la entrada sea estricta, es facilitar la E / S para que podamos centrar el código en el desafío en cuestión.
mbomb007
5

Barrilete , -lp, -ir 30 26 25 24 20 19 bytes

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

-1 byte usando banderas

Pruébalo en línea!

Historial de respuestas

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

Pruébalo en línea!

Acortado Hello Worlda cadena de diccionario

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

Pruébalo en línea!

Nunca dejé de sorprenderme con el poder de Keg. Créditos al usuario EdgyNerd por otro byte guardado.

Versiones anteriores

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

Pruébalo en línea!

Crédito al usuario A__ por el byte adicional guardado.

Versión antigua

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

Esencialmente, toma el programa de entrada y:

  • Comprueba si la longitud de entrada es 1, imprimiendo "Hello World" si es verdadero
  • Comprueba si el último carácter es un espacio e imprime un número aleatorio
  • De lo contrario, ejecuta un bucle infinito

Luego implícitamente imprima 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 bytes guardados debido a que hello world no necesita puntuación.

Pruébalo en línea! Versión antigua

Pruébalo en línea! Nueva versión

Jono 2906
fuente
Puede cortar 4 bytes, no necesita la coma o el signo de exclamación en "Hello World".
TheOnlyMrCat
1
Ahora tengo que aprender otro idioma impopular para responder a los desafíos aquí normalmente.
A̲̲
1
-1 bytes: TIO . Me alegro de no haber perdido mi capacidad de golf en Keg.
A̲̲
@A__ ¿Te gusta Keg estar en TIO?
Jono 2906
2
24 bytes :)
EdgyNerd
3

Befunge-93 , 54 bytes

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

Pruébalo en línea!

Anotado:

~"*"-                      _                ~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 aleatoriedad no es uniforme. En cada incremento hay un 50% de posibilidades de dejar de incrementar.

siete negativo
fuente
3

Japt , 22/25 bytes

La primera solución es para la especificación original que tenía *<space>como segundo programa y la otra es para la especificación actualizada que lo cambió arbitrariamente <space>*</space>, gracias a EoI por la "solución" sugerida.

Ambos arrojan un error de desbordamiento al ingresar al bucle infinito del tercer programa, pero, teóricamente, con suficiente memoria (que podemos suponer a los efectos del ), correría para siempre.

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

Pruebe el programa 1
Pruebe el programa 2
Pruebe el programa 3

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

Pruebe el programa 1
Pruebe el programa 2
Pruebe el programa 3

Lanudo
fuente
Creo que el segundo programa es "[ESPACIO] * [ESPACIO]", no "[ESPACIO] *", por lo que su programa no funciona
Encarnación de la ignorancia
@EmbodimentofIgnorance, en el momento en que publiqué, el segundo programa en la especificación era *<space> . No tengo tiempo para actualizar ahora.
Shaggy
Puedes arreglarlo en tres bytes en UÌ>Slugar de ¢en el segundo ternario
Encarnación de la ignorancia
@Downvoter, tenga la cortesía de dejar un comentario.
Shaggy
2

JavaScript (ES7), 66 bytes

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

Pruébalo en línea! (Hola Mundo)

Pruébalo en línea! (número aleatorio)

Pruébalo en línea! (Bucle infinito)

Arnauld
fuente
¿ x=(z=>x())&&x()No funcionaría durante -1byte desde el código de bucle infinito, suponiendo un navegador sin un tamaño máximo de pila de llamadas?
Geza Kerecsenyi
@GezaKerecsenyi Podríamos llamarnos a nosotros mismos ( así ) pero no estoy seguro de que eso sea aceptable.
Arnauld
Eso es justo. Me pregunto si hay algún navegador oscuro que siga funcionando (al menos, hasta que se acabe la RAM)
Geza Kerecsenyi
1
@Arnauld, teóricamente, eso funcionaría para siempre dada la memoria infinita, que podemos suponer para el golf de código.
Shaggy
2

Jalea , 23 21 bytes

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

Pruébalo en línea!

Un enlace monádico que toma un solo argumento y regresa Hello World, un entero aleatorio de 31 bits o que se repite infinitamente según la especificación.

Todas las opciones: * * *+*

Explicación

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"
Nick Kennedy
fuente
2

Python 2 , 91 89 88 bytes

from random import*
def f(p):
 while'*'<p:p
 print['Hello World',getrandbits(31)][p<'!']

Pruébalo en línea!

2 bytes gracias a Jonathan Allan ; 1 byte gracias a ShadowRanger .

Chas Brown
fuente
while'*'<psalva 2
Jonathan Allan
getrandbits(31)guarda un byte encima randrange(2**31).
ShadowRanger
¡Agradable! No sabía sobre getrandbits ...
Chas Brown
1

Carbón , 30 bytes

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

Pruébalo en línea!El enlace es a la versión detallada del código. Abusa del formato de entrada predeterminado de Charcoal que se divide en espacios si solo hay una línea, por lo que la entrada de números aleatorios en realidad se parece a tres entradas. Explicación:

W№θ*

Repita mientras la primera entrada contiene un * .

F⁼θ*

Si la primera entrada es un * solo ...

≔Hello Worldθ

... luego reemplácelo con Hello World , haciendo que el ciclo termine. *+*no se reemplaza, lo que resulta en un bucle infinito.

∨θ

Si la primera entrada no está vacía, expórtela.

I‽X²¦³¹

Pero si está vacío, genera un número entero aleatorio en el rango deseado.

Neil
fuente
1

Añadir ++ , 78 bytes

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

Pruébalo en línea!

Explicación

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
caird coinheringaahing
fuente
1

Brachylog , 26 23 bytes

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

Pruébalo en línea!

Toma el programa como una cadena a través de la variable de entrada e ignora la variable de salida. Explota enormemente la garantía de que la entrada es solo uno de los tres programas válidos: cualquier entrada de longitud tres se comportará como " * "o "*+*"dependiendo de si el primer carácter es un espacio, y cualquier otra entrada se comportará como "*".

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!".
Cadena no relacionada
fuente
¡Vaya! "Hola mundo" equivocado - arreglando ahora
Cadena no relacionada
1

PHP , 51 bytes

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

Pruébalo en línea! (Hola Mundo)

Pruébalo en línea! (Número aleatorio)

Pruébalo en línea! (Bucle infinito)

Toma el segundo carácter de entrada que puede ser '', '*'o '+'. En el caso de '+'la '*'<'+'será verdad y el bucle será infinito, de lo contrario, después del bucle, se muestra "Hola mundo" o un número aleatorio. El rand()emite automáticamente un número entre 0 y getrandmax()que utiliza definidas RAND_MAXen la biblioteca C estándar y por defecto es 2147483647en la mayoría de plataformas / entornos, incluyendo TIO.

Noche2
fuente
1

05AB1E , 21 bytes

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

Pruébalo en línea.(NOTA: El buildin aleatorio es bastante lento con grandes listas, por lo que puede pasar un tiempo antes de que se dé el resultado).

Explicación:

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

Ver este consejo 05AB1E mío (sección Cómo usar el diccionario? ) Para entender por qué ”Ÿ™‚ïes "Hello World".

Kevin Cruijssen
fuente
1

Pyth , 32 bytes

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

Pruébalo en línea!

Explicación (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"
ar4093
fuente
Esto imprime un número entre 0 y 2 ^ 32, no 0 y 2 ^ 31. Una forma más corta de escribir hC*4\ÿes ^2 32, pero para que la solución sea correcta, debe usar ^2 31en su lugar. Además, use en zlugar de Jw, ahorra 1 byte más. Y tu explicación salta la línea tjusto antes lJ.
randomdude999
Además, puede detectar el comando "bucle para siempre" comprobando si la entrada contiene algún +carácter, guarda 1 byte porque no necesita decrementarlo.
randomdude999
0

APL (Dyalog Unicode) , SBCS de 39 bytes

Prefijo anónimo lambda.

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

Pruébalo en línea!

{ "dfn"; es el argumento:

'+'∊⍵: si plus es miembro del argumento:

  ∇⍵ cola recurse en argumento

' '∊⍵ si el espacio es un miembro del argumento:

  ?0 flotante aleatorio (0-1)

  2E31× escala a (0–2³¹)

   piso

'Hello World' de lo contrario devolver la cadena

Adán
fuente
0

Commodore BASIC (VIC-20, C64, TheC64Mini, etc.) - 170 tokenizar bytes 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

Creo que para hacer esto con mayor precisión, tendré que profundizar en el extraño mundo del lenguaje ensamblador 6502, pero este es un primer borrador.

Primer punto, la INPUTpalabra clave en Commodore BASIC ignora los espacios en blanco, por lo que la subrutina en línea 9es una forma rápida y sucia de aceptar entradas de teclado que incluyen espacios.

Segundo punto, los números enteros Commodore BASIC tienen un rango de 16 bits con signo, por lo que -32768 a +32767 fuente , así que he mantenido el número aleatorio generado a 0 - 32767 inclusive

Shaun Bebbers
fuente
0

Reyezuelo ,143 135 bytes

No soy un buen jugador de golf ... El RNG genera el mismo valor cada vez porque es un generador de números pseudoaleatorio.

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

Pruébalo en línea!

UN
fuente
0

JavaScript, 63 Bytes, no recursivo infinito

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

mala red, así que no hay enlace TIO

l4m2
fuente