Escreva um intérprete “Olá”

Sep 03 2020

fundo

Hello é uma linguagem "escrita" por Anne Veling , que errará se o programa não contiver apenas h, e imprimirá Hello Worlda cadah

Tarefa

Você deve escrever um interpretador / compilador para Hello.

Exemplo em Python

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

Detalhes

  • Se o programa não for apenas hs, ele deve imprimir errou error(não diferencia maiúsculas de minúsculas)
  • Está tudo bem se você imprimir "Hello World" s antes que seu programa descubra um não hcaractere e erros, no entanto, o programa deve parar se um nãoh
  • Você pode lançar um erro, contanto que você imprima err/ errorantes de lançar, ou usando um erro personalizado embutido, como raise SyntaxError('err')em python. (basicamente, você tem que errar propositalmente com err/error
  • Suponha que o programa não estará vazio
  • A saída pode ter uma nova linha final, espaço ou nada para separar Hello Worlds
  • Se um programa tiver várias linhas, ele deve apresentar erro (por \nnão ser um h)
  • Você pode assumir que a entrada sempre será ASCII 33-126 e 10 (decimal)
  • Os hs são sensíveis a maiúsculas e minúsculas (portanto, Hnão é um programa válido), a instrução foi encontrada
  • Este é o código de golfe , a resposta mais curta ganha

Casos de teste

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

Primeiro desafio, por favor, tenha misericórdia

Respostas

26 JoKing Sep 03 2020 at 11:48

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

menos muitos bytes graças a Kevin Cruijssen e Bubbler

hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh...

Este é 142099843608359281286315447494338058415442968773543757980908246691462388164856076679905341690709953072132211450166077106439 hs, o que também o torna um programa Hello válido, embora não seja aquele que você gostaria de executar. O código Brainfuck original tem 140 135 bytes:

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

Experimente online!

Isso imprime Hello World toda vez que vê um hatravés de uma modificação da versão mais curta conhecida de Hello, World! programa , parando o ciclo e imprimir errse vê outra coisa senão um h.

13 xnor Sep 03 2020 at 12:19

Python 3 , 49 bytes

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

Experimente online!

Python 2, 51 bytes

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

Experimente online!

Python 2, 51 bytes

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

Experimente online!

11 Adám Sep 03 2020 at 12:41

APL (Dyalog Unicode) , 32 bytes ( SBCS )

Função de prefixo tácito anônima.

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

Experimente online!

{… }⍤0 Substitua cada caractere ( ⍵) pelo resultado da aplicação do seguinte lambda a ele:

 'h'=⍵: se o personagem é h:

  'Hello World' retorne a frase necessária

 ⋄ outro:

  ⎕←'err' imprimir err
  - negar (causando um erro e encerrando)

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

Experimente online!

Deve ser um comentário sobre https://codegolf.stackexchange.com/a/210520/98085- Não sabia que você podia fazer funções assim! Leve mudança para ser mais robusto quando n = 0 e usar comparação direta em vez de regex. -1 byte graças ahttps://codegolf.stackexchange.com/users/90265/zippymagician.

Versão bônus com efeitos colaterais (como redefinir a subtração) graças 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')}

Experimente online!

7 manatwork Sep 03 2020 at 11:32

Gema , 23 caracteres

h=Hello World
?=err@end

Execução de amostra:

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

Gema (versão antiga com erro no código vazio), 32 caracteres

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

Experimente online! / Experimente todos os casos de teste online!

7 640KB Sep 03 2020 at 21:02

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

Binário:

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$

Listagem:

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 executável DOS para PC autônomo. Entrada via linha de comando. Esta versão imprime Hello Worlderrse houver um erro no código de entrada.

E por diversão (e já que fiz isso primeiro), esta versão só será impressa errse houver um erro no código.

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

Binário:

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$

Listagem:

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$'

Adereços:

  • -1 byte para ambos, graças a @MatteoItalia pela sugestão de alterar apenas o byte inferior no ponteiro da string de erro.
6 Dingus Sep 03 2020 at 10:45

Ruby -0p , 42 ... 35 33 bytes

A ideia de usar os -0psinalizadores (em vez de -ncomo eu tinha originalmente) veio da resposta Perl de @DomHastings , economizando 4 bytes.

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

Experimente online!

Lê o programa de STDIN. Um regex é usado para verificar se o programa contém qualquer caractere diferente de h. Se sim, imprima err; caso contrário, imprime Hello Worldtantas vezes quanto o número de caracteres do programa (fornecido por ~/$/).

Usar um regex literal puro como booleano é um Perlismo obsoleto que (desde o Ruby 1.9) só funciona com os sinalizadores -nou -p.

5 Lyxal Sep 03 2020 at 12:29

05AB1E , 17 bytes

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

Experimente online!

Muito obrigado a @Kevin por sua ferramenta de compressão de dicionário !

E mais uma vez, Kevin atingiu e conseguiu cortar 3 bytes da minha resposta! Portanto, os mencionados agradecimentos devem ser multiplicados por uma magnitude enorme.

Explicado (antigo)

Ð'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 (Hugs 2006), 31 bytes

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

Pendente de uma pergunta ao OP re "erro" em uma mensagem de erro maior. A especificação diz "ele deve imprimir erro ou erro", o que faz no Hugs 2006, especificamente 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╔║

Tente!

Explicado

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

E é por isso que preciso adicionar um if ...

      (              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","")=""retorna TRUEiff A1não contém nada além de h.

REPT("Hello World",LEN(A1))repete a string para quantos caracteres houver A1.

=If(Substitute(~)="",REPT(~),"err")retorna a string repetida se A1contiver apenas he errse contiver qualquer outra coisa.

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

Experimente online!

	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

Jelly , 17 bytes

14 se pudermos imprimir Errcomo substring da saída (por exemplo, “½,⁾ẇṭ»€!fƑ?”h TIO ).

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

Experimente online!

Como?

“½,⁾ẇṭ»€“¹ṫ»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

flex , 76 \$\cdots\$ 55 52 bytes

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

Coloque o código acima em um arquivo chamado hello.le faça o interpretador com:

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

Experimentando no meu terminal:

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

Com newline:

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

observe o errpor causa da nova linha final echonormalmente envia.

Com não hcaractere:

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

Experimente online!

  • Obrigado a @rtpax por economizar 6!

f(char*p){p=- função aderindo a programe retornando com o truque eax, reutilizando p.
Chama a si mesmo recursivamente.
A recursão ocorre antes da programexecução, portanto, se todas as etapas estiverem corretas, um falsevalor é retornado e o programé executado.
Se houver um erro, um truthyvalor é retornado e programnão é executado, uma mensagem de erro é exibida.

* p-'h '? `...`: f (p + 1) ||! puts ("Olá, mundo");
 - verifique cada caractere no programa : se h   continuar a recursão e
   se o resultado for falso, o programa faz seu trabalho.
p é verdadeiro   se houver um erro, mas sim falso .

 - se não h parar a recursão e:
* p - se o fim do programa  
p   for falso 
&& puts ("err") - se não for o fim do programa, o erro de exibição
 p   for verdadeiro .



61 58 bytes alternativa solução menos interessante que executa o programa e pára quando ocorre um erro

f(char*p){*p&&puts(*p-'h'?"err":"Hello World")>4&&f(p+1);}
  • Salvei 3 graças 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'

Experimente online!

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"

Experimente online!

3 Shaggy Sep 03 2020 at 21:59

JavaScript, 49 bytes

-4 bytes se pudermos lançar um erro em vez de enviar uma string.

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

Experimente online!

3 NoOorZ24 Sep 03 2020 at 15:07

JavaScript 72 66 bytes

-6 bytes graças 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.

Se a string sem h's estiver vazia, imprima "Hello World" o número necessário de vezes.

Caso contrário, erro.

Este programa também apresenta erros na entrada vazia.

Experimente online!

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'

Experimente online!

2 Mukundan314 Sep 03 2020 at 13:20

Japt , 23 19 bytes

-4 bytes graças a @Shaggy

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

Tente

Explicação

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ÿ

Experimente online.

Explicação:

'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 desafio foi simples, mas divertido!

Simplesmente verifica se a entrada é apenas "hhh ...." e produz o texto ou "err" para STDOUT:

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

A grande economia de byte foi devido ao comentário do cobalto :

A saída para STDOUT está bem, então você pode usar sua versão de 63 bytes.


Ungolfed:

Abaixo está uma versão mais legível do código:

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

Você pode tentar isso em: http://sandbox.onlinephpfunctions.com/code/e35a07dfbf6b3b56c2608aa86028b395ef457129

2 Veskah Sep 04 2020 at 03:03

PowerShell , 44 bytes

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

Experimente online!

Recebe entrada por splatting

2 Xvolks Sep 05 2020 at 22:34

GFA Basic (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 graças a @ corvus_192 .

Experimente online.

Explicação:

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

Experimente online!

Explicação

?-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))

Experimente online!

Como R é o idioma do mês em setembro de 2020, vamos começar com uma resposta R para este desafio.
No entanto, esta ainda não é a resposta mais curta possível em R , então eu gostaria de encorajar outros jogadores de golfe que não são normalmente R a tentarem também ...

1 Neil Sep 03 2020 at 16:20

Lote, 64 bytes

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

Aceita STDIN. Se a substituição de hs na entrada resultar em uma string vazia, imprima o resultado da substituição de hs por Hello Worldoutra saída err.