Écrivez un interprète pour *

20

La tâche est simple. Écrivez un interprète pour la langue * .

Voici un plus gros lien vers le wiki.

Il n'y a que trois programmes * valides:

  • * Imprime "Bonjour tout le monde"
  •  *  Imprime un nombre aléatoire compris entre 0 et 2 147 483 647
  • *+* Fonctionne pour toujours.

Le troisième cas doit être une boucle infinie selon les spécifications de cette question

Contribution:

  • L'entrée peut être prise via n'importe quelle méthode d'entrée acceptable par nos règles d'E / S standard
  • Ce sera toujours l'un des programmes ci-dessus

Production:

  • Le premier cas doit imprimer exactement Hello World, avec ou sans saut de ligne de fin.
  • Dans le second cas, si le maximum entier de votre langue est inférieur à 2 147 483 647, utilisez le maximum entier de votre langue
  • Les premier et deuxième cas peuvent imprimer sur n'importe quelle sortie acceptable par nos règles d'E / S standard.
  • Le troisième cas ne devrait donner aucune sortie.

Notation:

Comme il s'agit de , la réponse la plus courte, en octets, l'emporte.

TheOnlyMrCat
la source
7
Quand vous dites «entre 0et 2,147,483,647», est-ce inclusif ou exclusif? (Par exemple, 0une sortie valide?)
Chas Brown
7
Changer la spécification après avoir posté un défi et invalider les solutions existantes est une opération automatique -1de ma part.
Shaggy
2
Pour les langues qui ne disposent pas d'un moyen intégré de générer un nombre aléatoire, existe-t-il un moyen acceptable de satisfaire à l'exigence «imprimer un nombre aléatoire»?
Tanner Swett
2
Si les entiers de notre langue n'ont pas, ou un maximum plus élevé, pouvons-nous utiliser une borne supérieure plus élevée?
Jonathan Allan
7
@Shaggy Je ne vois aucun changement de règle dans le wiki pour la question, seulement un espace vers un espace insécable (vérifiez l'onglet de démarque), parce que le rendu de démarque SE ne le rendait pas, mais en regardant la révision d'origine , il est clair qu'il devrait s'agir d'espaces normaux, et le "hack" n'est effectué que pour les problèmes de rendu de démarque SE
Ferrybig

Réponses:

20

* , 0 octets


Puisque * n'a aucun moyen de lire l'entrée, les règles par défaut permettent de spécifier que l'entrée doit être donnée en la concaténant sur le programme .

(... Je pense. Il y a une condition "au moins deux fois plus de votes positifs que négatifs" que je n'ai pas de représentant pour vérifier).

Henning Makholm
la source
4
Votre méta liée est en effet une norme de site actuellement acceptée (+31 -7).
Jonathan Allan
2
@A__: Il me semble qu'il doit avoir été conçu spécifiquement pour satisfaire la définition proposée par quelqu'un de 'langage de programmation' ("Vous pouvez écrire bonjour le monde!" "Vous pouvez écrire une boucle infinie!" "Vous pouvez écrire un programme qui ne fonctionne pas ne fais pas toujours la même chose! ").
Henning Makholm
Je pense que techniquement Malbolge n'est pas non plus un langage de programmation.
Bob Jansen
1
Malbolge est un langage de programmation pour les automates finis, identique à * et, par exemple, Befunge-93. Par conséquent, Malbolge est un langage de programmation formel, le même que *, techniquement le même que les langages récursivement énumérables en ce qui concerne la définition du langage de programmation (bien que les langages formels soient moins puissants).
Krzysztof Szewczyk
Votez de ma part, car honnêtement, cette réponse est si ennuyeuse qu'elle est en fait déjà une échappatoire standard , même si nous ignorons la question de savoir si * est un langage de programmation
AlienAtSystem
8

R , 69 octets

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

Essayez-le en ligne!

switchessaie de faire correspondre les arguments nommés et s'il n'y a pas de correspondance, sélectionne le premier sans nom après le premier, qui dans ce cas est la boucle infinie repeat{}.

Giuseppe
la source
6

Gelée ,  21  20 octets

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

Un lien monadique acceptant une liste de personnages.

Essayez-le en ligne!

vL’... fonctionne également (voir ci-dessous).

Comment?

Ḋ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"

Alternative

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
la source
5

C (gcc) , 66 63 octets

Merci à attinat pour les -3 octets.

Je n'ai qu'à vérifier le deuxième caractère: si le LSB est défini, c'est un +(donc le programme est " *+*") et le programme boucle. Après cela, si c'est un NUL, le programme était " *" et nous affichons Hello World; sinon, il affiche une valeur aléatoire ("  * ", la seule autre option qui reste.)

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

Essayez-le en ligne!

ErikF
la source
63 octets
attinat
Rasez un octet:f(char*s){*++s&1?f(s-1):printf(*s?"%d":"Hello World",rand());}
Roman Odaisky
Note pédante: il randn'est pas garanti de retourner une valeur suffisamment grande; RAND_MAXet INT_MAXne sont pas garantis d'être les mêmes (et ne sont pas sur des compilateurs du monde réel, par exemple Visual Studio RAND_MAXest 32767, tandis que INT_MAXest [sur les systèmes dérivés x86 modernes] la 2147483647valeur spécifiée dans la question de l'OP).
ShadowRanger
@ShadowRanger, c'est tout à fait vrai, mais étant donné que> 90% de toutes les entrées CGCC basées sur C reposent sur un comportement indéfini et non spécifié, cela ne m'inquiète pas! Je n'avais pas non plus envie d'implémenter un LCG golfé par code aujourd'hui. :-)
ErikF
5

Python 2 , 103 93 89 87 octets

Je combiné ma réponse plus tôt avec Chas Browns réponse et a obtenu quelque chose de quelques octets plus court.

Le nombre aléatoire sera compris entre 0 et 2 ** 31-1 inclus.

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

Essayez-le en ligne!

Versions précédentes:

103 octets

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

93 octets

from random import*
i=cmp(input(),'*')
while i>0:1
print["Hello World",randint(0,2**31-1)][i]
mbomb007
la source
Économisez 2 octets en remplaçant randint(0,2**31-1)par randrange(2**31).
Chas Brown
while'*'<isauve 2
Jonathan Allan
Enregistrez un autre octet en changeant randrange(2**31)en getrandbits(31)(ce dernier retourne longnon int, mais printimprimera le strformulaire, pas le reprformulaire, donc le dernier Lne sera pas là).
ShadowRanger
Relativement peu expérimenté avec le site, donc clarification rapide: avez-vous le droit d'exiger que votre contribution soit citée? i=input()ne fonctionne que si les entrées sont citées, si vous saisissez simplement*/ * /*+* , il mourrait avec un SyntaxError(car inputinclut un implicite eval); vous devez saisir '*'/' * '/'*+*'(ou l'équivalent avec des guillemets à la place). Je n'ai rien vu d'évident sur les règles d'E / S standard qui permettraient cela, ce qui pourrait signifier que vous auriez besoin d'utiliser raw_input(), coûtant quatre octets.
ShadowRanger
@ShadowRanger input()prend une chaîne en entrée et l'évalue. Je n'ajoute pas vraiment à l'entrée, je prends simplement une chaîne en entrée et les chaînes ont des guillemets. C'est assez standard, de la même manière que je peux prendre un tableau comme [1,2,3]au lieu d'une chaîne délimitée que je dois ensuite diviser et analyser. Le but du site n'est pas de rendre l'entrée stricte, c'est de faciliter les E / S afin que nous puissions concentrer le code sur le défi à relever.
mbomb007
5

Keg , -lp, -ir 30 26 25 24 20 19 octets

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

-1 octet utilisant des drapeaux

Essayez-le en ligne!

Historique des réponses

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

Essayez-le en ligne!

Raccourci Hello Worlden chaîne de dictionnaire

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

Essayez-le en ligne!

Je n'ai jamais cessé d'être étonné de la puissance de Keg. Crédits à l'utilisateur EdgyNerd pour un autre octet enregistré.

Versions antérieures

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

Essayez-le en ligne!

Crédit à l'utilisateur A__ pour l'octet supplémentaire enregistré.

Ancienne version

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

Essentiellement, prend le programme d'entrée et:

  • Vérifie si la longueur d'entrée est 1, imprimant "Hello World" si vrai
  • Vérifie si le dernier caractère est un espace et imprime un nombre aléatoire
  • Sinon, exécute une boucle infinie

Imprimez ensuite implicitement la pile.

?                               #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 octets économisés car le monde bonjour n'a pas besoin de ponctuation.

Essayez-le en ligne! Ancienne version

Essayez-le en ligne! Nouvelle version

Jono 2906
la source
Vous pouvez couper 4 octets, vous n'avez pas besoin de virgule ou d'exclamation dans "Hello World".
TheOnlyMrCat
1
Maintenant, je dois apprendre une autre langue impopulaire afin de répondre aux défis ici normalement.
Un
1
-1 octets: TIO . Je suis heureux de ne pas avoir perdu ma capacité de jouer au golf à Keg.
Un
@A__ Profiter de Keg sur TIO?
Jono 2906
2
24 octets :)
EdgyNerd
3

Befunge-93 , 54 octets

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

Essayez-le en ligne!

Annoté:

~"*"-                      _                ~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

Le caractère aléatoire n'est pas uniforme. À chaque incrément, il y a 50% de chances d'arrêter l'incrémentation.

sept négatif
la source
3

Japt , 22/25 octets

La première solution est pour la spécification d'origine qui avait *<space>comme deuxième programme et l'autre est pour la spécification mise à jour qui l'a arbitrairement changé en <space>*</space>, avec merci à EoI pour le "correctif" suggéré.

Les deux lancent une erreur de débordement en entrant dans la boucle infinie du troisième programme mais, théoriquement, avec suffisamment de mémoire (que nous pouvons supposer aux fins du ), fonctionnerait pour toujours.

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

Essayez le programme 1
Essayez le programme 2
Essayez le programme 3

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

Essayez le programme 1
Essayez le programme 2
Essayez le programme 3

Hirsute
la source
Je pense que le deuxième programme est "[SPACE] * [SPACE]", pas "[SPACE] *", donc votre programme ne fonctionne pas
Embodiment of Ignorance
@EmbodimentofIgnorance, au moment où j'ai posté, le deuxième programme de la spécification était *<space> . Je n'ai pas le temps de mettre à jour maintenant.
Shaggy
Vous pouvez le corriger en trois octets avec UÌ>Sau lieu du ¢deuxième ternaire
Embodiment of Ignorance
@Downvoter, veuillez avoir la courtoisie de laisser un commentaire.
Shaggy
2

JavaScript (ES7), 66 octets

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

Essayez-le en ligne!(Bonjour le monde)

Essayez-le en ligne!(nombre aléatoire)

Essayez-le en ligne! (boucle infinie)

Arnauld
la source
Ne x=(z=>x())&&x()fonctionnerait pas pour -1 octet à partir du code de boucle infinie, en supposant un navigateur sans taille maximale de pile d'appels?
Geza Kerecsenyi
@GezaKerecsenyi Nous pourrions simplement nous appeler ( comme ça ) mais je ne suis pas sûr que ce serait acceptable.
Arnauld
c'est juste. Je me demande s'il y a un navigateur obscur qui continue (au moins jusqu'à épuisement de la RAM)
Geza Kerecsenyi
1
@Arnauld, théoriquement, cela fonctionnerait pour toujours avec une mémoire infinie, ce que nous pouvons supposer pour le golf de code.
Shaggy
2

Gelée , 23 21 octets

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

Essayez-le en ligne!

Un lien monadique prenant un seul argument et revenant Hello World , un entier aléatoire de 31 bits ou bouclant à l'infini selon la spécification.

Toutes les options: * * *+*

Explication

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
la source
2

Python 2 , 91 89 88 octets

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

Essayez-le en ligne!

2 octets merci à Jonathan Allan ; 1 octet de thx à ShadowRanger .

Chas Brown
la source
while'*'<psauve 2
Jonathan Allan
getrandbits(31)enregistre un octet de plus randrange(2**31).
ShadowRanger
Agréable! Je ne connaissais pas les getrandbits ...
Chas Brown
1

Rubis -n , 47 octets

puts~/ /?rand(1<<31):~/\+/?loop{}:"Hello World"

Essayez-le en ligne!

Encre de valeur
la source
1

Fusain , 30 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Abuse le format d'entrée par défaut de Charcoal qui se divise en espaces s'il n'y a qu'une seule ligne, donc l'entrée de nombre aléatoire ressemble en fait à trois entrées. Explication:

W№θ*

Répétez pendant que la première entrée contient un *.

F⁼θ*

Si la première entrée est une *seule ...

≔Hello Worldθ

... puis remplacez-le par Hello World, provoquant ainsi la fin de la boucle. *+*n'est pas remplacé, ce qui entraîne une boucle infinie.

∨θ

Si la première entrée n'est pas vide, sortez-la.

I‽X²¦³¹

Mais s'il est vide, sortez un entier aléatoire dans la plage souhaitée.

Neil
la source
1

Ajouter ++ , 78 octets

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

Essayez-le en ligne!

Explication

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
la source
1

Brachylog , 26 23 octets

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

Essayez-le en ligne!

Prend le programme sous forme de chaîne dans la variable d'entrée et ignore la variable de sortie. Exploite fortement la garantie que l'entrée n'est que l'un des trois programmes valides: toute entrée de longueur trois se comportera comme " * "ou "*+*"selon que le premier caractère est ou non un espace, et toute autre entrée se comportera comme "*".

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!".
Chaîne indépendante
la source
Oups, mauvais "Bonjour tout le monde" - correction maintenant
Chaîne non
1

PHP , 51 octets

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

Essayez-le en ligne! (Bonjour le monde)

Essayez-le en ligne! (Nombre aléatoire)

Essayez-le en ligne! (Boucle infinie)

Prend le deuxième caractère d'entrée qui peut être '', '*'ou '+'. Dans le cas où '+'le '*'<'+'sera vrai et la boucle sera infinie, sinon, après la boucle, "Hello World" ou un nombre aléatoire est affiché. Le rand()produit automatiquement un nombre entre 0 et getrandmax()qui utilise défini RAND_MAXdans la bibliothèque C standard et par défaut est 2147483647sur la plupart des plates-formes / environnements, y compris TIO.

Nuit2
la source
1

05AB1E , 21 octets

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

Essayez-le en ligne. (REMARQUE: la construction aléatoire est assez lente avec de grandes listes, donc cela peut prendre un certain temps avant que le résultat ne soit donné.)

Explication:

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

Voir cette astuce de la mine de 05AB1E (section Comment utiliser le dictionnaire? ) Pour comprendre pourquoi ”Ÿ™‚ïest "Hello World".

Kevin Cruijssen
la source
1

Pyth , 32 octets

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

Essayez-le en ligne!

Explication (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
la source
Cela imprime un nombre compris entre 0 et 2 ^ 32, et non 0 et 2 ^ 31. Une façon plus courte d'écrire hC*4\ÿest ^2 32, mais pour que la solution soit correcte, vous devez utiliser à la ^2 31place. En outre, utilisez zau lieu de Jw, enregistre 1 octet de plus. Et votre explication saute la ligne avec tjuste avant lJ.
randomdude999
En outre, vous pouvez détecter la commande "boucle pour toujours" en vérifiant si l'entrée contient un +caractère, enregistre 1 octet car vous n'avez pas besoin de le décrémenter.
randomdude999
0

APL (Dyalog Unicode) , 39 octets SBCS

Préfixe anonyme lambda.

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

Essayez-le en ligne!

{ "dfn"; est l'argument:

'+'∊⍵: si plus est membre de l'argument:

  ∇⍵ queue recurse sur l'argument

' '∊⍵ si l'espace est membre de l'argument:

  ?0 flotteur aléatoire (0–1)

  2E31× échelle à (0–2³¹)

   sol

'Hello World' sinon retourner la chaîne

Adam
la source
0

Commodore BASIC (VIC-20, C64, TheC64Mini etc.) - 170 tokenize BASIC octets

 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

Je pense que pour le faire plus précisément, je vais devoir me plonger dans le monde étrange du langage d'assemblage 6502, mais ceci est un premier projet.

Premier point, le INPUTmot - clé dans Commodore BASIC ignore les espaces blancs, donc la sous-routine à la ligne 9est un moyen rapide et sale d'accepter les entrées du clavier, y compris les espaces.

Deuxième point, les entiers Commodore BASIC ont une plage de 16 bits signés, donc -32768 à +32767 source - j'ai donc gardé le nombre aléatoire généré entre 0 et 32767 inclus

Shaun Bebbers
la source
0

Roitelet ,143 135 octets

Je ne suis pas un bon golfeur ... Le RNG génère à chaque fois la même valeur car c'est un générateur de nombres pseudo-aléatoires.

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

Essayez-le en ligne!

UNE
la source
0

JavaScript, 63 octets, pas de récursivité infinie

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

mauvais réseau donc pas de lien TIO

l4m2
la source