Desafio
Escreva um programa que reordene os caracteres ASCII!
Ele deve gerar uma única sequência contendo todos os caracteres ASCII imprimíveis exatamente uma vez. O primeiro caractere dessa sequência recebe o valor 1, o segundo caractere, o valor 2, e assim por diante.
Se dois caracteres estiverem normalmente próximos um do outro (a diferença entre os códigos de caracteres é 1), eles podem não aparecer um ao lado do outro na saída.
Pontuação
Sua pontuação será a soma dos valores para todos os caracteres no seu código-fonte, conforme determinado pela saída do seu programa.
Consulte a seção Verificação para calcular sua pontuação.
Menor pontuação ganha!
Regras
"ASCII imprimível" é definido para significar códigos de caracteres 32 - 126, inclusive.
Você pode escrever um programa completo ou uma função.
Seu código pode conter apenas caracteres ASCII imprimíveis e novas linhas.
Seu programa pode não receber nenhuma entrada.
As novas linhas sempre terão o valor 1. A saída do seu programa não deve incluir uma nova linha.
Verificação
Use esse trecho de pilha para verificar se a saída do seu código é válida e para calcular a pontuação do seu código!
var result = document.getElementById("result");document.getElementById("submit").onclick = function() {var code = document.getElementById("code").value;var output = document.getElementById("output").value;var values = [];for (var i = 0; i < output.length; i++) {var c = output[i];var v = c.charCodeAt();if (v < 32 || v > 126) {result.innerHTML = "Invalid output! Reason: `" + c + "` (code " + v + ") is out of range.";return;}if (values.indexOf(c) >= 0) {result.innerHTML = "Invalid output! Reason: `" + c + "` (code " + v + ") was repeated.";return;}if (i > 0) {var d = output[i - 1];var w = d.charCodeAt();if (Math.abs(v - w) == 1) {result.innerHTML = "Invalid output! Reason: `" + d + "` and `" + c + "` (codes " + w + " and " + v + ") cannot appear next to each other in the output.";return;}}values.push(c);}for (var j = 32; j <= 126; j++) {var c = String.fromCharCode(j);if (values.indexOf(c) < 0) {result.innerHTML = "Invalid output! Reason: `" + c + "` (code " + j + ") was missing.";return;}}var score = 0;for (var k = 0; k < code.length; k++) {var s = values.indexOf(code[k]) + 1;if (s <= 0) s = 1;score += s}result.innerHTML = "Your score is " + score + "!";}
<textarea id="code" rows=10 cols=50>Enter your code here.</textarea><br/><textarea id="output" rows=1 cols=50>Enter your code's output here.</textarea><br/><button id="submit">Submit</button><br/><p id="result"></p>
Entre os melhores
Obrigado a este post pelo código do placar!
var QUESTION_ID=57914,OVERRIDE_USER=42844;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>
Respostas:
CJam,
356186168131126111999694Experimente online no intérprete CJam .
Saída
Idéia
Usando uma variação de uma técnica comum em CJam quines, classificamos os caracteres ASCII imprimíveis por eles aparecerem no código-fonte e os que não aparecem - com duas exceções - pelos bits de paridade de seus pontos de código.
Com o layout de fonte adequado, também conseguimos classificar os caracteres do código fonte - com uma exceção - por suas frequências.
É preciso ter cuidado especial para que dois caracteres adjacentes não apareçam um após o outro pela primeira vez no código-fonte, pois isso invalidaria a resposta.
Código
fonte
Brainfuck,
1692826765(Ainda) Não otimizado, eu sei. Estou trabalhando nisso (deixe opta nos comentários).
Saída:
Já estou utilizando o estouro de células de 8 bits até certo ponto, mas acho que você ainda pode otimizá-lo. Embora isso diminua o uso de caracteres baratos :).
fonte
Pyth,
173170Código
Saída
Codificação codificada de uma string semelhante a uma solução quine. Convenientemente, o
"
personagem está muito próximo do início da sequência gerada. Imprime caracteres pares e ímpares depois do "quine".Muito obrigado a Dennis por economizar 3 pontos e tornar o código um palindome!
Experimente aqui
fonte
r
deve retornar uma lista de strings quando usado neste modo.\~
para o intervalo de caracteres melhora sua pontuação em 3 pontos. (Ele também permite que você faça o seu código de um palíndromo.)~
para a parte "Quine" em vez de precisar adicioná-lo à faixa de alguma forma ...: dJava,
3518 31892692Um loop simples que imprime caracteres pares e depois probabilidades. Tentei algumas coisas para otimizar os ASCIIs anteriores, mas a maioria acabou tornando-o mais longo no geral e obteve uma pontuação mais alta.
A saída é:
Edit: Entendeu mal a pontuação em primeiro lugar. Depois de passar para ímpar primeiro, depois para o mesmo, obtém uma pontuação muito melhor.
fonte
Oitava, 628
Código
Saída:
Dois intervalos implicitamente convertidos em string. Não tenho certeza se retornar como Ans é aceitável, também fornece um aviso sobre a conversão implícita. Tentei alguns outros vetores de intervalo, mas não consegui encontrar nada mais eficiente.
fonte
C, 42 bytes, pontuação 1539
C, 39 bytes, pontuação 1687
Nos dois casos,
i
é inicializado com o número de seqüências de caracteres na linha de comando (como nenhum argumento é fornecido, é 1.)A primeira versão faz as coisas da maneira óbvia, aumentando em 2, tomando o módulo 95 e, portanto, imprimindo todas as probabilidades e todos os pares.
A segunda versão aproveita o fato de putchar retornar o caractere impresso. Como 32 é coprime para 95, podemos alternar entre os caracteres. Como C contém muitos caracteres em minúsculas, eu esperava que isso, além de mais curto, tivesse uma pontuação mais baixa, mas infelizmente não é esse o caso.
fonte
i;main(){for(;i<3990;i+=42)putchar(i%95+32);}
pontua 1472, eu achoa
o nome da variável e nãoi
nos dois casos.Befunge-93,
801797724699627612Código:
Saída:
Você pode experimentá-lo aqui, se quiser.
Ele funciona produzindo 32-126 pares e, em seguida, 33-125 probabilidades. Se alguém quiser uma explicação, eu estaria disposto.
Eu jogava golfe até conseguir algo melhor do que uma merda cerebral, que eu considerava a mais baixa possível. Quanto às estratégias de golfe, gerei os caracteres ASCII e tentei substituir caracteres caros por caracteres mais baratos (como 1 com 2). Descobri que, por
g
ser tão caro, era melhor calcular 126 todas as iterações. Eu também envolvi o topo, já que^
era mais barato do quev
.801 -> 797 : As alterações recentes estavam removendo espaços extras que eram uma relíquia de usar
g
.797 -> 724 : Eu mudei o cálculo 126 todas as vezes para apenas ler til usando
"~"
. isso também permitiu cortar espaço em branco (e estou batendo em uma das respostas da BF novamente)724 -> 699 : Semelhante à última alteração, "" é uma maneira extremamente barata (4 pontos) de obter 32
699 -> 627 : Como passo apenas a segunda passagem de linha uma vez, apenas a alterei para a configuração 33, em vez de manter outro valor na pilha e adicionar um.
627 -> 612 : movido o máximo que pude para inserir a string. Tenho certeza de que o design precisaria mudar drasticamente para jogar ainda mais.
Esta é provavelmente a iteração final, a menos que um dos idiomas que não seja de golfe obtenha uma solução mais baixa.
fonte
Haskell, 830
Avalia para a sequência:
Inspirado pela resposta de @ Jørgen e completamente diferente da minha .
fonte
Brainfuck, pontuação
576667Pensando bem, 576 parecia bom demais: fiz uma pequena estimativa e calculei minha pontuação em torno de 95 * 6 + 45 * 2 = 660. Algo deve ter dado errado na primeira vez em que corri o validador. A pontuação correta está mais próxima da minha estimativa. Ainda não é uma pontuação ruim.
Mantenha simples.
Basicamente, apenas sobe e desce o conjunto ASCII, imprimindo caracteres. Os três caracteres usados no programa são impressos primeiro. Virar em cada extremidade foi um pouco complicado.
fonte
Ruby 2.2, 1157
Saída:
Esta é uma solução bastante burra (e não tenho certeza se srand não deve ser uma brecha padrão, especialmente porque reduz drasticamente a portabilidade). Baralha (na maior parte) os bytes em seu próprio código-fonte e embaralha o restante, depois unifica e concatena as matrizes. Usa uma semente aleatória escolhida para que a saída seja legal (o fato de ser um dígito é pura sorte).
fonte
CBM BASIC V2, 2553
a saída (convertida em ASCII por um script python no pc):
fonte
gawk,
278219881821Saída
Uso
Copie e cole o seguinte no seu console
(o mawk não funcionará, porque é
muitomais rigoroso com o printf)O
< /dev/null
no final sinaliza o final da entrada, então o bloco END será executado.Basicamente, eu intercalei os personagens vindos de baixo e de cima. Depois, analisei quais caracteres foram mais utilizados no programa e os imprimi primeiro, em ordem de frequência. Então tive que me certificar de que nenhum caractere fosse impresso mais de uma vez. A tecelagem em direções opostas tornou mais provável que um personagem já usado não levasse à impressão de vizinhos. Mas eles se conheceram no meio às
P
, então eu tive que imprimir isso também no começo. Houve alguns problemas com caracteres usados em regexps ... Então, renomeei as variáveis de forma barata e refiz a coisa toda. Então eu encontrei alguns caracteres que eu poderia substituir no meu programa e fiz tudo de novo. E assim por diante .. Finalmente ajustei a string com os caracteres preferidos um pouco testando.Acho que terminei
:D
Durante o processo, nunca executei o programa a partir da linha de comando, mas construí uma string que executei de dentro de um script, que analisaria a saída para correção e me forneceria a pontuação e outras coisas. Essa saída de pontuação ajudou muito. É claro que voltei a verificar aqui (você nunca sabe), mas o resultado foi o mesmo.
Lá, o programa se parece com isso
fonte
Matlab, 763
Obviamente, é impossível vencer a solução Octave no MATLAB, pois ela não possui o
"
que é "precoce" na faixa ASCII. No entanto, decidi ser um pouco criativo e pensei em abusarrandperm
. Admito que é um pouco hacky e alguns podem considerá-lo trapaça, mas acho que é um toque agradável. Primeiro, o programa e a saída:Ouput:
Para calcular uma semente apropriada, usei o seguinte programa, que funcionou até a semente = 4648029 (ou seja, até a louça estar pronta)
Talvez uma maneira de melhorar o programa seja experimentar também sementes de ponto flutuante, por exemplo, 2.3e4 aumente o número de sementes sem ter um comprimento maior. Se alguém quiser criar um programa para calcular todos os números de n caracteres representáveis pelo Matlab ....;)
fonte
randperm
não fosse um nome de função tão longo.Haskell,
16601376Define a função
a
que retorna a string:fonte
Java, 15470
Não é realmente ideal, mas na verdade remapeia os caracteres (em vez de apenas imprimir um conjunto de caracteres modificados).
Ungolfed:
Saída
Ele ordena os caracteres usando o mesmo método da resposta do Geobits e faz algo semelhante a essa resposta para alterar os caracteres.
fonte
BBC BASIC, 2554
Código
Saída
fonte
Fortran 90,
152315191171Este é um loop de saída aninhado, semelhante a outras respostas. Não muito confiante de que muitas melhorias sejam possíveis ...
Saída:
Edit: Esqueceu que o Fortran 90 é necessário para este código, 77 requer que o código inicie na 7ª coluna. Por outro lado, o idioma não diferencia maiúsculas de minúsculas, permitindo uma melhoria fácil. Os contadores de loop são
J
eL
porque essas são as duas primeiras letras na string de saída declaradas implicitamente como números inteiros pelo Fortran.fonte
Perl,
1089922Acontece que a impressão dos valores ASCII nas etapas de
4258 fornece a pontuação mais baixa com esta abordagem:Saída:
fonte
print chr$_*42%95+32for 0..94
já atinge uma pontuação de 925 e 42 provavelmente não é mais o ideal.print chr$_*63%95+32for 31..125
alcança uma pontuação de 799.JavaScript,
31692548214421042071188518761872Código
Saída
fonte
v+
parte é(v,i)=>v+i*3%95+32
necessária? Parece-me que ele simplesmente acrescenta0
cada vez desde a matriz é preenchida com0
s ....for(w=95;w-->0;)
pode serfor(w=95;w--;)
, porque0
é falso e é verdadeiro1, 2, 3...
.Python 2,
72 bytes (3188)116 bytes(1383)(1306)(1303)obrigado @FryAmTheEggman pelo truque de junção;)
thanks @nim (Eu interpretei mal o texto?: P)
obrigado @Mathias Ettinger
saída:
fonte
a=map(chr,range(32,172))
e"".join(a[::2]+a[1::2])
;
com novas linhas, que contam como 1n='nr i(a…
vez den=' nri(a…
PHP,
12171081O código:
Como as variáveis não são inicializadas, ele precisa suprimir os avisos na execução (o PHP reclama, mas continua a execução e usa um valor padrão que é apropriado no contexto;
0
neste caso):Sua saída:
Observações:
chr(32)
);52
foi "descoberto" pesquisando todo o intervalo (1..94) de possíveis compensações; 1 produz a lista de caracteres imprimíveis na ordem crescente de seus códigos ASCII; 94 produz a lista na ordem inversa, ambos são ruins; os múltiplos de 5 e 19 (os divisores de 95) produzem ciclos curtos e não cobrem todo o intervalo de valores (também ruim);52
parece ser mágico; é o melhor deslocamento para esse código; mas também é o melhor para algumas variações do código (que produzem pontuações um pouco maiores); as variações que eu tentei: utilizaçãowhile()
em vez defor()
, uso$f++
,$f--
ou--$f
em vez de++$f
, trocar os operandos ao redor do<
e+
operadores; aperte a modificação de$T
em32+$T
;$T
e$f
) são as primeiras letras da saída;$T
com4
ou11
mas as pontuações eram piores; começando com4
cria$
o primeiro caractere na saída; é o caractere mais usado em um código-fonte PHP;11
traz+
na frente;$
e+
são os caracteres mais usados neste código.O código, testes, alterações incrementais que tentei até chegar a essa solução e o script que testou todos os valores possíveis de etapas (o provedor autorizado
52
como a melhor etapa) podem ser encontrados no github .fonte
Fourier, 1236
Basicamente, uma conversão do meu programa BBCB
Saída
fonte
AWK , 49 bytes, Pontuação: 1755
Experimente online!
Simplesmente imprime todos os outros caracteres e recomeça preenchendo os espaços em branco. O primeiro caractere impresso é um
f
. Tentei imprimir em ordem inversa, mas isso aumentou muito a pontuação. Outros padrões são possíveis simplesmente alterando o multiplicador e os critérios de loop.fonte
Perl 5 , 1069
Experimente online!
fonte