Deadfish est un "langage de programmation" blague avec quatre commandes. Étant donné que la page Esolang est un peu contradictoire et que les interprètes de cette page ne fonctionnent pas tous exactement de la même manière, vous devez implémenter la variante suivante:
spécification
- Il existe un accumulateur d'une taille d' au moins 16 bits, plus est autorisé, mais moins ne l'est pas. Les nombres négatifs n'ont pas besoin d'être pris en charge. L'accumulateur est au
0
démarrage du programme. - Il existe les deux ensembles de quatre commandes suivants, et votre programme doit prendre en charge les deux en même temps.
Poisson-mort standard Vari Variante XKCD │ Signification ─────────────────────┼──────────────────┼───────── ─────────────────────────── i │ x │ Accumulateur d'incréments d │ d │ Décrémenter l'accumulateur s │ k │ Carré (acc = acc * acc) o │ c │ Accumulateur de sortie, en nombre
- Si, après avoir exécuté une commande, l'accumulateur est soit
-1
ou256
, l'accumulateur doit être remis à zéro. Notez que ce n'est pas un bouclage normal. Si, par exemple, l'accumulateur l'est20
et que las
commande est exécutée, l'accumulateur doit l'être400
après. De même, si l'accumulateur est257
et lad
commande est exécutée, l'accumulateur devrait devenir0
. - Toute entrée qui ne fait pas partie de ces commandes doit être ignorée.
Programmes de test
xiskso
devrait sortir0
xiskisc
devrait sortir289
E / S
Votre programme devrait afficher une invite: >>
. L'invite doit être au début d'une nouvelle ligne. Il doit ensuite lire une ligne d'entrée utilisateur et exécuter les commandes données de gauche à droite. Lors de la sortie de nombres, les nombres doivent être séparés. C'est à dire, 12 34
est OK, 12,34
est OK,
12
34
est OK, mais 1234
ne l'est pas.
Votre programme doit continuer à le faire en boucle, au moins jusqu'à ce qu'il EOF
soit atteint.
Exemple de session:
>> xiskso
0
>> xiskisc
289
>> ddddo ddddo
285
281
>> ddddo ddddo
277
273
>> dddddddo
266
>> dddddddddo
257
>> do
0
>> do
0
>> io
1
>>
code-golf
interpreter
deadfish
marinus
la source
la source
#{STDIN.gets}
marcherait mais en effet ça ne marche pas.Réponses:
K, 77 octets
Notez que c'est K4 . Une solution K6 est légèrement plus longue car les verbes IO sont plus longs, même si tout le reste est meilleur:
""0:
imprime et renvoie son argument. Remarque en K4, nous appliquons simplement à 1 .0 f/ args
montre réduire avec une valeur initiale, c.-à-d.f[f[0;first arg];second arg]…
{x*2=-1 256?x…
classe x en 0 (pour -1), 1 (pour 256) et 2 pour toutes les autres valeurs.2=
signifie que nous obtenons1
des valeurs non classifiées et0
sinon, multiplier parx
est plus court qu'un conditionnel. En K6, nous pouvons faire un peu mieux, car nous nous{x*^-1 256?x:y@x}
appuyons sur le fait que-1 256?x
renvoie0N
(null) et^
détecte les nulls."xkcdiso"
au lieu de l'ordre suggéré car7#
il s'enroulera autour des quatre arguments, c'est-à-dire des7#"abcd"
retours"abcdabc"
qui gardent notre table plus petite"x"
et"i"
à la projection1+
qui est équivalente à la fonction{1+x}
mais plus courte."d"
par la projection-1+
qui est équivalente à la fonction{-1+x}
mais plus courte."k"
et"s"
à la fonction{x*x}
"c"
et"o"
à la fonction de sortie{-1@$x;x}
qui à nouveau dans K6 est légèrement plus long:{""0:,$x;x}
mais à la fois imprimer sa sortie suivie d'un saut de ligne, puis retourne l'argument.o`
lequel est le plus court.la source
Perl 5 , 90 octets
Essayez-le en ligne!
Merci à @xfix pour son aide à ce sujet auparavant! 4 octets enregistrés grâce à @Xcali !
la source
1
lorsque l'accumulateur déborde. De plus, vous pouvez raccourcir votre programme de cinq caractères, en changeant$a
en$?
(qui est initialisé en0
, et ne changera pas tant que vous n'aurez pas exécuté un programme externe depuis Perl).issso
une seule commande, pas si vous les exécutez séparément ... J'y reviendrai plus tard et j'utiliserai certainement$?
. Merci!''
au lieu de""
donc lorsqu'elle est utilisée avecperl -e '...'
la carte se terminerait par le résultat de las///
. Merci encore!Powershell,
131126121 121114113for($x=0){...}
- mettre l'accumulateur à 0 et boucler pour toujoursread-host '>>'
- obtenir l'entrée utilisateur avec invite>>
[char[]](...)
- convertir l'entrée utilisateur en un tableau de caractères|%{...}
- effectuer ce qu'il y a à l'intérieur{}
pour chaque personnageswitch -r($_)
- commutateur regex pour chaque personnage"i|x"{$x++}
- correspondrei
oux
- augmenter l'accumulateur"d"{$x-=!!$x}
- matchd
- diminue$x
de!!$x
, qui sera0
si$x
est0
, et1
sinon. Cela garantit que l'accumulateur n'atteint jamais-1
."s|k"{$x*=$x}
- matchs
ouk
- carré"o|c"{$x}
- correspondreo
ouc
- sortir l'accumulateur$x*=$x-ne256
- multiplier l'accumulateur par0
s'il l'est256
ou par le1
contraireExemple de sortie
Je suppose que l'implémentation de
read-host
est spécifique à l'hôte, donc cet hôte Powershell (ConsoleHost) s'ajoute:
à l'invite spécifiée.la source
!!$x
, dommage que je ne puisse pas utiliser ça ...Rebol 3,
178169161 161159Version plus jolie:
la source
Haskell, 202
la source
e
etv
en opérateurs. J'ai également essayé de réécrirev
etg
pour que le paramètrex
reste en IO,print
etc. Je n'ai pas réussi à le faire fonctionner, mais je pense que ce pourrait être un bon endroit où aller pour quelqu'un qui connaît son haskell.IO
est qu'elles impriment trop souvent (c'est pourquoi j'ai utilisé à lar n
place dex
) ou pas assez parce que la valeur n'est jamais demandée…. Alors, comment pourrais-je changere
etv
devenir opérateur?'i'%x=x+1;'d'%x=x-1
... Et appelez-le simplement dans vdo n<-x;r$w$o%n
. La raison pour laquelle les opérateurs économisent de l'espace est qu'ils n'ont pas besoin d'espace autour d'eux.Rubis,
140138Exemple de session (identique à la vôtre):
la source
K, 121
.
la source
Ada
Voici une implémentation Ada pour les quelques personnes intéressées par ce langage. Il m'a fallu un certain temps pour utiliser certaines des meilleures pratiques d'Ada (comme l'utilisation d'Indefinite_Holders au lieu de l'accès) et aussi pour comprendre pleinement comment doit fonctionner Deadfish.
Et la sortie:
Si certaines personnes expérimentées à Ada pouvaient me donner quelques conseils d'optimisation, je serais reconnaissant.
la source
C, 159 caractères
J'ai essayé une autre approche basée sur la mise en place d'une table de recherche pour le décodage des instructions, mais malheureusement, cela s'est avéré plus long ( 169 ). Je l'ai inclus car quelqu'un pourrait proposer un ajustement intelligent pour réduire la taille. (Doit être exécuté sans aucun argument)
la source
C, 163
la source
Python 3,
181175171162Cela produit une nouvelle ligne après lePlus maintenant!>>
, mais l'OP n'a pas dit que ce n'était pas autorisé.Merci à
GlitchMr
,minitech
etgolfer9338
!la source
lambda
au lieu dedef
pour une fonction qui renvoie immédiatement.x in(-1,256)
enregistre deux caractères. Alternativement,s=lambda x:"a=%d"%(x!=-1and x!=256and x)
pourrait en sauver quelques-uns.print(">>")
et utiliser à lafor i in input(">>")
place;input()
permet de spécifier une invite. Ensuite, il n'y aura plus de nouvelle ligne>>
et vous enregistrerez des caractères.R,
161,148, 138Version non golfée:
Exemple de session (en mode interactif):
la source
Python 3, 141
Je sais que je suis en retard, mais je voulais profiter de l'occasion pour publier une version Python plus courte (et ma première tentative CodeGolf). :)
La déclaration d'impression était un peu délicate pour cela. Si l'invite doit se terminer par un espace, ajoutez un caractère au nombre. :)
Explication
v
est l'accumulateur.m
vérifie si la valeur donnée est-1
ou256
. Si c'est le cas,0
sera retourné, la valeur sinon.Dans les lignes suivantes, les opérations sont affectées aux variables correspondantes (car certaines ont la même signification (comme
i
etx
) c'est plus court que l'instanciation d'un nouveau dictionnaire). Ceux-ci sont ensuite utilisés dans ce quiexec
suit.while 1:
est la boucle principaleMaintenant, le plaisir commence. Comme la solution de @jazzpi , elle itère sur chaque caractère de l'entrée.
locals()
est le dictionnaire de toutes les variables actuelles (visibles). Avec.get(n,'')
la clé correspondante sera mise dans la chaîne exec (une chaîne vide, si la clé (= autre entrée) n'a pas été trouvée). Celui-ci sera alors, une fois exécuté, concaténév
et transmis versm
. La valeur de retour sera àv
nouveau enregistrée .Répétez cette opération jusqu'à ce que vous vous ennuyiez. :)
la source
y*(-1!=y!=256)
de -3 octetsPython 2, 139
C'est bien, mais aussi assez simple. Voici une version plus longue et plus cool:
Pesant 190 caractères, ce n'est peut-être pas la réponse la plus compétitive ici. D'un autre côté, les coroutines sont plutôt cool et je cherche toujours une excuse pour les utiliser (et les partager)
la source
TI-BASIC,
104 10710210098Pour les calculatrices de la série TI-83 + / 84 +.
Nommez ceci
prgmD
; il déborde finalement la pile en s'appelant. Remplacez la récursivité par unWhile 1
, au prix de deux octets, pour résoudre ce problème.Y est 0 par défaut, donc exécutez-le avec une calculatrice fraîchement effacée de la mémoire ou stockez 0 à Y manuellement avant de l'exécuter.
Dommage que les lettres minuscules (dans les littéraux de chaîne) soient deux octets chacune; sinon, ce serait plus court que la réponse de Dom Hastings.
EDIT: correction d'une erreur de division par zéro (0 ^ 0) au prix de trois octets.
107 -> 102: Astuce d'exponentiation imaginaire pour enregistrer quatre octets (dont 1 entre parenthèses et -1 pour allonger la chaîne de recherche) et utilisé Y au lieu de X, ce qui prend un octet de moins à initialiser.
la source
Postscript 272
Non golfé:
la source
C (
224212 caractères)C'est probablement un mauvais choix de langue, mais bon. Ce n'est pas qu'un langage comme C peut faire mieux qu'un langage de programmation dynamique. Sur Clang, vous devrez spécifier une valeur pour
return
(ce n'est pas nécessaire pour gcc).la source
define q
et d'utiliser simplementprintf
?q
est utilisé 3 fois,define q
économise donc environ 2 caractères.Lua,
230228Pas le pire, pas le meilleur.
REMARQUE: tel que rapporté par @mniip
256or
peut ne pas fonctionner dans votre interprète. Plus d'infos dans les commentaires.(plus ou moins) Version lisible:
Sortie:
Edit: merci à @mniip pour l'optimisation 2 caractères:
until nil
->until _
la source
repeat until x
(x est nul car non défini) est de 2 caractères plus court, et awhile 1 do end
exactement la même longueur, à part cela quelle version lua est-ce?256or
est une syntaxe non valide dans mon interprèterepeat until x
. J'utilise le dernier binaire Windows d' ici . Comme vous pouvez le voir, vousa=a+1 elseif
avez de l'espace. C'est parce quee
c'est un chiffre hexadécimal, tandis queo
dans256or
n'est pas, donc mon interprète prendor
comme une autre instruction / block / howYouCallIt.256or
, aussi0repeat
et1then
; J'utilise lua officiel de lua.org, votre code ne compile pas en 5.1, 5.2 ou 5.3Haskell ,
186178 octetsCe doit être exécuté avec
runhaskell
(ou à l' intérieurghci
) , car ils établissent les conditionsBufferMode
àNoBuffering
par défaut qui coffres - forts beaucoup d'octets:Essayez-le en ligne!
Explication
Ceci définit un nouvel opérateur
state # source
(la déclaration de fixité nous permet de tomber entre parenthèses lorsque vous l' utilisez conjointement avec d' autres opérateurs(+)
,(-)
,(^)
,(:)
et(>>)
):-1
et256
r#_
), il en lit de nouveaux et recommence en conservant l'ancien étatPour démarrer le processus, nous initialisons l'état avec
0
et lisons une nouvelle ligne source, c'est-à-dire. commencer par une source vide:la source
Lot Windows,
204256Ignore avec succès les autres commandes. Vraiment gonflé sans avoir
or
à travailler avec ...Modifier:
la source
Script de commande Windows - 154
Abusin fonctionnalités inconnues au maximum.
la source
> <> , 258 octets
J'ai fait une autre réponse> <> car je n'ai pas pu tester les phases et il a utilisé des commandes pré-empilées plutôt que d'émuler un shell de toute façon.
Il peut certainement être joué au golf, mais je ne suis pas sûr d'avoir la bravoure de la
folienécessaire !Je l'ai testé avec l'interpréteur officiel fonctionnant sous python 3.5 sous cygwin sous windows 7 et j'ai pu reproduire le test:
Dans le cas où vous ne pouvez pas l'exécuter sur votre machine (la saisie semble difficile) ou si vous souhaitez simplement l'essayer sans aucun autre logiciel, vous pouvez utiliser la version suivante sur l' interpréteur en ligne .
Il ignore évidemment \ n et EOF car vous ne pouvez pas les entrer dans l'interpréteur en ligne, mais se comportera comme si enter avait été enfoncé après chaque commande de sortie.
la source
C (gcc) , 139 octets
Compilez avec
-Dk="_nZZiaeY"
(inclus dans le nombre d'octets). -2 octets si l'invite>>\n
est autorisée.Essayez-le en ligne!
Degolf
la source
Keg , 68B
la source
Haskell, 230
Si seulement je pouvais me débarrasser de cet
hFlush stdout
appel embêtant ! Sans cela, l'invite ne s'affiche pas tant qu'uneo
opération n'est pas effectuée. Aucun conseil?la source
hFlush
en utilisantrunhaskell
au lieu de compiler (voir ma réponse ), mais quant à cette solution, elle n'est pas valide et les erreurs sont éliminées.PHP + HTML 345
la sortie est un peu sommaire (l'historique / la session est affiché sur une zone de texte, et avec le rapport d'erreurs activé, de nombreux avertissements sont imprimés) mais tout fonctionne
la source
> <>, 239
La pile initiale est l'entrée. Vous pouvez l'essayer en ligne ici .
la source
Golf-Basic 84, 88 caractères
Invite une commande à la fois, comme dans au moins 3 autres solutions. Voici un test pour
xiskisc
:Également,
xiskso
renvoie 0, comme il se doit.la source
JavaScript (Node.js), 204 octets
Cela peut probablement être joué au golf. Node.js prouve encore une fois que c'est une étrange verbosité déguisée. Code expliqué:
la source
C #, 311 octets
serait de 283 octets si les utilisations et la déclaration de classe, etc. pouvaient être supprimées en fournissant simplement une définition de fonction
la source