Je définis les opérateurs suivants:
Manhattan Addition a + M b, pour les nombres à un chiffre, est le résultat de la concaténation de b sur a. Donc, a + M b = 10a + b. Par conséquent, l'opérateur général + M est défini comme suit:
a + M b = 10a + b
Manhattan La soustraction a - M b, pour les nombres à un chiffre, est le résultat de la suppression du dernier b de a. Par conséquent, l'opérateur - M est défini comme ainsi dans le pseudocode:
a - M b = a supprimer le dernier b
Manhattan Multiplication a × M b est le résultat du remplacement de toutes les instances de b dans a par b instances de b. Ergo, × M est défini dans le pseudocode comme:
a × M b = a -> s / b / <b copies de b> / g
La division Manhattan a ÷ M b est définie en termes de × M :
1 ÷ M b = le premier caractère de b
a ÷ M b = a × M (1 ÷ M b)
Avec tout cela à l'esprit, créez un interpréteur qui évaluera les expressions infixes qui utilisent les opérateurs suivants (c'est-à-dire a + b
, pas a b +
ou + a b
)
+ Addition
- Subtraction
/ Division
* Multiplication
*M Manhattan Multiplication
/M Manhattan Division
+M Manhattan Addition
-M Manhattan Subtraction
Chaque opérateur de Manhattan a une priorité d'ordre supérieur à son homologue normal.
Cas de test:
> 5 +M 10 + 3
63 // 5*10 + 10 + 3 => 60 + 3
> 10 *M 2
10 // no 2s in 10
> 10 *M 1
10 // one 1 in 10 replaced once
> 23 *M 3
2333 // 23 has one 3, which is replaced with three 3s
> 23 *M 2
223 // 23 has one 2, which is replaced with two 2s
> 232 *M 2
22322 // 232 has two 2s, which are replaced with two 2s
> 232 *M 23
23...(23 times)...232 // ...
> 123 *M 2 * 3
3669 // 1223 * 3 => 3669
> 5 + 3 +M 2
37 // 5 + (3 +M 2) => 5 + 32 => 37
> 150 /M 3
150 // 150 ÷M 3 => 150 ×M 3 => 150
> 150 /M 53
1555550 // 150 ÷M 53 => 150 ×M 5 => 1555550
> 50 -M 0
5
> 500 -M 0
50
> 5234 -M 5
234
> 12 +M 633 *M 3
6333453 // = 12 +M 6333333 = 120 + 6333333 = 6333453
Il s'agit d'un code-golf , donc le programme le plus court en octets l'emporte.
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 s'affiche, veuillez commencer votre réponse avec un titre, en utilisant le modèle de démarque 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 barrant. 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=59299,OVERRIDE_USER=8478;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.1.1/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>
×
et÷
au lieu de ASCII*
et/
?232 ×M 23
égal23232
? Cela ne devrait-il pas être égal à 23 exemplaires23
suivis d'un2
?Réponses:
Dyalog APL ,
10481799375 octetsModifier: gère désormais
4342343 -M 34
→43423
correctement.Contexte
Cela étend APL pour inclure l'opérateur de Manhattan. Un opérateur dans la terminologie APL est un modificateur de fonctions (par exemple
÷
). Un exemple d'opérateur est celui⍨
qui modifie les fonctions pour permuter ainsi leurs arguments3 = 2 ÷⍨ 6
. De même,M
modifie les fonctions arithmétiques de base pour être leurs parents à Manhattan. Notez que puisque la langue résultante est une extension d'APL, la stricte priorité de droite à gauche d'APL demeure.Explication
La structure globale est
M←{⍎(5|⌊⍺⍺2)⊃
…}
qui applique la fonction (+
ou-
ou×
ou÷
) à 2 et utilise le résultat pour choisir la chaîne à évaluer. Les chaînes sont les suivantes:3 pour -M:
(('(.*)',b←⍕⍵)⎕R'\1'⊢a←⍕⍺)
regex supprime la dernière occurrence de b (répétition de chaîne d'argument de droite) dans a (répétition de chaîne d'argument de gauche)
2 pour + M:
'10⊥⍺⍵'
évaluer les arguments en chiffres de base 10
1 pour × M:
(b⎕R(⍵⍴'&')⊢a)
remplacer les occurrences de b par b esperluettes (c.-à-d. Regex pour
0 pour ÷ M: le
'⍺×M⍣(⍺≠1)⍎⊃b'
⍎⊃b
premier chiffre de b⍺×M⍣(⍺≠1)
s'applique ⍺ × M si ⍺ ≠ 1⊃
parmi les quatre chaînes ci-dessus, choisissez le numéro:(5|⌊⍺⍺2)
mod-5 du plancher de la fonction appliquée à 2, à savoir:3 =
5 | ⌊-2
2 =
5 | ⌊+2
1 =
5 | ⌊×2
parce que × 2 ⇔ sgn (2) ⇔ 10 =
5 | ⌊÷2
parce que ÷ 2 ⇔ 1 ÷ 2 ⇔ 0,5Un grand merci à mon cher ami ngn pour les copeaux incroyables.
la source
Perl,
1009998 octetsCode 97 octets + ligne de commande 1 octet
Exemple d'utilisation:
la source
*M
pourxM
et/M
pour<div>M
.Python, 644 octets
Accepte les entrées sur STDIN (entourées de guillemets). Utilise l'expression régulière pour faire correspondre et analyser les opérations. Tout le travail est effectué sur des chaînes, et la conversion vers et depuis les entiers n'est utilisée que lors des opérations mathématiques normales.
Je suis sûr que cela pourrait être approfondi, donc je vais y travailler au cours des prochains jours.
la source
c
ouf
.