Reto
Dada una cadena como entrada, baje el programa Fourier que genera esa cadena.
En Fourier no hay una manera fácil de generar una cadena: debe pasar por cada código de carácter y generarlo como un carácter.
Fourier
El lenguaje se basa en un acumulador, una variable global que se inicializa a 0 al inicio del programa. Esto es utilizado por casi todos los operadores en el idioma. Solo algunos no cambian el valor del acumulador.
Personaje fuera
a
Toma el valor del acumulador como el código ASCII y genera el carácter. No cambia el valor del acumulador.
Si el acumulador es mayor que 255, el programa devolverá un error. Del mismo modo, si el acumulador es menor que 0.
Número fuera
o
Emite el valor del acumulador. No cambia el valor del acumulador.
Incrementar
^
Aumentar el acumulador en uno.
Disminución
v
Disminuya el acumulador en uno.
Añadir
+x
Establece el acumulador en el valor del acumulador más el valor de x.
Sustraer
-x
Establece el acumulador en el valor del acumulador menos el valor de x.
Multiplicar
*x
Establece el acumulador en el valor del acumulador multiplicado por el valor de x.
Dividir
/x
Establece el acumulador en el valor del acumulador dividido por el valor de x. (Tenga en cuenta que esta es una división entera, por lo que 1/6
resulta en 0
)
Número
n
Establezca el acumulador en el entero n.
Nota
Aquí, x
y n
puede ser cualquier número entero desde 0
hasta 2^32-1
inclusivo.
Más información
Solo debe usar los operadores descritos anteriormente. Por lo tanto, su programa de Fourier generado no es válido si utiliza cualquiera de los siguientes (tenga en cuenta que los siguientes operadores están autorizados para la recompensa):
- Repetir bucles
- Si las declaraciones
- Variables
- Aleatorio
- Módulo
- Entrada del usuario
- Mayor / menor que los operadores
- Operadores de igualdad
- Pantalla clara
- Tiempo de retardo
- Funciones de fecha
Su programa puede ser un programa completo o una función, tomando entrada a través de STDIN, un archivo o argumentos de función. También puede recibir información directamente de Internet.
Tenga en cuenta que si hay un vv
código en su código, debe reemplazarlo por -2
. Lo mismo ocurre ^^
, reemplazándolo con +2
.
Ejemplos
Si la entrada es 7n
, entonces el programa esperado es:
55a110a
Pero puedes guardar un byte con
55a*2a
Otra forma es
7o110a
Usando número fuera.
Del mismo modo, si la entrada es Hello
, entonces el programa esperado es:
72a101a108a108a111a
Puede reducirlo en 3 bytes (porque la salida no cambia el acumulador):
72a101a108aa111a
Pero espera, podemos usar el operador de suma, ahorrando 2 bytes:
72a101a+7aa+3a
Formateo
Como usaré la tabla de clasificación de Stack Snippet de Martin Büttner, por favor, ¿podría formatear el título de esta manera?
# <Language name>, <length of total output> bytes
Luego, puede poner lo que desee debajo del título.
Victorioso
Debe publicar la longitud de los programas de Fourier (producidos por su código) para generar este archivo de texto y este archivo de texto . Su puntaje es la longitud combinada de ambos programas de Fourier en bytes (los caracteres no ASCII no se usan en Fourier, por lo que realmente no hace la diferencia).
La persona con los puntajes más bajos gana. Si hay un empate, gana el programa más corto en bytes.
Generosidad
Esta recompensa de 500 repeticiones es para una nueva respuesta que juega golf con cualquiera de las funciones de Fourier. Eso incluye variables, bucles y sentencias if, etc. Esta nueva respuesta no será aceptada.
Tabla de clasificación
Consulte la sección de formato anterior:
var QUESTION_ID=55384;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 getAnswers(){jQuery.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),e.has_more?getAnswers():process()}})}function shouldHaveHeading(e){var a=!1,r=e.body_markdown.split("\n");try{a|=/^#/.test(e.body_markdown),a|=["-","="].indexOf(r[1][0])>-1,a&=LANGUAGE_REG.test(e.body_markdown)}catch(n){}return a}function shouldHaveScore(e){var a=!1;try{a|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(r){}return a}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading),answers.sort(function(e,a){var r=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0],n=+(a.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0];return r-n});var e={},a=1,r=null,n=1;answers.forEach(function(s){var t=s.body_markdown.split("\n")[0],o=jQuery("#answer-template").html(),l=(t.match(NUMBER_REG)[0],(t.match(SIZE_REG)||[0])[0]),c=t.match(LANGUAGE_REG)[1],i=getAuthorName(s);l!=r&&(n=a),r=l,++a,o=o.replace("{{PLACE}}",n+".").replace("{{NAME}}",i).replace("{{LANGUAGE}}",c).replace("{{SIZE}}",l).replace("{{LINK}}",s.share_link),o=jQuery(o),jQuery("#answers").append(o),e[c]=e[c]||{lang:c,user:i,size:l,link:s.share_link}});var s=[];for(var t in e)e.hasOwnProperty(t)&&s.push(e[t]);s.sort(function(e,a){return e.lang>a.lang?1:e.lang<a.lang?-1:0});for(var o=0;o<s.length;++o){var l=jQuery("#language-template").html(),t=s[o];l=l.replace("{{LANGUAGE}}",t.lang).replace("{{NAME}}",t.user).replace("{{SIZE}}",t.size).replace("{{LINK}}",t.link),l=jQuery(l),jQuery("#languages").append(l)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/,NUMBER_REG=/\d+/,LANGUAGE_REG=/^#*\s*([^,]+)/;
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> <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>
fuente
Respuestas:
Python, 14307118 bytes
601216 para Hamlet + 13705902 para Génesis = 14307118
Definitivamente, hay algunos senarios bajo los cuales esta solución no es óptima, como por ejemplo
1111
, donde se generará1111o
en lugar de11oo
. Sin embargo, creo que es casi óptimo.Editar: guardado algunos bytes mejorando
0o0o
a0oo
.El nombre del archivo que contiene la entrada se recibe en STDIN y se envía a STDOUT.
Resultados verificados con el intérprete oficial.
fuente
> <>, 14310665 bytes
601398 para aldea + 13709267 para génesis
Esto todavía es un trabajo en progreso y lleva mucho tiempo completarlo.
fuente
Java, 14307140 bytes
Hamlet - 601,218
Génesis - 13,705,922
La idea aquí es hacer todo el trabajo por adelantado, haciendo un mapa de caracteres-> caracteres. Luego puedes recorrer y tomar las cuerdas más cortas.
Se debe hacer una pequeña excepción para los números, así que los reviso en el bucle principal. Sin embargo, sigue siendo rápido y maneja el caso de prueba más grande en unos segundos. Es posible que pueda modificar esta sección por un par de bytes más, pero estoy bastante seguro de que está cerca de lo óptimo.
La entrada es un nombre de archivo como argumento. La salida se escribe en un archivo
inputFilename_out.4
y el recuento de caracteres se envía a STDOUT.Esto es 1737 bytes para el desempate, completamente sin golf. Puedo jugar mucho golf si es necesario, pero seguirá siendo un poco grande.
fuente
01
, creo que sale01o
, lo cual no es correcto.else
cláusula del bucle principal, usted elige entre usar el valor real del acumulador y el valor del carácter del carácter anterior. No puede hacer la última elección si las dos son diferentes, porque eso significa que utilizóo
el tiempo anterior, y el acumulador no contiene el valor del personaje anterior.PHP, 14307118 bytes
601,216 (Hamlet) + 13,705,902 (Biblia)
Salida de Fourier para Hamlet
Funciona de la siguiente manera:
fuente