Escriba un intérprete de "Hola"

Sep 03 2020

Antecedentes

Hola es un lenguaje "escrito" por Anne Veling , cuyos errores si el programa no contiene sólo h, y se imprimirá Hello Worldpara cadah

Tarea

Debes escribir un intérprete / compilador para Hello.

Ejemplo en Python

import os
i = input("Program: ")
for a in i:
    if a != 'h':
        print("err")
        quit()
    else:
        print("Hello World")

Detalles

  • Si el programa no es solo hs, debe imprimir erro error(no distingue entre mayúsculas y minúsculas)
  • Está bien si imprime "Hello World" antes de que su programa descubra un no hcarácter y errores, sin embargo, el programa debe detenerse si noh
  • Puede lanzar un error, siempre y cuando imprima err/ errorantes de lanzar, o usando un error personalizado incorporado, como raise SyntaxError('err')en Python. (Básicamente, tienes que cometer un error a propósito con err/error
  • Suponga que el programa no estará vacío
  • La salida puede tener una nueva línea al final, un espacio o nada para separar Hello Worlds
  • Si un programa tiene varias líneas, debería producir un error (debido a que \nno es un h)
  • Puede asumir que la entrada siempre será ASCII 33-126 y 10 (decimal)
  • Los hs distinguen entre mayúsculas y minúsculas (por Hlo que no es un programa válido) se encuentra la instrucción
  • Esto es código de golf , la respuesta más corta gana

Casos de prueba

Input:

h

Output:

Hello World

Input:

hhhhhh

Output:

Hello WorldHello WorldHello WorldHello WorldHello WorldHello World

(again, it doesn't matter whether it's spaces, newlines, or nothing to separate `Hello World`s

Input:

rubbish

Output:

err

Input:

huh

Output:

Hello Worlderr

Or

err

Primer desafío, así que ten piedad

Respuestas

26 JoKing Sep 03 2020 at 11:48

Lenguaje , \$1.42 \times 10^{122}\$ bytes

menos muchos bytes gracias a Kevin Cruijssen y Bubbler

hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh...

Este es 142099843608359281286315447494338058415442968773543757980908246691462388164856076679905341690709953072132211450166077106439 hs, que también lo convierte en un programa de Hello válido, aunque no uno que le gustaría ejecutar. El código original es brainfuck 140 135 bytes:

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

¡Pruébelo en línea!

Esto imprime Hello World cada vez que ve huna modificación del Hello, World más corto conocido! programa , deteniendo el bucle e imprimiendo errsi ve algo que no sea un h.

13 xnor Sep 03 2020 at 12:19

Python 3 , 49 bytes

lambda s:{*s}-{'h'}and'err'or'Hello World'*len(s)

¡Pruébelo en línea!

Python 2, 51 bytes

lambda s:s.strip('h')and'err'or'Hello World'*len(s)

¡Pruébelo en línea!

Python 2, 51 bytes

lambda s:['err','Hello World'*len(s)]['h'+s==s+'h']

¡Pruébelo en línea!

11 Adám Sep 03 2020 at 12:41

APL (Dyalog Unicode) , 32 bytes ( SBCS )

Función de prefijo tácito anónimo.

{'h'=⍵:'Hello World'⋄-⎕←'err'}⍤0

¡Pruébelo en línea!

{}⍤0 Reemplace cada carácter ( ) con el resultado de aplicarle la siguiente lambda:

'h'=⍵: si el personaje es h:

  'Hello World' devuelve la frase requerida

 más:

  ⎕←'err' imprimir err
  - negarlo (causando un error y terminando)

11 CongChen Sep 03 2020 at 19:17

R , 76 bytes

function(p,n=nchar(p))ifelse(p==strrep('h',n),strrep("Hello World",n),'err')

¡Pruébelo en línea!

Debería ser un comentario sobre https://codegolf.stackexchange.com/a/210520/98085- ¡No sabía que podías hacer funciones como esa! Ligero cambio para ser más robusto cuando n = 0 y usar comparación directa en lugar de regex. -1 byte gracias ahttps://codegolf.stackexchange.com/users/90265/zippymagician.

Versión de bonificación con efectos secundarios (como redefinir la resta) gracias a https://codegolf.stackexchange.com/users/92901/dingus.

R , 71 bytes

{`-`=strrep;function(p,n=nchar(p))`if`(p=='h'-n,'Hello world'-n,'err')}

¡Pruébelo en línea!

7 manatwork Sep 03 2020 at 11:32

Gema , 23 personajes

h=Hello World
?=err@end

Ejecución de muestra:

bash-5.0$ echo -n 'hohoho' | gema 'h=Hello World;?=err@end'
Hello Worlderr

Gema (versión antigua con err en código vacío), 32 caracteres

\A\Z=err
h=Hello World
?=err@end

¡Pruébelo en línea! / ¡ Pruebe todos los casos de prueba en línea!

7 640KB Sep 03 2020 at 21:02

código de máquina x86-16, IBM PC DOS, 41 40 bytes

Binario:

00000000: be82 00ba 1801 b409 ac3c 0d74 0a3c 6874  .........<.t.<ht
00000010: 02b2 24cd 2174 f1c3 4865 6c6c 6f20 576f  ..$.!t..Hello Wo 00000020: 726c 6424 6572 7224 rld$err$

Listado:

BE 0082         MOV  SI, 82H            ; SI to DOS PSP 
BA 0118         MOV  DX, OFFSET HW      ; point to 'Hello World' string 
B4 09           MOV  AH, 9              ; DOS write string function 
            CHAR_LOOP: 
AC              LODSB                   ; AL = next input byte 
3C 0D           CMP  AL, 0DH            ; is a CR (end of input string)? 
74 0A           JZ   DONE               ; if so, end 
3C 68           CMP  AL, 'h'            ; is an 'h'? 
74 02           JZ   WRITE_STR          ; if so, write Hello(s)
B2 24           MOV  DL, LOW OFFSET ER  ; otherwise, point to 'err' string 
            WRITE_STR: 
CD 21           INT  21H                ; write string to stdout 
74 F1           JZ   CHAR_LOOP          ; if 'h', keep looping 
            DONE:
C3              RET                     ; return to DOS 
            HW  DB  'Hello World$'
            ER  DB  'err$'

Programa COM ejecutable independiente para PC DOS. Entrada a través de la línea de comando. Esta versión se imprime Hello Worlderrsi hay un error en el código de entrada.

Y por diversión (y como lo hice primero), esta versión solo se imprimirá errsi hay un error en el código.

código de máquina x86-16, IBM PC DOS, 47 45 44 bytes

Binario:

00000000: bf80 00ba 1c01 8a0d 4951 abb8 6809 f3ae  ........IQ..h...
00000010: 5974 04b2 28b1 01cd 21e2 fcc3 4865 6c6c  Yt..(...!...Hell
00000020: 6f20 576f 726c 6424 6572 7224            o World$err$

Listado:

BF 0080         MOV  DI, 80H            ; DI to DOS PSP 
BA 011C         MOV  DX, OFFSET HW      ; point to 'Hello World' string 
8A 0D           MOV  CL, BYTE PTR[DI]   ; CL = input length 
49              DEC  CX                 ; remove leading space from length 
51              PUSH CX                 ; save length for later 
AB              STOSW                   ; DI to start of command line input
B8 0968         MOV  AX, 0968H          ; AL = 'h', AH = 9 
F3/ AE          REPZ SCASB              ; search input for 'h': ZF if Hello, NZ if error
59              POP  CX                 ; restore input length 
74 04           JZ   HELLO_LOOP         ; if no error, write Hello(s) 
B2 28           MOV  DL, LOW OFFSET ER  ; otherwise, point to 'err' string 
B1 01           MOV  CL, 1              ; only show 'err' once 
            WRITE_LOOP: 
CD 21           INT  21H                ; write string to stdout 
E2 FC           LOOP WRITE_LOOP         ; loop until done 
C3              RET                     ; return to DOS 
            HW  DB  'Hello World$'
            ER  DB  'err$'

Accesorios:

  • -1 byte para ambos gracias a @MatteoItalia por la sugerencia de cambiar solo el byte bajo en el puntero de la cadena de error.
6 Dingus Sep 03 2020 at 10:45

Rubí -0p , 42 ... 35 33 bytes

La idea de usar las -0pbanderas (en lugar de las -nque tenía originalmente) provino de la respuesta Perl de @ DomHastings , ahorrando 4 bytes.

$_=/[^h]/?:err:'Hello World'*~/$/

¡Pruébelo en línea!

Lee el programa de STDIN. Se usa una expresión regular para verificar si el programa contiene algún carácter que no sea h. Si es así, imprima err; de lo contrario, imprima Hello Worldtantas veces como el número de caracteres del programa (dado por ~/$/).

Usar un literal de expresión regular simple como booleano es un Perlismo obsoleto que (desde Ruby 1.9) solo funciona con las banderas -no -p.

5 Lyxal Sep 03 2020 at 12:29

05AB1E , 17 bytes

'hÃQig”Ÿ™‚ï”×ë'‰ë

¡Pruébelo en línea!

¡Muchas gracias a @Kevin por su herramienta de compresión de diccionario !

¡Y una vez más, Kevin ha atacado y logrado recortar 3 bytes de mi respuesta! Entonces, el agradecimiento mencionado anteriormente debe multiplicarse por una magnitud masiva.

Explicado (antiguo)

Ð'hÃQig”Ÿ™‚ï”и»ë"err
Ð                       # Triplicate the input. STACK = [input, input, input]
 'h                     # Push the letter 'h'. STACK = [input, input, input, 'h']
   Ã                    # Keep _only_ the letter h in the input. STACK = [input, input, input.keep('h')]
    Q                   # Compare this with the original input. STACK = [input, 1 OR 0]
     i                  # If the comparison is truthy (i.e. it's only h's):
      g                 #   Push the length of the input. STACK = [len(input)]
       ”Ÿ™‚ï”           #   Push the compressed string "Hello World". STACK = [len(input), "Hello World"]
             и»         #   Repeat that string length of input times and join upon newlines. STACK = ["\n".join("Hello World" * len(input))]
               ë        # Else:
                "err    #   Push the string "err" to the stack. STACK = [input, "err"]
                        # Implicitly output the top of the stack
   
         
5 MichaelKlein Sep 03 2020 at 22:56

Haskell (abrazos 2006), 31 bytes

mapM(\'h'->putStr"Hello World")

Pendiente de una pregunta al OP re "error" en un mensaje de error más grande. La especificación dice "debe imprimir err o error", lo que hace en Hugs 2006, específicamente Raskell 1.0.13 interpreter based on Hugs 2006:

> mapM(\'h'->putStr"Hello World") "huh"
Hello World
Program error: pattern match
failure: ww_v4136 'u'
4 ZippyMagician Sep 03 2020 at 19:16

Arn , 24 bytes

ùÝ└ån<⁼aLw$■v&Z(#▄╗└·I╔║

¡Intentalo!

Explicado

Desempaquetado: (${="h"})#=#&&'yt bs'^#||"err

Y es por eso que necesito agregar un if else ...

      (              Begin expression
        $            Filter
          {          Block with index of _
              _      Implicit
            =        Equals
              "h"    String
          }          End block
          _          Variable initialized to STDIN; implied
      )              End expression
    #                Length
  =                  Equals
      _              Implied
    #
&&                   Boolean AND
    'yt bs'        Compressed string equal to "Hello World"
  ^                  Repeated
      _              Implied
    #
||                   Boolean OR
  "err
4 EngineerToast Sep 03 2020 at 19:35

Excel, 63 bytes

=IF(SUBSTITUTE(A1,"h","")="",REPT("Hello World",LEN(A1)),"err")

SUBSTITUTE(A1,"h","")=""devuelve TRUEiff A1no contiene nada más que h.

REPT("Hello World",LEN(A1))repite la cadena para la cantidad de caracteres que haya A1.

=If(Substitute(~)="",REPT(~),"err")devuelve la cadena repetida si A1solo contiene hy errsi contiene algo más.

4 Giuseppe Sep 03 2020 at 21:14

SNOBOL4 (CSNOBOL4) , 94 bytes

	I =INPUT
	I NOTANY('h')	:S(E)
	OUTPUT =DUPL('Hello World',SIZE(I))	:(END)
E	OUTPUT ='err'
END

¡Pruébelo en línea!

	I =INPUT					;* Read input
	I NOTANY('h')	:S(E)				;* If there is a character that's not 'h' in the input, goto E
	OUTPUT =DUPL('Hello World',SIZE(I))	:(END)	;* else print "Hello World" repeatedly and goto END
E	OUTPUT ='err'					;* print 'err'
END
4 JonathanAllan Sep 03 2020 at 23:10

Gelatina , 17 bytes

14 si podemos imprimir Errcomo una subcadena de la salida (por ejemplo, “½,⁾ẇṭ»€!fƑ?”h TIO ).

“½,⁾ẇṭ»€“¹ṫ»fƑ?”h

¡Pruébelo en línea!

¿Cómo?

“½,⁾ẇṭ»€“¹ṫ»fƑ?”h - Main Link: program
               ”h - set right argument to 'h'
              ?   - if...
             Ƒ    - ...condition: is (program) invariant under?:
            f     -     keep only ('h's)
       €          - ...then: for each (c in program):
“½,⁾ẇṭ»           -     "Hello World"
        “¹ṫ»      - ...else: "error"
                  - implicit, smashing print
4 Noodle9 Sep 04 2020 at 02:38

flexión , 76 \$\cdots\$ 55 52 bytes

%%
h puts("Hello World");
[^h] puts("err");exit(1);

Coloque el código anterior en un archivo llamado hello.ly cree el intérprete con:

flex hello.l && gcc lex.yy.c -o hello -lfl

Probándolo en mi terminal:

> echo -n hhh|./hello.exe
Hello World
Hello World
Hello World

Con nueva línea:

> echo hhh|./hello.exe
Hello World
Hello World
Hello World
err

observe que errdebido a la nueva línea final que echonormalmente envía.

Sin hcarácter:

> echo -n hhhehhh|./hello.exe
Hello World
Hello World
Hello World
err
4 AZTECCO Sep 03 2020 at 17:46

C (gcc) , 71 65 bytes

f(char*p){p=*p-'h'?*p&&puts("err"):f(p+1)||!puts("Hello World");}

¡Pruébelo en línea!

  • ¡Gracias a @rtpax por ahorrar 6!

f(char*p){p=- función virar ay programvolver con el truco eax, reutilizar p.
Se llama a sí mismo de forma recursiva.
La recursividad ocurre antes de la programejecución, por lo que si todos los pasos son correctos false, se devuelve un valor y programse ejecuta.
Si hay un error truthy, se devuelve un valor y programno se ejecuta en absoluto, se muestra un mensaje de error.

* p-'h '? `...`: f (p + 1) ||! put ("Hola mundo");
 - comprobar cada carácter en el programa : si h   continuar la recursividad y
   si el resultado es falso, el programa hace su trabajo.
p es verdadero   si hubo un error, falso en su lugar.

 - si no h, detiene la recursividad y:
* p - si el final del programa  
p   es falso 
&& pone ("err") - si no el final del programa muestra el error
 p   es verdadero .



61 Solución alternativa menos interesante de 58 bytes que ejecuta el programa y se detiene cuando ocurre un error

f(char*p){*p&&puts(*p-'h'?"err":"Hello World")>4&&f(p+1);}
  • ¡Guardado 3 gracias a @rtpax!
3 Mukundan314 Sep 03 2020 at 11:17

Python 3 , 52 bytes

lambda x:(x=='h'*len(x))*len(x)*'Hello World'or'err'

¡Pruébelo en línea!

3 ManishKundu Sep 03 2020 at 11:15

Python 3 , 58 bytes

lambda s:s and s=="h"*len(s)and"Hello World"*len(s)or"err"

¡Pruébelo en línea!

3 Shaggy Sep 03 2020 at 21:59

JavaScript, 49 bytes

-4 bytes si podemos lanzar un error en lugar de generar una cadena.

f=([c,...a])=>c?c==`h`?`Hello World`+f(a):`err`:a

¡Pruébelo en línea!

3 NoOorZ24 Sep 03 2020 at 15:07

JavaScript 72 66 bytes

-6 bytes gracias a @Ismael Miguel

alert(/^h*$/.test(a=prompt())?a.replace(/h/g,'Hello World'):'err')
3 Razetime Sep 03 2020 at 13:03

Pip , 28 27 bytes

aRM'h?"err""Hello World"X#a

-1 byte de DLosc.

Si la cadena sin h está vacía, imprima "Hello World" el número de veces requerido.

De lo contrario, error.

Este programa también produce errores en la entrada vacía.

¡Pruébelo en línea!

3 aidan0626 Sep 03 2020 at 12:00

Python 3 , 57 52 bytes

lambda a:a=='h'*len(a)and'Hello World'*len(a)or'err'

¡Pruébelo en línea!

2 Mukundan314 Sep 03 2020 at 13:20

Japón , 23 19 bytes

-4 bytes gracias a @Shaggy

rh ?`r`:¡`HÁM Wld

Intentalo

Explicación

rh ?`...`:¡`...
   ?              // if
rh                //   input with 'h' removed
    `...`         // then "err"
         :        // else
          ¡       //   each char in input
           `...   //   replaced with "Hello World"
2 KevinCruijssen Sep 03 2020 at 15:47

MathGolf , 23 20 bytes

'h-╛æ╖•p0{δ╕○ô 'W╕7ÿ

Pruébelo en línea.

Explicación:

'h-                  '# Remove all "h" from the (implicit) input-string
   ╛                  # Pop, and if it's now truthy (thus non-empty):
    æ                 #  Use the following four characters as single code-block:
     ╖•p              #   Push compressed string "err"
        0             #   And push a 0
         {            # Either loop 0 times,
                      # or loop over each character of the (implicit) input-string:
          δ           #  Titlecase the implicitly pushed current character ("h"→"H")
           ╕○ô        #  Push compressed string "ello"
                      #  Push " "
               'W    '#  Push "W"
                 ╕7ÿ  #  Push compressed string "orld"
                      # (implicitly output the entire stack joined together as result)
2 IsmaelMiguel Sep 03 2020 at 19:04

SimpleTemplate 0.84, 92 63 bytes

¡Este desafío fue simple pero divertido!

Simplemente verifica si la entrada es simplemente "hhh ...." y envía el texto, o envía "err" a STDOUT:

{@ifargv.0 matches"@^h+$@"M}{@eachM.0}Hello World{@/}{@else}err

El gran ahorro de bytes se debió al comentario de the-cobalt :

La salida a STDOUT está bien, por lo que puede usar su versión de 63 bytes.


Sin golf:

A continuación se muestra una versión más legible del código:

{@if argv.0 matches "@^h+$@"}
    {@each argv.0 as h}
        {@echo "Hello World"}
    {@/}
{@else}
    {@echo "err"}
{@/}

Puedes probar esto en: http://sandbox.onlinephpfunctions.com/code/e35a07dfbf6b3b56c2608aa86028b395ef457129

2 Veskah Sep 04 2020 at 03:03

PowerShell , 44 bytes

$args|%{if($_-104){'err';exit}"Hello World"}

¡Pruébelo en línea!

Toma información salpicando

2 Xvolks Sep 05 2020 at 22:34

GFA básico (Atari ST), 125 bytes

INPUT a$ FOR i=1 TO LEN(a$)
b$=MID$(a$,i,1) IF b$="h"
PRINT "Hello World"
ELSE
PRINT "err"
EXIT IF 1
ENDIF
NEXT I
2 KevinCruijssen Sep 03 2020 at 14:45

Java 8, 65 53 bytes

s->s.matches("h+")?s.replace("h","Hello World"):"err"

-12 bytes gracias a @ corvus_192 .

Pruébelo en línea.

Explicación:

s->                           // Method with String as both parameter and return-type
  s.matches("h+")?            //  If the input consists solely of 1 or more "h":
    s.replace("h",            //   Replace all "h" in the input
              "Hello World")  //   with "Hello World"
             :                //  Else:
              "err"           //   Return "err" instead
1 Mukundan314 Sep 03 2020 at 13:05

Pyth , 25 bytes

?-Q\h"err"*"Hello World"l

¡Pruébelo en línea!

Explicación

?-Q\h"err"*"Hello World"l
?                           // if
 -Q\h                       //    input with 'h' removed
     "err"                  // then "err"
          *"Hello World"l   // else "Hello World" repeated len(input) times
1 DominicvanEssen Sep 03 2020 at 15:59

R , 84 bytes

function(p,n=nchar(p))`if`(n-lengths(gregexpr("h",p)),"err",strrep("Hello World",n))

¡Pruébelo en línea!

Como R es el idioma del mes de septiembre de 2020, pongamos manos a la obra con una respuesta R a este desafío.
Sin embargo, esta todavía no es la respuesta más corta posible en R , por lo que me gustaría animar a otros golfistas que normalmente no son R a intentarlo también ...

1 Neil Sep 03 2020 at 16:20

Lote, 64 bytes

@set/ps=
@if "%s:h=%"=="" (echo %s:h=Hello World%)else echo err

Toma entrada en STDIN. Si reemplazar la hs en la entrada da como resultado una cadena vacía, muestre el resultado de reemplazar la hs con la Hello Worldsalida de otro modo err.