Faites un interprète 3var!


24

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 , 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

  • oet pdevrait 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 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

Nest 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>


1
@ Sp3000 En parlant de cela, j'ai récemment aidé à corriger un bogue de boucle imbriquée dans l'interpréteur.
LegionMammal978

2
Clarifications supplémentaires pour les personnes familières avec Deadfish: dddddprésultats en -5 et iiiissprésultats en 256 comme vous vous en
doutez

1
Dans le cas de test Quelle dose rfaire? ce n'est pas inclus dans votre liste de commandes valides
JimmyJazzx

1
@JimmyJazzx Le testcase est maintenant édité, mais dans la langue 3var complète, r réinitialise tout. C'est la même chose que @#e.
DJgamer98

1
A, B et R sont-ils initialisés à 0 lorsque l'interpréteur démarre?
Tony Ennis

Réponses:


7

CJam, 112

q{"+-*/dspP>@ikmoO<#awe"_@#\4<"X2 U|{TU :V;}P?"S/f*'T"( _*T cT;V;0)"2/f+":T;"f+_'Tf/'Uf*+"VS 0:V; "S/++=~}%Pa/0=

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.

q            read the input
{…}%         transform each character
  "…"        push a string with all the 3var commands, in a convenient order
  _@         duplicate the string and bring the current character to the top
  #          find the index of the character in the string (or -1 if not found)
  \          swap with the other string copy
  4<         keep only the first 4 characters ("+-*/")
  "…"        push a string that will be used for implementing those operators
  S/         split by space into ["X2" "U|{TU" ":V;}P?"]
  f*         join with each of '+', '-', '*', '/' -> 4 strings
  'T         push the 'T' character
  "…"        push a string with implementations of commands involving A
  2/         split into pieces of length 2
  f+         prepend 'T' to each piece
  ":T;"f+    append ":T;"to each piece
  _          duplicate the array (containing full A-command implementations)
  'Tf/       split each piece by the 'T' character
  'Uf*       join each split piece using the 'U' character
              practically replacing 'T' with 'U'
              to obtain B-command implementations
  +          concatenate the 2 arrays
  "…"        push a string containing implementations for "w" and "e", 
              separated by space; the string also ends with a space
  S/         split by space, obtaining the implementations for "w" and "e"
              and an empty string, for handling unrecognized characters
  ++         concatenate with the A and B command and +-*/ implementations
  =          get the corresponding string implementing the current command
              if the character was not found, -1 will get the empty string (no-op)
  ~          execute it
Pa/          split the array of results by the π separator
0=           get the first piece (before the first π, if any)

Les implémentations de commandes réelles (construites par le programme):

+: X2+U|{TU+:V;}P?    if (1+2)|U != 0, set V=T+U, else push π
-: X2-U|{TU-:V;}P?    if (1-2)|U != 0, set V=T-U, else push π
*: X2*U|{TU*:V;}P?    if (1*2)|U != 0, set V=T*U, else push π
/: X2/U|{TU/:V;}P?    if (1/2)|U != 0, set V=T/U, else push π
d: T( :T;             set T=T-1
s: T_*:T;             set T=T*T
p: TT :T;             push T and set T=T (no-op)
P: TcT:T;             push T converted to character and set T=T (no-op)
>: T;V:T;             push and pop T (no-op) and set T=V
@: T;0:T;             push and pop T (no-op) and set T=0
i: T):T;              set T=T+1
k: U( :U;             set U=U-1
m: U_*:U;             set U=U*U
o: UU :U;             push U and set U=U (no-op)
O: UcU:U;             push U converted to character and set U=U (no-op)
<: U;V:U;             push and pop U (no-op) and set U=V
#: U;0:U;             push and pop U (no-op) and set U=0
a: U):U;              set U=U+1
w: VS                 push V and a space
e: 0:V;               set V=0
(default): (empty)    no-op

10

JavaScript (ES7) 208 213 223 237 241 311

Edit3 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é la rcommande qui n'est pas requise dans la question, juste pour exécuter l' ancien exemple Hello world

V=p=>(o='',[for(c of'@#e'+p)eval('++x,--x,x*=x,x=R,x=0,o+=x,o+=String.fromCharCode(x),R=A+B,R=A-B,R=A*B,R=A/B|0,R=0,o+=R+` `'.replace(/x/g,(k='ids>@pP+-*/ewakm<#oO'.indexOf(c))<13?'A':'B').split`,`[k%13])],o)

// More readable
U=p=>(
  o='',
  [for(c of'@#e'+p)
   eval(
   '++x,--x,x*=x,x=R,x=0,o+=x,o+=String.fromCharCode(x),R=A+B,R=A-B,R=A*B,R=A/B|0,R=0,o+=R+` `'
   .replace(/x/g,(k='ids>@pP+-*/ewakm<#oO'.indexOf(c))<13?'A':'B')
   .split`,`[k%13])]
  ,o
)

// ES6, no array comprehension, 2 bytes more
W=p=>
  [...'@#e'+p].map(c=>
    eval(
    '++x,--x,x*=x,x=R,x=0,o+=x,o+=String.fromCharCode(x),R=A+B,R=A-B,R=A*B,R=A/B|0,R=0,o+=R+` `'
    .replace(/x/g,(k='ids>@pP+-*/ewakm<#oO'.indexOf(c))<13?'A':'B')
    .split`,`[k%13]),
    o=''
  )&&o

// Test
function test() 
{ 
  OUT.innerHTML = V(I.value) 
}

test()
textarea { width: 75%; height: 8em }
Test program <button onclick="test()">Run</button><br><textarea id=I>
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
</textarea><br>Output<pre id=OUT></pre>


Vous pouvez économiser 2 octets en supprimant 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].
insertusernamehere

2
@insertusernamehere thx, j'adore celui-ci
edc65

8

GNU Sed (avec option eval pour évaluer l' dcexpression), 254

Deadfish correspond assez bien à un sous-ensemble de dc. Nous utilisons donc sed pour faire cette cartographie:

s/^/@#e/
s/\+/AB+r/g
s/-/AB-r/g
s/\*/AB*r/g
s|/|AB/r|g
s/a/B1+b/g
s/i/A1+a/g
s/d/A1-a/g
s/s/Ad*a/g
s/p/An/g
s/P/AP/g
s/>/Ra/g
s/k/B1-b/g
s/m/Bd*b/g
s/o/Bn/g
s/O/BP/g
s/</Rb/g
s/w/Rn/g
s/@/0a/g
s/#/0b/g
s/e/0r/g
s/[ABR]/l&/g
s/[abr]/s\u&/g
s/.*/dc -e'&'/e

8

Javascript ES6 ES7, 217 215 213 208 octets

f=s=>(O='',[for(c of'@#e'+s)eval('v=0,++v,--v,v*=v,O+=v,O+=String.fromCharCode(v),v=R,R=0,R=A+B,R=A-B,R=A*B,R=A/B|0,O+=R+" "'.replace(/v/g,'AB'[(x='@idspP>e+-*/w#akmoO<'.indexOf(c))/13|0]).split`,`[x%13])],O)

Non golfé

f=s=>(
    O='',                                                                   // initialize output to empty string
    [for(c of'@#e'+s)eval(                                                  // initialize A, B, and R, loop over all chars in input, eval returned function string
        'v=0,++v,--v,v*=v,O+=v,O+=String.fromCharCode(v),v=R,R=0,R=A+B,R=A-B,R=A*B,R=A/B|0,O+=R+" "' // operation list
            .replace(/v/g,'AB'[(x='@idspP>e+-*/w#akmoO<'.indexOf(c))/13|0]) // replace all instances of v with either A or B
            .split`,`[x%13])],                                              // split ops list, select corresponding function string
    O)                                                                      // return output string

1
+1 Pas loin du mien, mais en mieux. Maintenant, je vais devoir essayer quelque chose de différent
edc65

1
Vous pouvez économiser 2 octets en supprimant 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).
insertusernamehere

1
@insertusernamehere Aha, c'est assez intelligent, merci!
Dendrobium

En révisant votre réponse, je vois que vous ne w
sortez

@ edc65 L'une des puces de clarification indique que "'w' devrait générer un espace ou une nouvelle ligne après R"
Dendrobium

6

APL, 191

{0::→⋄A B R←0⋄{⍵∊G←'aikdms<>':⍎'AB'[1+2|G⍳⍵],'+-*∘'[M],'←','112R'[M←⌈2÷⍨G⍳⍵]⋄⍵∊G←'PpOo':⍞←⎕UCS⍣(2|G⍳⍵)⊢A B[⌈2÷⍨G⍳⍵]⋄⍵∊G←'+-*/':R∘←⌊A(⍎'+-×÷'[G⍳⍵])B⋄⍵∊G←'@#e':⍎'ABR'[G⍳⍵],'∘←0'⋄⍵='w':⍞←R}¨⍵}

C'est une fonction qui prend le programme en argument, par exemple:

      ∆3var←{0::→⋄A B R←0⋄{⍵∊G←'aikdms<>':⍎'AB'[1+2|G⍳⍵],'+-*∘'[M],'←','112R'[M←⌈2÷⍨G⍳⍵]⋄⍵∊G←'PpOo':⍞←⎕UCS⍣(2|G⍳⍵)⊢A B[⌈2÷⍨G⍳⍵]⋄⍵∊G←'+-*/':R∘←⌊A(⍎'+-×÷'[G⍳⍵])B⋄⍵∊G←'@#e':⍎'ABR'[G⍳⍵],'∘←0'⋄⍵='w':⍞←R}¨⍵}
      ∆3var 'iipois+iis<-<aaaO<OkOOkkkkOP@#iippisa+<m+>PaO'
20spooky22me

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'erreur
  • A 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⍳⍵: Asi la position de in 'aikdms<>'est paire, Bsinon.
      • '+-*∘'[M]: ajouter, soustraire, puissance ou rien, selon M(défini plus loin)
      • '←': attribuer
      • '112R'[M←⌈2÷⍨G⍳⍵]: 1(pour additionner et soustraire), 2(pour puissance), et R(pour rien, c'est-à-dire qu'il définit simplement la variable sur R), selon, selon Mque 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 dans PpOo ,
      • ⊢A B[⌈2÷⍨G⍳⍵]: Aou B, selon que la commande était en première ou en seconde mi-temps.
    • ⍵∊G←'+-*/: math:
      • R∘←⌊A(⍎'+-×÷'[G⍳⍵])B: défini Rsur le résultat de l'application de l'opérateur donné à Aet B.
    • ⍵∊G←'@#e': réinitialiser:

      • : évaluer
      • 'ABR'[G⍳⍵]: sélectionnez la bonne variable
      • '∘←0': mis à zéro
    • ⍵='w':⍞←R: si la commande est w, sortie R.


4

C, 253 241 octets

#define _ c--?c--?c--
k="id@s>ak#m<e+-*/wpoPO",*p;main(c,a,b,r){for(a=b=r=0;~c;c=getchar())c=strchr(k,c),c&&(c-=k,p=&a+c/5,*p=_?_?_?_?_?printf(c?c<3?"%d":"%c":"%d ",c?c%2?a:b:r):a/(b?b:exit()):a*b:a-b:a+b:0:r:b*b:0:b-1:b+1:r:a*a:0:a-1:a+1);}

Ce code utilise la chaîne id@s>ak#m<e+-*/wpoPOcomme 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 à jour a
  • ak#m< - mise à jour b
  • e+-*/ - mise à jour r
  • wpoPO- mettre à jour ... l'emplacement de la mémoire après a, bet r. 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, bet rsont 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.


4

VBA, 484, 453 380 octets

Trop 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.

Function Y(x)
For Z=1 To Len(x)
w=Mid(x,Z,1)
Select Case w
Case"i":A=A+1
Case"d":A=A-1
Case"s":A=A^2
Case"p":Y=Y &A
Case"P":Y=Y &Chr(A)
Case">":A=R
Case"a":B=B+1
Case"k":B=B-1
Case"m":B=B^2
Case"o":Y=Y &B
Case"O":Y=Y &Chr(B)
Case"<":B=R
Case"+":R=A+B
Case"-":R=A-B
Case"*":R=A*B
Case"/":R=A\B
Case"w":Y=Y &R &vbCrLf
Case"@":A=0
Case"#":B=0
Case"e":R=0
End Select
Next
End Function

Merci à Henrik Ilgen pour avoir économisé 31 104 octets


2
Pas tout à fait sûr que cela fonctionne dans VBA (il le fait dans VB6), mais vous pouvez économiser beaucoup d'octets en utilisant DefInt A-Z, en omettant ainsi la nécessité de déclarer explicitement A, Bet Rque Integer: 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.
Henrik Ilgen

@HenrikIlgen merci beaucoup, DefIntj'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, cela A=0fera juste agir comme un double de mes tests. Là pour faire iiiaa/wproduire un résultat décimal plutôt qu'un tout.
JimmyJazzx

1
Essayez \ pour la division entière;)
Henrik Ilgen

1
Vous pouvez le condenser à 405 octets si vous en faites une fonction et utilisez la valeur de retour pour "construire" le résultat, en supposant que vous n'avez pas à réellement imprimer le résultat :)
Henrik Ilgen

3

PHP, 310 octets

Première fois de ma vie avec eval:

for($A=$B=$R=0;$c=$argv[1][$i++];)eval([i=>'++$A',d=>'--$A',s=>'$A*=$A',p=>'echo$A',P=>'echo chr($A)','>'=>'$A=$R',a=>'++$B',k=>'--$B',m=>'$B*=$B',o=>'echo$B',O=>'echo chr($B)','<'=>'$B=$R','+'=>'$R=$A+$B','-'=>'$R=$A-$B','*'=>'$R=$A*$B','/'=>'$R=$A/$B',w=>'echo$R','@'=>'$A=0','#'=>'$B=0',e=>'$R=0'][$c].';');

Prend la première entrée de ligne de commande:

php 3var.php "iipois+iis<-<aaaO<OkOOkkkkOP@#iippisa+<m+>PaO"

Sortie des exemples:

Bonjour le monde!
20spooky22me


3

C, 357

Macros FTW!

(Qui je plaisante - c ne gagnera jamais celui-ci)

#define X(p,e) case p:e;break;
#define Y(p,a,b,c,d,e,f) X(a,p++)X(b,p--)X(c,p*=p)X(d,printf("%d",p))X(e,printf("%c",p%256))X(f,p=R)
A,B,R;main(int C,char**V){for(;*V[1];)switch(*V[1]++){Y(A,'i','d','s','p','P','>')Y(B,'a','k','m','o','O','<')X('+',R=A+B)X('-',R=A-B)X('*',R=A*B)X('/',R=A/(B?B:exit(0),1))X('w',printf("%d",R))X('@',A=0)X('#',B=0)X('e',R=0)}}

2

JavaScript (ES6), 293 262 octets

f=x=>(o="",a=b=r=0,p=String.fromCharCode,[...x].map(c=>{if(eval(`m={i_a++,d_a--,s_a*=a,p_o+=a,P_o+=p(a),">"_a=r,a_b++,k_b--,m_b*=b,o_o+=b,O_o+=p(b),"<"_b=r,"+"_r=a+b,"-"_r=a-b,"*"_r=a*b,"/"_r=a/b|0,w_o+=r,"@"_a=0,"#"_b=0,e_r=0}[c]`.replace(/_/g,":_=>")))m()}),o)

Usage

f(`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`)

=> "Hello world!"

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.

f=x=>(
  o="",                           // o = output string
  a=b=r=0,
  p=String.fromCharCode,
  [...x].map(c=>{                 // iterate through each character
    if(                           // if used for NOP characters (whitespace)

      // Functions:
      eval(`m={
        i_a++,
        d_a--,
        s_a*=a,
        p_o+=a,
        P_o+=p(a),
        ">"_a=r,
        a_b++,
        k_b--,
        m_b*=b,
        o_o+=b,
        O_o+=p(b),
        "<"_b=r,
        "+"_r=a+b,
        "-"_r=a-b,
        "*"_r=a*b,
        "/"_r=a/b|0,
        w_o+=r,
        "@"_a=0,
        "#"_b=0,
        e_r=0
      }[c]`.replace(/_/g,":_=>")) // dynamically add common characters

    )m()                          // execute the function
  }),
  o                               // return the output string
)

1
Je pense que vous pourriez économiser quelques octets en enfermant le dictionnaire dans un eval tout en remplaçant tous :$=>par $, puis en ajoutant un remplacement pour la chaîne.
Conor O'Brien

2

Simplex v.0.8 , 211 octets

(Codé UTF-8.)

h@u]u2ƒ§I]ƒ§M]ƒ§^O]ƒ§o]ƒ§s]ƒ§@]ƒ§Ah]ƒ§Sh]ƒ§Mh]ƒ§Vh]ƒ§&oh]ƒðI]ƒðM]ƒð^O]ƒðo]ƒðs]ƒð@]ƒðAh]ƒðSh]ƒðMh]ƒðVh]ƒð&oh]ƒ§z]ƒðz]ƒuz@]{"idspP>akmoO<+-*/w@#e"RlyG^u·u†vøÏ}

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-à-dire A .
  • ð - passe à la dernière cellule écrite dans la bande courante B .
  • {"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 commandes
    • Rly - mettre la bande en tuple
    • G^u - l'indice de l'entrée dans le tuple
    • ·- charger l'octet en cours th dans l'évaluateur lambda
    • uRL- va à la bande holding Aet B(écrit Aet Bsi elles n'existent pas)
    • - exécute lambda (c'est l'évaluateur lambda)
    • - réinitialise sous la bande

ouf je suis impressionné. C'est long pour Simplex, mais court pour tout le reste.;)


2

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!

>I3&000V$Vod?.45*[di1q=5&]x00wx1i2+kw
idspP>akmoO<+-*/w@#e
vr1+r
vr1-r
vr2;r
v0c1$((dl%"0"+$rl:d)$Ok
v0cO
vrx0cr
v1g1+1G
v1g1-1G
v1g2;1G
v1c1$((dl%"0"+$rl:d)$Ok
v1cO
v1gxd1G
vx$d+
vx$d-
vx$d*
vx$dd?.:
vdN
vrx0r
v1gx01G
vx0

Essayez-le ici.

Explication

>I3&000                    Initializes A, B, and R if they don't already exist.
V$V                        An idiom that ensures no time-travel.
od?.                       Reads in a character and halts if input is empty.
45*[di1q=5&]               Looks through the second row for a matching character.
            x00w           Jumps back to beginning if no match.
                x1i2+kw    Jumps to corresponding line upon match.

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 cas 1Z.) Oh, oui, ils ont tous un vau début, ce qui le ramène au début.


2

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

H
$!d
x
s/^/@#e/
s:[^-a><de/+i*k@w#opsmOP]::g
s:[e@#]:0&:g
s:[-*+/pPid]:Q&:g
s:[-kaoO*+/]:H&:g
s:[><w]:Z&:g
s:[diak]:1&:g
s:s:Q2^>:g
s:m:H2^<:g
s:[-+*/]:&e:g
s:[ia]:+&:g
s:[dk]:-&:g
y:Oop:Pnn:
s:w:n32P:g
s:[id>@]:sq:g
s:e:sz:g
s:[#<ka]:sh:g
s:[QHZ]:l\l&:g
s:/:d0=t/:g
s/.*/dc -e'[q]st&'/e

2

AWK, 311 309

func p(z,f,x){if(c~z)printf"%"f,x}BEGIN{FS=z}{for(i=0;++i<=NF;){c=$i;A=c~/i/?A+1:c~/d/?A-1:c~/s/?A*A:c~/@/?0:c~/>/?R:A;p("p","d",A);p("P","c",A);B=c~/a/?B+1:c~/k/?B-1:c~/m/?B*B:c~/#/?0:c~/</?R:B;p("o","d",B);p("O","c",B);R=c~/+/?A+B:c~/-/?A-B:c~/*/?A*B:c~/e/?0:R;if(c~"/")if(B)R=A/B;else exit;p("w","d ",R)}}

Les parenthèses TIL n'étaient pas nécessaires autour de printf. 2 octets enregistrés!

Version non golfée pour une lecture plus facile:

func p(z,f,x) {
    if(c~z) printf "%"f,x
}

BEGIN {
    FS=z
}

{
    for(i=0;++i<=NF;){
        c=$i;
        A=c~/i/?A+1:c~/d/?A-1:c~/s/?A*A:c~/@/?0:c~/>/?R:A;
        p("p","d",A);
        p("P","c",A);
        B=c~/a/?B+1:c~/k/?B-1:c~/m/?B*B:c~/#/?0:c~/</?R:B;
        p("o","d",B);
        p("O","c",B);
        R=c~/+/?A+B:c~/-/?A-B:c~/*/?A*B:c~/e/?0:R;
        if(c~"/")if(B)R=A/B;else exit;
        p("w","d ",R)
    }
}

1

Python 2, 272

import sys;a,b,r=0,0,0;exec';'.join(filter(None,map(dict(x.split(':')for x in"a:b+=1|@:a=0|#:b=0|/:r=a/b|d:a-=1|PXchr(a)|i:a+=1|-:r=a-b|k:b-=1|*:r=a*b|m:b*=b|oXb|pXa|s:a*=a|OXchr(b)|wXr|+:r=a+b|e:r=0|<:b=r|>:a=r".replace('X',':print ').split('|')).get,sys.stdin.read())))

Ça ne marche pas. Vos printdéclarations incluent une nouvelle ligne de fin.
Griffin

1

Rubis, 199 octets

a=b=r=0
$<.read.chars{|c|eval %w{a+=1
a-=1
a*=a
$><<a
$><<a.chr
a=r
b+=1
b-=1
b*=b
$><<b
$><<b.chr
b=r
r=a+b
r=a-b
r=a*b
b==0&&exit||r=a/b
puts\ r
a=0
b=0
r=0
p}["idspP>akmoO<+-*/w@#e".index(c)||-1]}

5 octets peuvent être enregistrés en supprimant .readde la deuxième ligne si vous pouvez tolérer qu'un avertissement soit imprimé sur stderr sur une version plus récente de Ruby.


1

Python, 244

import sys;P=sys.stdout.write;A=B=R=0;exec';'.join(filter(None,map(dict(zip('idspP>akmoO<+-*/w@#e','A+=1 A-=1 A**=2 P(`A`) P(chr(A)) A=R B+=1 B-=1 B**=2 P(`B`) P(chr(B)) B=R R=A+B R=A-B R=A*B R=A/B print(R) A=0 B=0 R=0'.split())).get,input())))

Un peu tard mais je voulais essayer.


1

Prolog, 759 octets

Pas le programme le plus court, mais au moins il est structuré et lisible.

q(A,B,R,i,X,B,R):-X is A+1.
q(A,B,R,d,X,B,R):-X is A-1.
q(A,B,R,s,X,B,R):-X is A*A.
q(_,B,R,>,R,B,R).
q(A,B,R,a,A,X,R):-X is B+1.
q(A,B,R,k,A,X,R):-X is B-1.
q(A,B,R,m,A,X,R):-X is B*B.
q(A,_,R,<,A,R,R).
q(A,B,_,+,A,B,X):-X is A+B.
q(A,B,_,-,A,B,X):-X is A-B.
q(A,B,_,*,A,B,X):-X is A*B.
q(_,0,_,/,_,_,_):-!,1=2.
q(A,B,_,/,A,B,X):-B>0,X is A/B.
q(_,B,R,@,0,B,R).
q(A,_,R,#,A,0,R).
q(A,B,_,e,A,B,0).
q(A,B,R,p,A,B,R):-write(A).
q(A,B,R,'P',A,B,R):-A>0,format('~c',A).
q(A,B,R,'P',A,B,R):-write(A).
q(A,B,R,o,A,B,R):-write(B).
q(A,B,R,'O',A,B,R):-format('~c',B).
q(A,B,R,'O',A,B,R):-write(B).
q(A,B,R,w,A,B,R):-write(R),nl.
q(A,B,R,_,A,B,R).
f([],_,_,_).
f([H|T],A,B,R):-q(A,B,R,H,X,Y,Z),f(T,X,Y,Z),!.
p(X):-atom_chars(X,Y),f(Y,0,0,0).

Exemple d'entrée

p('iipois+iis<-<aaaO<OkOOkkkkOP@#iippisa+<m+>PaO').

Essayez-le en ligne ici

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.