Defino los siguientes operadores:
La adición de Manhattan a + M b, para números de un solo dígito, es el resultado de concatenar b sobre a. Entonces, a + M b = 10a + b. Por lo tanto, el operador general + M se define así:
a + M b = 10a + b
Resta de Manhattan a - M b, para números de un solo dígito, es el resultado de eliminar la última b de a. Por lo tanto, el operador - M se define así en pseudocódigo:
a - M b = a eliminar el último b
Manhattan Multiplication a × M b es el resultado de reemplazar todas las instancias de b en a por b instancias de b. Ergo, × M se define en pseudocódigo como:
a × M b = a -> s / b / <b copias de b> / g
Manhattan Division a ÷ M b se define en términos de × M :
1 ÷ M b = el primer carácter de b
a ÷ M b = a × M (1 ÷ M b)
Con todo esto en mente, cree un intérprete que evaluará las expresiones infija que utilizan los siguientes operadores (es decir a + b
, no a b +
o + a b
)
+ Addition
- Subtraction
/ Division
* Multiplication
*M Manhattan Multiplication
/M Manhattan Division
+M Manhattan Addition
-M Manhattan Subtraction
Cada operador de Manhattan tiene una precedencia de orden más alta que su contraparte normal.
Casos de prueba:
> 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
Este es un código de golf , por lo que gana el programa más corto en bytes.
Tablas de clasificación
Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
# Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:
# [><>](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>
×
y en÷
lugar de ASCII*
y/
?232 ×M 23
igual23232
? ¿No debería ser igual a 23 copias23
seguidas de a2
?Respuestas:
Dyalog APL ,
10481799375 bytesEditar: ahora maneja
4342343 -M 34
→43423
correctamente.Antecedentes
Esto extiende APL para incluir al operador de Manhattan. Un operador en terminología APL es un modificador de funciones (por ejemplo
÷
). Un ejemplo de un operador es el⍨
que modifica funciones para intercambiar sus argumentos3 = 2 ÷⍨ 6
. Así también,M
modifica las funciones aritméticas básicas para ser sus parientes de Manhattan. Tenga en cuenta que, dado que el lenguaje resultante es una extensión de APL, la estricta precedencia de derecha a izquierda de APL permanece.Explicación
La estructura general es
M←{⍎(5|⌊⍺⍺2)⊃
...}
que se aplica la función (+
o-
o×
o÷
) a 2 y utiliza el resultado de elegir qué cadena va a evaluar. Las cadenas son:3 para -M:
(('(.*)',b←⍕⍵)⎕R'\1'⊢a←⍕⍺)
regex elimina la última aparición de b (rep. De cadena del argumento derecho) en a (rep. De cadena del argumento izquierdo).
2 para + M:
'10⊥⍺⍵'
evalúa los argumentos como dígitos de base 10
1 para × M:
(b⎕R(⍵⍴'&')⊢a)
reemplace las ocurrencias de b con ampersands b (es decir, regex para el
0 para ÷ M:
'⍺×M⍣(⍺≠1)⍎⊃b'
⍎⊃b
primer dígito de b se⍺×M⍣(⍺≠1)
aplica ⍺ × M si ⍺ ≠ 1⊃
de las cuatro cadenas anteriores, elija el número:(5|⌊⍺⍺2)
mod-5 del piso de la función aplicada a 2, a saber:3 =
5 | ⌊-2
2 =
5 | ⌊+2
1 =
5 | ⌊×2
porque × 2 ⇔ sgn (2) ⇔ 10 =
5 | ⌊÷2
porque ÷ 2 ⇔ 1 ÷ 2 ⇔ 0.5Muchas gracias a mi querido amigo ngn por sus increíbles virutas.
fuente
Perl,
1009998 bytesCódigo de 97 bytes + línea de comando de 1 byte
Ejemplo de uso:
fuente
*M
paraxM
y/M
para<div>M
.Python, 644 bytes
Acepta entradas en STDIN (entre comillas). Utiliza expresiones regulares para comparar y analizar operaciones. Todo el trabajo se realiza en cadenas, y la conversión de entradas y salidas solo se usa cuando se realizan operaciones matemáticas normales.
Estoy bastante seguro de que esto podría jugar más, así que estaré trabajando en eso en los próximos días.
fuente
c
of
.