Desafio
Dada uma string como entrada, jogue golfe no programa Fourier que produz essa string.
No Fourier, não há uma maneira fácil de gerar uma string: você precisa passar por cada código de caractere e emiti-lo como caractere.
Fourier
O idioma é baseado em um acumulador, uma variável global que é inicializada como 0 no início do programa. Isso é usado por quase todos os operadores no idioma. Apenas alguns não alteram o valor do acumulador.
Personagem fora
a
Pega o valor do acumulador como o código ASCII e gera o caractere. Não altera o valor do acumulador.
Se o acumulador for maior que 255, o programa retornará um erro. Da mesma forma, se o acumulador for menor que 0.
Número fora
o
Emite o valor do acumulador. Não altera o valor do acumulador.
Aumentar
^
Aumente o acumulador em um.
Diminuir
v
Diminua o acumulador em um.
Adicionar
+x
Define o acumulador para o valor do acumulador mais o valor de x.
Subtrair
-x
Define o acumulador para o valor do acumulador menos o valor de x.
Multiplicar
*x
Define o acumulador como o valor do acumulador multiplicado pelo valor de x.
Dividir
/x
Define o acumulador com o valor do acumulador dividido pelo valor de x. (Observe que essa é a divisão inteira, portanto, 1/6
resulta em 0
)
Número
n
Defina o acumulador para o número inteiro n.
Nota
Aqui, x
e n
pode ser qualquer número inteiro de 0
até 2^32-1
inclusivo.
Mais Informações
Você deve usar apenas os operadores descritos acima. Portanto, seu programa Fourier emitido é inválido se usar qualquer um dos seguintes itens (observe que os seguintes operadores são permitidos para a recompensa):
- Repetir loops
- Se as declarações
- Variáveis
- Aleatória
- Módulo
- Entrada do Usuário
- Maior / menor que operadores
- Operadores de igualdade
- Limpar tela
- Atraso de tempo
- Funções de data
Seu programa pode ser um programa completo ou uma função, recebendo entrada via STDIN, um arquivo ou argumentos de função. Você também pode receber informações diretamente da Internet.
Observe que, se houver um vv
no seu código, você deve substituí-lo por -2
. O mesmo vale para ^^
substituí-lo por +2
.
Exemplos
Se a entrada for 7n
, o programa esperado é:
55a110a
Mas você pode salvar um byte com
55a*2a
Outra maneira é
7o110a
Usando número para fora.
Da mesma forma, se a entrada for Hello
, o programa esperado é:
72a101a108a108a111a
Você pode reduzir em 3 bytes (porque a saída não altera o acumulador):
72a101a108aa111a
Mas espere, podemos usar o operador de adição, economizando 2 bytes:
72a101a+7aa+3a
Formatação
Como usarei o cabeçalho de snippet de pilha de Martin Büttner, você poderia formatar o título da seguinte forma:
# <Language name>, <length of total output> bytes
Em seguida, você pode colocar o que quiser abaixo do título.
Ganhando
Você deve postar o comprimento dos programas Fourier (produzidos pelo seu código) para gerar esse arquivo de texto e esse arquivo de texto . Sua pontuação é o comprimento combinado dos dois programas de Fourier em bytes (caracteres não ASCII não são usados no Fourier, portanto, isso realmente não faz diferença).
A pessoa com as pontuações mais baixas ganha. Se houver um empate, o programa mais curto em bytes vence.
Recompensa
Esta recompensa de 500 representantes é para um novo resposta que joga as cordas usando qualquer uma das funções de Fourier. Isso inclui variáveis, loops e instruções if etc. Esta nova resposta não será aceita.
Entre os melhores
Consulte a seção de formatação acima:
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>
fonte
Respostas:
Python, 14307118 bytes
601216 para Hamlet + 13705902 para Genesis = 14307118
Definitivamente, existem alguns cenários em que esta solução não é ideal, como para
1111
, onde ela produzirá1111o
em oposição a11oo
. No entanto, acho que é quase ideal.Editar: salvou alguns bytes, melhorando
0o0o
para0oo
.O nome do arquivo que contém a entrada é recebido em STDIN, enviado para STDOUT.
Resultados verificados com o intérprete oficial.
fonte
> <>, 14310665 bytes
601398 para aldeia + 13709267 para genesis
Ainda é um trabalho em andamento e leva muito tempo para ser concluído.
fonte
Java, 14307140 bytes
Hamlet - 601.218
Gênesis - 13.705.922
A idéia aqui é fazer todo o trabalho antecipadamente, criando um mapa de personagem-> personagem. Então você pode simplesmente percorrer e pegar as cordas mais curtas.
É preciso fazer uma exceção para os numerais, então eu os verifico no loop principal. No entanto, ainda é rápido e lida com o caso de teste maior em alguns segundos. Talvez eu consiga ajustar esta seção por mais alguns bytes, mas tenho quase certeza de que está perto do ideal.
Entrada é um nome de arquivo como argumento. A saída é gravada em um arquivo
inputFilename_out.4
e a contagem de caracteres é enviada para STDOUT.Trata-se de 1737 bytes para o desempatador, completamente não-destruído. Eu posso jogar muito, se necessário, mas ainda será um pouco grande.
fonte
01
, acredito que ela produz01o
, o que não está correto.else
cláusula do loop principal, você escolhe entre usar o valor real do acumulador e o valor do caractere anterior. Você não pode fazer a última escolha se os dois forem diferentes, porque isso significa que você usouo
o tempo anterior e o acumulador não contém o valor do caractere anterior.PHP, 14307118 bytes
601.216 (Hamlet) + 13.705.902 (Bíblia)
Saída de Fourier para Hamlet
Funciona da seguinte maneira:
fonte