3var est une variante du poisson mort qui utilise trois variables appelées A, B et R. A et B sont des accumulateurs, tandis que R est utilisé comme variable de résultat.
Dans ce défi de code-golf , vous devez faire un interprète pour une version allégée de cette langue.
Commandes requises:
i Increments A
d Decrements A
s Squares A
p Prints A
P Prints the ASCII character of A
> Sets A to R
a Increments B
k Decrements B
m Squares B
o Prints B
O Prints the ASCII character of B
< Sets B to R
+ Adds A and B, stores in R
- Subtracts B from A, stores in R
* Multiplies A and B, stores in R
/ Divides A by B, stores in R
w Prints R
@ Resets A to 0
# Resets B to 0
e Resets R to 0
Tout le reste (y compris les espaces blancs) est ignoré.
Clarifications
o
etp
devrait sortir sans rien après.- La division est une division entière.
- Les nombres supérieurs à 255 et inférieurs à 0 sont pris en charge.
- 'w' devrait sortir un espace ou une nouvelle ligne après R
- La division par 0 s'arrête sans erreur. (Pas de sortie vers STDERR)
- A, B et R sont initialement 0
Règles
- Il s'agit de code-golf, donc la réponse la plus courte l'emporte.
- En cas d'égalité, la réponse la plus ancienne l'emporte.
- Le fichier sera fourni via des arguments de ligne de commande ou STDIN.
- N'importe quelle langue est autorisée.
- L'évaluation est autorisée.
Cas de test
Hello world!
(extrait d'Esolangs)
iisssaa/>e
maa->e#
aamam->e#
dddddddddddddddddddddddddPiiiiiiiiiiiiiiiiiiiiiiiii
iiiiPiiiiiiiPPiiiP
@#e
iis
aamaaaa
*>P
@#e
iisssaa/>e
maa->e#
aamam->e#
iiiiiiiiiiiiiiiiiiiiiiP
ddddddddP
iiiP
ddddddP
ddddddddP
@#e
iiss
aa*>
iP
Sorties 20spooky22me
:
iipois+iis<-<aaaO<OkOOkkkkOP@#iippisa+<m+>PaO
Sorties 9P-1420 100 3Q-1 162 0
:
iiispsdPkokmo/w<+w#aaaommO-w@ii*wew
Classements
Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.
Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les rayant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:
# Perl, 43 + 2 (-p flag) = 45 bytes
Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=63008,OVERRIDE_USER=45220;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
la source
dddddp
résultats en -5 etiiiissp
résultats en 256 comme vous vous enr
faire? ce n'est pas inclus dans votre liste de commandes valides@#e
.Réponses:
CJam, 112
Essayez-le en ligne
Explication:
Le programme construit un tableau de morceaux de code à exécuter et exécute le morceau correspondant pour chaque caractère. Gérer la division par zéro est plus difficile, car CJam n'a pas encore d'opérateur "break". Au lieu de cela, le programme pousse π comme marqueur (car aucun nombre à virgule flottante ne peut apparaître autrement), et à la fin, il ne conserve que la sortie avant le premier π.
De plus, le programme utilise les variables T, U et V au lieu de A, B et R, car elles sont préinitialisées avec 0 dans CJam.
Les implémentations de commandes réelles (construites par le programme):
la source
JavaScript (ES7) 208
213 223 237 241 311Edit3 En se copiant, I et Dendrobium s'effondrent ensemble.
Edit2 Utilisation d'EcmaScript 7 pour économiser seulement 2 octets, gestion conjointe de A et B
Modifier Suite aux modifications des règles.
Remarque, j'ai ajouté lar
commande qui n'est pas requise dans la question, juste pour exécuter l' ancien exemple Hello worldla source
A=B=R=0,
et la mise en ces variables en utilisant les réelles 3var fonctions avant de traiter la chaîne, comme:[...'@#e'+p]
.GNU Sed (avec option eval pour évaluer l'
dc
expression), 254Deadfish correspond assez bien à un sous-ensemble de
dc
. Nous utilisons donc sed pour faire cette cartographie:la source
Javascript
ES6ES7,217215213208 octetsNon golfé
la source
A=B=R=0,
et la mise en ces variables en utilisant les réelles 3var fonctions avant de traiter la chaîne, comme:for(c of '@#e'+s)
.w
APL, 191
C'est une fonction qui prend le programme en argument, par exemple:
Il peut être utilisé comme une fonction anonyme, je viens de lui donner un nom pour plus de clarté.
Explication:
0::→
: si une erreur se produit (disons, division par zéro), arrêtez sans imprimer le message d'erreurA B R←0
: initialiser des variables{
...}¨⍵
: pour chaque commande:⍵∊G←'aikdms<>'
: Si la commande est du type var ← fn (var, x) , recherchez les fn et x appropriés , remplacez-les puis évaluez-les:⍎
: évaluer'AB'[1+2|G⍳⍵
:A
si la position de⍵
in'aikdms<>'
est paire,B
sinon.'+-*∘'[M]
: ajouter, soustraire, puissance ou rien, selonM
(défini plus loin)'←'
: attribuer'112R'[M←⌈2÷⍨G⍳⍵]
:1
(pour additionner et soustraire),2
(pour puissance), etR
(pour rien, c'est-à-dire qu'il définit simplement la variable surR
), selon, selonM
que la commande appartient à la première, deuxième, troisième ou quatrième paire.⍵∊G←'PpOo'
: sortie:⍞←
: sortie⎕UCS⍣(2|G⍳⍵)
: ASCII (enfin, Unicode) ou nombre selon que la commande était sur une position paire ou impaire dansPpOo
,⊢A B[⌈2÷⍨G⍳⍵]
:A
ouB
, selon que la commande était en première ou en seconde mi-temps.⍵∊G←'+-*/
: math:R∘←⌊A(⍎'+-×÷'[G⍳⍵])B
: définiR
sur le résultat de l'application de l'opérateur donné àA
etB
.⍵∊G←'@#e':
réinitialiser:⍎
: évaluer'ABR'[G⍳⍵]
: sélectionnez la bonne variable'∘←0
': mis à zéro⍵='w':⍞←R
: si la commande estw
, sortieR
.la source
C,
253241 octetsCe code utilise la chaîne
id@s>ak#m<e+-*/wpoPO
comme une table de commandes. La chaîne est organisée en fonction de la destination de l'expression calculée. Il se trouve que 5 commandes mettent à jour chacune des variables:id@s>
- mise à joura
ak#m<
- mise à jourb
e+-*/
- mise à jourr
wpoPO
- mettre à jour ... l'emplacement de la mémoire aprèsa
,b
etr
. J'espère que ce n'est pas trop important :)Ainsi, après avoir localisé le caractère d'entrée dans la chaîne de commandes, son index est diminué à plusieurs reprises, et selon le moment où il atteint 0, une expression est choisie.
S'il n'atteint pas 0 après 15 soustractions, c'est un
printf
avec des arguments correctement choisis.De plus, lors de la division, il évite la division par 0 en appelant
exit()
.Ce code doit être compilé sans optimisation, car il suppose que
a
,b
etr
sont situés à des adresses adjacentes sur la pile (pas dans les registres CPU).En outre, il doit être compilé en mode 32 bits, car il convertit les pointeurs en entiers et vice versa.
la source
VBA,
484, 453380 octetsTrop longtemps pour gagner mais une façon super simple de faire les choses, rien de fantaisiste juste bon vieux
Select Case
Ajout de la division des nombres entiers et de la gestion des erreurs Div 0 A mangé beaucoup d'octets.Gestion des erreurs supprimée car il semble que la gestion des erreurs normale entraîne les mêmes fonctionnalités. Correction de la division Int pour qu'elle fonctionne comme prévu. Était également plus court.
la source
DefInt A-Z
, en omettant ainsi la nécessité de déclarer explicitementA
,B
etR
queInteger
:DefInt A-Z:Dim A, B, R
. Il pourrait aussi bien fonctionner juste les céder, sans déclaration:A=0:B=0:R=0
. Les calculs devraient également fonctionner sur les variantes.DefInt
j'ai oublié pas quelque chose que j'utilise tous les jours mais qui va être très utile pour jouer au golf VBA à l'avenir. Malheureusement, celaA=0
fera juste agir comme un double de mes tests. Là pour faireiiiaa/w
produire un résultat décimal plutôt qu'un tout.PHP, 310 octets
Première fois de ma vie avec
:eval
Prend la première entrée de ligne de commande:
Sortie des exemples:
la source
C, 357
Macros FTW!
(Qui je plaisante - c ne gagnera jamais celui-ci)
la source
JavaScript (ES6),
293262 octetsUsage
Explication
Il y a quelques détails sur la langue dont je ne suis pas sûr (tailles entières, gestion des caractères non reconnus, etc.) mais cette solution semble fonctionner suffisamment et ignore les espaces blancs comme les nouvelles lignes dans le cas de test.
la source
:$=>
par$
, puis en ajoutant un remplacement pour la chaîne.Simplex v.0.8 , 211 octets
(Codé UTF-8.)
Explication
Comme il s'agit du programme simplex le plus long que j'ai écrit jusqu'à présent, je vais généralement expliquer comment cela fonctionne en puces.
h@u]
- définit la macro 0. Cette macro écrit simplement dans le registre et ne renvoie rien à lambda.u2
- va à la bande ci-dessus et met l'octet actuel à 2; cela définit l'arité des lambdas à définir.ƒ
- commencer l'expression lambda; une fois complété par]
, poussera la fonction lambda vers la pile lambda. Il agit en prenant des cellules (arity) du pointeur dans sa bande locale et, une fois terminé, définira sa bande locale sur les cellules prises, sauf si l'octet en cours n'est pas écrit. Le pointeur n'est pas affecté. La macro 0 permet à une fonction de revenir sans rien modifier dans la bande.§
- se déplace vers la première cellule écrite dans la bande actuelle, c'est-à-direA
.ð
- passe à la dernière cellule écrite dans la bande couranteB
.{"idspP>akmoO<+-*/w@#e"RlyG^u·u†vøÏ}
{...Ï}
répéter jusqu'à ce que la pile d'entrée soit vide"idspP>akmoO<+-*/w@#e"
- les commandesRly
- mettre la bande en tupleG^u
- l'indice de l'entrée dans le tuple·
- charger l'octet en cours th dans l'évaluateur lambdauRL
- va à la bande holdingA
etB
(écritA
etB
si elles n'existent pas)†
- exécute lambda (c'est l'évaluateur lambda)vø
- réinitialise sous la bandeouf je suis impressionné. C'est long pour Simplex, mais court pour tout le reste.
;)
la source
Minkolang 0,11 , 222 octets
Je suis sûr que cela peut être joué plus loin, mais c'était amusant. Aussi, premier interprète Minkolang d'une autre langue!
Essayez-le ici.
Explication
Le reste des lignes est assez simple, peut-être à l'exception de celles avec
1$((dl%"0"+$rl:d)$Ok
, qui est un idiome qui imprime un nombre sans espace de fin. (Je n'ai pas encore implémenté la fonctionnalité de conversion de ce nombre en chaîne, ce qui sera le cas1Z
.) Oh, oui, ils ont tous unv
au début, ce qui le ramène au début.la source
GNU Sed (avec option eval pour évaluer l'expression cc), 289
Inspiré par Digital Trauma qui n'a malheureusement pas réalisé que a) les caractères illégaux doivent être ignorés, b) dc a besoin de tout le programme converti en un seul argument et c) la division par 0 doit terminer le programme sans erreur.
Si toutes ces règles ne s'appliquaient pas, ma solution ne compterait que 235 octets;)
la source
AWK,
311309Les parenthèses TIL n'étaient pas nécessaires autour de printf. 2 octets enregistrés!
Version non golfée pour une lecture plus facile:
la source
Python 2, 272
la source
print
déclarations incluent une nouvelle ligne de fin.Rubis, 199 octets
5 octets peuvent être enregistrés en supprimant
.read
de la deuxième ligne si vous pouvez tolérer qu'un avertissement soit imprimé sur stderr sur une version plus récente de Ruby.la source
Python, 244
Un peu tard mais je voulais essayer.
la source
Prolog, 759 octets
Pas le programme le plus court, mais au moins il est structuré et lisible.
Exemple d'entrée
Essayez-le en ligne ici
la source