Escriba un intérprete de "Hola"
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 imprimirerroerror(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, comoraise SyntaxError('err')en Python. (Básicamente, tienes que cometer un error a propósito conerr/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 unh) - Puede asumir que la entrada siempre será ASCII 33-126 y 10 (decimal)
- Los
hs distinguen entre mayúsculas y minúsculas (porHlo 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
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.
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!
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)
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!
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!
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.
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.
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
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'
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
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.
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
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
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
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!
Python 3 , 52 bytes
lambda x:(x=='h'*len(x))*len(x)*'Hello World'or'err'
¡Pruébelo en línea!
Python 3 , 58 bytes
lambda s:s and s=="h"*len(s)and"Hello World"*len(s)or"err"
¡Pruébelo en línea!
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!
JavaScript 72 66 bytes
-6 bytes gracias a @Ismael Miguel
alert(/^h*$/.test(a=prompt())?a.replace(/h/g,'Hello World'):'err')
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!
Python 3 , 57 52 bytes
lambda a:a=='h'*len(a)and'Hello World'*len(a)or'err'
¡Pruébelo en línea!
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"
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)
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
PowerShell , 44 bytes
$args|%{if($_-104){'err';exit}"Hello World"}
¡Pruébelo en línea!
Toma información salpicando
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
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
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
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 ...
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.