Ecrire un interprète «Bonjour»
Contexte
Hello est un langage "écrit" par Anne Veling , qui se trompe si le programme n'en contient pas seulement h, et qui s'imprimera Hello Worldpour chaqueh
Tâche
Vous devez écrire un interpréteur / compilateur pour Hello.
Exemple en Python
import os
i = input("Program: ")
for a in i:
if a != 'h':
print("err")
quit()
else:
print("Hello World")
Détails
- Si le programme n'est pas seulement
hs, il doit imprimererrouerror(insensible à la casse) - Ce n'est pas grave si vous imprimez "Hello World" avant que votre programme ne découvre un non-
hcaractère et des erreurs, cependant, le programme doit s'arrêter sih - Vous pouvez lancer une erreur, tant que vous imprimez
err/erroravant de lancer, ou en utilisant une erreur personnalisée intégrée, commeraise SyntaxError('err')en python. (en gros, vous devez délibérément faire une erreur avecerr/error - Supposons que le programme ne soit pas vide
- La sortie peut avoir une nouvelle ligne de fin, un espace ou rien pour séparer les
Hello Worlds - Si un programme a plusieurs lignes, il devrait erreur (car il
\nne s'agit pas d'unh) - Vous pouvez supposer que l'entrée sera toujours ASCII 33-126 et 10 (décimal)
- Les
hs sont sensibles à la casse (ceHn'est donc pas un programme valide) une instruction est trouvée - C'est du code-golf , la réponse la plus courte gagne
Cas de test
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
Premier défi alors s'il vous plaît ayez pitié
Réponses
Langue , \$1.42 \times 10^{122}\$ octets
moins beaucoup d'octets grâce à Kevin Cruijssen et Bubbler
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh...
Il s'agit de 142099843608359281286315447494338058415442968773543757980908246691462388164856076679905341690709953072132211450166077106439 hs, ce qui en fait également un programme Hello valide, mais pas celui que vous voudriez exécuter. Le code original de brainfuck est de 140 135 octets:
,[>-[<-->-----]+<--[>]>[[-->-[>>+>-----<<]<--<---]>-.>>>+.>>..+++.>>.>.<<<.+++.------.<<-.[>]>>>>,>]<]<[[>++<+++++]>-.+++++++++++++..>]
Essayez-le en ligne!
Cela imprime Hello World à chaque fois qu'il voit hune modification du plus court Hello, World! programme , arrêtant la boucle et imprimant errs'il voit autre chose qu'un h.
Python 3 , 49 octets
lambda s:{*s}-{'h'}and'err'or'Hello World'*len(s)
Essayez-le en ligne!
Python 2, 51 octets
lambda s:s.strip('h')and'err'or'Hello World'*len(s)
Essayez-le en ligne!
Python 2, 51 octets
lambda s:['err','Hello World'*len(s)]['h'+s==s+'h']
Essayez-le en ligne!
APL (Dyalog Unicode) , 32 octets ( SBCS )
Fonction de préfixe tacite anonyme.
{'h'=⍵:'Hello World'⋄-⎕←'err'}⍤0
Essayez-le en ligne!
{… }⍤0 Remplacez chaque caractère ( ⍵) par le résultat de l'application du lambda suivant:
'h'=⍵: si le caractère est h:
'Hello World' renvoie la phrase souhaitée
⋄ autre:
⎕←'err' imprimer l' err
- annulation (provoquant une erreur et arrêtant)
R , 76 octets
function(p,n=nchar(p))ifelse(p==strrep('h',n),strrep("Hello World",n),'err')
Essayez-le en ligne!
Devrait être un commentaire sur https://codegolf.stackexchange.com/a/210520/98085- Je ne savais pas que vous pouviez faire de telles fonctions! Légère modification pour être plus robuste lorsque n = 0 et utiliser la comparaison directe plutôt que l'expression régulière. -1 octet grâce àhttps://codegolf.stackexchange.com/users/90265/zippymagician.
Version bonus avec effets secondaires (comme redéfinir la soustraction) grâce à https://codegolf.stackexchange.com/users/92901/dingus.
R , 71 octets
{`-`=strrep;function(p,n=nchar(p))`if`(p=='h'-n,'Hello world'-n,'err')}
Essayez-le en ligne!
Gema , 23 caractères
h=Hello World
?=err@end
Exemple d'exécution:
bash-5.0$ echo -n 'hohoho' | gema 'h=Hello World;?=err@end'
Hello Worlderr
Gema (ancienne version avec err sur code vide), 32 caractères
\A\Z=err
h=Hello World
?=err@end
Essayez-le en ligne! / Essayez tous les cas de test en ligne!
code machine x86-16, IBM PC DOS, 41 40 octets
Binaire:
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$
Référencement:
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$'
Programme COM exécutable PC DOS autonome. Entrée via la ligne de commande. Cette version s'imprime Hello Worlderrsi une erreur est dans le code d'entrée.
Et pour le plaisir (et depuis que je l'ai fait en premier), cette version ne s'imprimera que errsi une erreur est dans le code.
code machine x86-16, IBM PC DOS, 47 45 44 octets
Binaire:
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$
Référencement:
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$'
Accessoires:
- -1 octet pour les deux grâce à @MatteoItalia pour la suggestion de ne changer que l'octet de poids faible sur le pointeur de la chaîne d'erreur.
Rubis -0p , 42 ... 35 33 octets
L'idée d'utiliser les -0pindicateurs (au lieu de ce -nque j'avais à l'origine) est venue de la réponse Perl de @ DomHastings , économisant 4 octets.
$_=/[^h]/?:err:'Hello World'*~/$/
Essayez-le en ligne!
Lit le programme depuis STDIN. Une expression régulière est utilisée pour vérifier si le programme contient un caractère autre que h. Si oui, imprimez err; sinon, imprimez Hello Worldautant de fois que le nombre de caractères du programme (donné par ~/$/).
Utiliser un littéral regex nu comme booléen est un Perlisme obsolète qui (depuis Ruby 1.9) ne fonctionne qu'avec les indicateurs -nou -p.
05AB1E , 17 octets
'hÃQig”Ÿ™‚ï”×ë'‰ë
Essayez-le en ligne!
Un grand merci à @Kevin pour votre outil de compression de dictionnaire !
Et encore une fois, Kevin a frappé et a réussi à raser 3 octets de ma réponse! Les remerciements susmentionnés doivent donc être multipliés par une ampleur considérable.
Expliqué (ancien)
Ð'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 (Hugs 2006), 31 octets
mapM(\'h'->putStr"Hello World")
En attendant une question à l'OP re "erreur" dans un message d'erreur plus grand. La spécification dit "il doit imprimer une erreur ou une erreur", ce qu'il fait sur Hugs 2006, en particulier le 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 octets
ùÝ└ån<⁼aLw$■v&Z(#▄╗└·I╔║
Essayez-le!
Expliqué
Déballé: (${="h"})#=#&&'yt bs'^#||"err
Et c'est pourquoi je dois ajouter 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 octets
=IF(SUBSTITUTE(A1,"h","")="",REPT("Hello World",LEN(A1)),"err")
SUBSTITUTE(A1,"h","")=""renvoie TRUEiff A1ne contient rien d'autre que h.
REPT("Hello World",LEN(A1))répète la chaîne pour le nombre de caractères inclus A1.
=If(Substitute(~)="",REPT(~),"err")renvoie la chaîne répétée si A1contient uniquement het errsi elle contient autre chose.
SNOBOL4 (CSNOBOL4) , 94 octets
I =INPUT
I NOTANY('h') :S(E)
OUTPUT =DUPL('Hello World',SIZE(I)) :(END)
E OUTPUT ='err'
END
Essayez-le en ligne!
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
Gelée , 17 octets
14 si nous pouvons imprimer Errcomme sous-chaîne de la sortie (par exemple “½,⁾ẇṭ»€!fƑ?”h TIO ).
“½,⁾ẇṭ»€“¹ṫ»fƑ?”h
Essayez-le en ligne!
Comment?
“½,⁾ẇṭ»€“¹ṫ»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
flex , 76 \$\cdots\$ 55 52 octets
%%
h puts("Hello World");
[^h] puts("err");exit(1);
Mettez le code ci-dessus dans un fichier appelé hello.let créez l'interpréteur avec:
flex hello.l && gcc lex.yy.c -o hello -lfl
Essayer sur mon terminal:
> echo -n hhh|./hello.exe
Hello World
Hello World
Hello World
Avec nouvelle ligne:
> echo hhh|./hello.exe
Hello World
Hello World
Hello World
err
remarquez errque le retour à la ligne de fin echoenvoie normalement.
Avec non- hcaractère:
> echo -n hhhehhh|./hello.exe
Hello World
Hello World
Hello World
err
C (gcc) , 71 65 octets
f(char*p){p=*p-'h'?*p&&puts("err"):f(p+1)||!puts("Hello World");}
Essayez-le en ligne!
- Merci à @rtpax d'avoir économisé 6!
f(char*p){p=- fonction de virement a programet de retour avec l'astuce eax, réutilisation p.
S'appelle récursivement.
La récursivité se produit avant l' programexécution, donc si toutes les étapes sont correctes, une falsevaleur est renvoyée et le programest exécuté.
S'il y a une erreur, une truthyvaleur est renvoyée et programn'est pas exécutée du tout, un message d'erreur s'affiche.
* p-'h '? `...`: f (p + 1) ||! met ("Hello World");
- vérifier chaque caractère du programme : si h continuez la récursion et
si le résultat est faux, le programme fait son travail.
p est vrai s'il y a eu une erreur, faux à la place.
- sinon h arrêter la récursivité et:
* p - si la fin du programme
p est faux
&& met ("err") - si ce n'est pas le cas , l' erreur d'affichage
de la fin du programme p est vraie .
61 58 octets solution alternative moins intéressante qui exécute le programme et s'arrête lorsqu'une erreur se produit
f(char*p){*p&&puts(*p-'h'?"err":"Hello World")>4&&f(p+1);}
- Enregistré 3 grâce à @rtpax!
Python 3 , 52 octets
lambda x:(x=='h'*len(x))*len(x)*'Hello World'or'err'
Essayez-le en ligne!
Python 3 , 58 octets
lambda s:s and s=="h"*len(s)and"Hello World"*len(s)or"err"
Essayez-le en ligne!
JavaScript, 49 octets
-4 octets si nous pouvons lancer une erreur au lieu de générer une chaîne.
f=([c,...a])=>c?c==`h`?`Hello World`+f(a):`err`:a
Essayez-le en ligne!
JavaScript 72 66 octets
-6 octets grâce à @Ismael Miguel
alert(/^h*$/.test(a=prompt())?a.replace(/h/g,'Hello World'):'err')
Pip , 28 27 octets
aRM'h?"err""Hello World"X#a
-1 octet de DLosc.
Si la chaîne sans h est vide, affichez "Hello World" le nombre de fois requis.
Sinon, erreur.
Ce programme erreurs également sur une entrée vide.
Essayez-le en ligne!
Python 3 , 57 52 octets
lambda a:a=='h'*len(a)and'Hello World'*len(a)or'err'
Essayez-le en ligne!
Japt , 23 19 octets
-4 octets grâce à @Shaggy
rh ?`r`:¡`HÁM Wld
Essayez-le
Explication
rh ?`...`:¡`...
? // if
rh // input with 'h' removed
`...` // then "err"
: // else
¡ // each char in input
`... // replaced with "Hello World"
MathGolf , 23 20 octets
'h-╛æ╖•p0{δ╕○ô 'W╕7ÿ
Essayez-le en ligne.
Explication:
'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 octets
Ce défi était simple mais amusant!
Vérifie simplement si l'entrée est juste "hhh ...." et renvoie le texte, ou renvoie "err" à STDOUT:
{@ifargv.0 matches"@^h+$@"M}{@eachM.0}Hello World{@/}{@else}err
La grande économie d'octets était due au commentaire de the-cobalt :
La sortie vers STDOUT est très bien, vous pouvez donc utiliser votre version 63 octets.
Non golfé:
Voici une version plus lisible du code:
{@if argv.0 matches "@^h+$@"}
{@each argv.0 as h}
{@echo "Hello World"}
{@/}
{@else}
{@echo "err"}
{@/}
Vous pouvez essayer ceci sur: http://sandbox.onlinephpfunctions.com/code/e35a07dfbf6b3b56c2608aa86028b395ef457129
PowerShell , 44 octets
$args|%{if($_-104){'err';exit}"Hello World"}
Essayez-le en ligne!
Prend une entrée en éclaboussant
GFA Basic (Atari ST), 125 octets
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 octets
s->s.matches("h+")?s.replace("h","Hello World"):"err"
-12 octets grâce à @ corvus_192 .
Essayez-le en ligne.
Explication:
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 octets
?-Q\h"err"*"Hello World"l
Essayez-le en ligne!
Explication
?-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 octets
function(p,n=nchar(p))`if`(n-lengths(gregexpr("h",p)),"err",strrep("Hello World",n))
Essayez-le en ligne!
Comme R est la langue du mois de septembre 2020, lançons le bal avec une réponse R à ce défi.
Cependant, ce n'est toujours pas la réponse la plus courte possible en R , alors j'aimerais encourager d'autres golfeurs qui ne sont pas normalement R à essayer aussi ...
Lot, 64 octets
@set/ps=
@if "%s:h=%"=="" (echo %s:h=Hello World%)else echo err
Prend une entrée sur STDIN. Si le remplacement du hs dans l'entrée entraîne une chaîne vide, affichez le résultat du remplacement du hs par Hello Worldune sortie autrement err.