Identicons são pequenas imagens de padrões geométricos que representam o valor de hash de uma string. O Stack Exchange usa os identicons do Gravatar como a imagem de avatar padrão de cada usuário.
Nesse desafio, usaremos as identidades do Gravatar também para gerar algum texto para o golfe.
Desafio
Esse snippet de pilha (uma versão reduzida do JSFiddle ) permite digitar uma string e devolve uma versão em preto e branco de 100 × 100 pixels do identônimo dessa string, juntamente com uma versão de texto onde 1
é preto e 0
branco:
<!-- Click "Run code snippet" --> <div style='text-align:center;'> <input id='str' type='text' size='32' value='Python'> <button type='button' onclick='go()'>Go</button><br><br><input id='type1' name='type' type='radio' value='identicon' checked> <label for='type1'>Identicon</label> <input id='type2' name='type' type='radio' value='monsterid'> <label for='type2'>Monster</label> <input id='type3' name='type' type='radio' value='wavatar'> <label for='type3'>Wavatar</label> <input id='type4' name='type' type='radio' value='retro'> <label for='type4'>Retro</label> <br><br><a id='origLink'>original</a><br><canvas id='original' style='border:1px solid gray;'> Your browser does not support the canvas tag. </canvas> <br><br>binary<br><canvas id='binary' style='border:1px solid gray;'> </canvas> <br><br>text</br> <textarea id='text' style='background-color:#eee' readonly></textarea> <br><br>your text</br> <textarea id='userText'></textarea><br><button type='button' onclick='markDiffs()'>Mark Differences With X</button><br><br><span id='diffCount'></span> <br><br><small>(this snippet has only been tested in Chrome and Firefox)</small></div><script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>function rgbDist(t,n){return Math.sqrt((Math.pow((t[0]-n[0])/255,2)+Math.pow((t[1]-n[1])/255,2)+Math.pow((t[2]-n[2])/255,2))/3)}function toBinImg(t,n){for(var r=0;r<t.data.length;r+=4){var e=rgbDist([t.data[r],t.data[r+1],t.data[r+2]],[255,255,255])<n;t.data[r]=t.data[r+1]=t.data[r+2]=e?255:0}}function getText(t){for(var n="",r=0,e=0;SIZE>e;e++){for(var o=0;SIZE>o;o++)n+=t.data[r]?"0":"1",r+=4;e!=SIZE-1&&(n+="\n")}return n}function markDiffs(){var t=0,n=$("#text").val().split("\n"),r=$("#userText").val(),e=new RegExp("(?:[01]{"+SIZE+"}\n){"+(SIZE-1)+"}(?:[01]{"+SIZE+"})\n?");if(!r.match(e))return void $("#diffCount").text("bad input");r=r.split("\n");for(var o="",a=0;SIZE>a;a++){for(var i=0;SIZE>i;i++)r[a][i]!==n[a][i]?(o+="X",t++):o+=r[a][i];o+="\n"}r[r.length-1].length&&(o=o.substring(0,o.length-1)),$("#diffCount").text(t+" differences found"),$("#userText").val(o)}function go(){var t=new Image;t.crossOrigin="anonymous",t.src="https://www.gravatar.com/avatar/"+md5($("#str").val())+"?&s="+SIZE+"&d="+$("input:radio[name=type]:checked").val(),$("#origLink").attr("href",t.src),t.onload=function(){ctxOrig.drawImage(t,0,0);var n=ctxOrig.getImageData(0,0,SIZE,SIZE);toBinImg(n,.05),$("#text").val(getText(n)),ctxBin.putImageData(n,0,0)}}var SIZE=100;$("#str").keyup(function(t){13==t.keyCode&&go()}),$("input[name=type]:radio").change(go),$(function(){var t=$("#original"),n=$("#binary");t.prop({width:SIZE,height:SIZE}),n.prop({width:SIZE,height:SIZE}),$("#text").prop({rows:SIZE+5,cols:SIZE+5}),$("#userText").prop({rows:SIZE+5,cols:SIZE+5}),ctxOrig=t[0].getContext("2d"),ctxBin=n[0].getContext("2d"),go()}),!function(t){"use strict";function n(t,n){var r=(65535&t)+(65535&n),e=(t>>16)+(n>>16)+(r>>16);return e<<16|65535&r}function r(t,n){return t<<n|t>>>32-n}function e(t,e,o,a,i,u){return n(r(n(n(e,t),n(a,u)),i),o)}function o(t,n,r,o,a,i,u){return e(n&r|~n&o,t,n,a,i,u)}function a(t,n,r,o,a,i,u){return e(n&o|r&~o,t,n,a,i,u)}function i(t,n,r,o,a,i,u){return e(n^r^o,t,n,a,i,u)}function u(t,n,r,o,a,i,u){return e(r^(n|~o),t,n,a,i,u)}function c(t,r){t[r>>5]|=128<<r%32,t[(r+64>>>9<<4)+14]=r;var e,c,f,g,d,h=1732584193,s=-271733879,v=-1732584194,I=271733878;for(e=0;e<t.length;e+=16)c=h,f=s,g=v,d=I,h=o(h,s,v,I,t[e],7,-680876936),I=o(I,h,s,v,t[e+1],12,-389564586),v=o(v,I,h,s,t[e+2],17,606105819),s=o(s,v,I,h,t[e+3],22,-1044525330),h=o(h,s,v,I,t[e+4],7,-176418897),I=o(I,h,s,v,t[e+5],12,1200080426),v=o(v,I,h,s,t[e+6],17,-1473231341),s=o(s,v,I,h,t[e+7],22,-45705983),h=o(h,s,v,I,t[e+8],7,1770035416),I=o(I,h,s,v,t[e+9],12,-1958414417),v=o(v,I,h,s,t[e+10],17,-42063),s=o(s,v,I,h,t[e+11],22,-1990404162),h=o(h,s,v,I,t[e+12],7,1804603682),I=o(I,h,s,v,t[e+13],12,-40341101),v=o(v,I,h,s,t[e+14],17,-1502002290),s=o(s,v,I,h,t[e+15],22,1236535329),h=a(h,s,v,I,t[e+1],5,-165796510),I=a(I,h,s,v,t[e+6],9,-1069501632),v=a(v,I,h,s,t[e+11],14,643717713),s=a(s,v,I,h,t[e],20,-373897302),h=a(h,s,v,I,t[e+5],5,-701558691),I=a(I,h,s,v,t[e+10],9,38016083),v=a(v,I,h,s,t[e+15],14,-660478335),s=a(s,v,I,h,t[e+4],20,-405537848),h=a(h,s,v,I,t[e+9],5,568446438),I=a(I,h,s,v,t[e+14],9,-1019803690),v=a(v,I,h,s,t[e+3],14,-187363961),s=a(s,v,I,h,t[e+8],20,1163531501),h=a(h,s,v,I,t[e+13],5,-1444681467),I=a(I,h,s,v,t[e+2],9,-51403784),v=a(v,I,h,s,t[e+7],14,1735328473),s=a(s,v,I,h,t[e+12],20,-1926607734),h=i(h,s,v,I,t[e+5],4,-378558),I=i(I,h,s,v,t[e+8],11,-2022574463),v=i(v,I,h,s,t[e+11],16,1839030562),s=i(s,v,I,h,t[e+14],23,-35309556),h=i(h,s,v,I,t[e+1],4,-1530992060),I=i(I,h,s,v,t[e+4],11,1272893353),v=i(v,I,h,s,t[e+7],16,-155497632),s=i(s,v,I,h,t[e+10],23,-1094730640),h=i(h,s,v,I,t[e+13],4,681279174),I=i(I,h,s,v,t[e],11,-358537222),v=i(v,I,h,s,t[e+3],16,-722521979),s=i(s,v,I,h,t[e+6],23,76029189),h=i(h,s,v,I,t[e+9],4,-640364487),I=i(I,h,s,v,t[e+12],11,-421815835),v=i(v,I,h,s,t[e+15],16,530742520),s=i(s,v,I,h,t[e+2],23,-995338651),h=u(h,s,v,I,t[e],6,-198630844),I=u(I,h,s,v,t[e+7],10,1126891415),v=u(v,I,h,s,t[e+14],15,-1416354905),s=u(s,v,I,h,t[e+5],21,-57434055),h=u(h,s,v,I,t[e+12],6,1700485571),I=u(I,h,s,v,t[e+3],10,-1894986606),v=u(v,I,h,s,t[e+10],15,-1051523),s=u(s,v,I,h,t[e+1],21,-2054922799),h=u(h,s,v,I,t[e+8],6,1873313359),I=u(I,h,s,v,t[e+15],10,-30611744),v=u(v,I,h,s,t[e+6],15,-1560198380),s=u(s,v,I,h,t[e+13],21,1309151649),h=u(h,s,v,I,t[e+4],6,-145523070),I=u(I,h,s,v,t[e+11],10,-1120210379),v=u(v,I,h,s,t[e+2],15,718787259),s=u(s,v,I,h,t[e+9],21,-343485551),h=n(h,c),s=n(s,f),v=n(v,g),I=n(I,d);return[h,s,v,I]}function f(t){var n,r="";for(n=0;n<32*t.length;n+=8)r+=String.fromCharCode(t[n>>5]>>>n%32&255);return r}function g(t){var n,r=[];for(r[(t.length>>2)-1]=void 0,n=0;n<r.length;n+=1)r[n]=0;for(n=0;n<8*t.length;n+=8)r[n>>5]|=(255&t.charCodeAt(n/8))<<n%32;return r}function d(t){return f(c(g(t),8*t.length))}function h(t,n){var r,e,o=g(t),a=[],i=[];for(a[15]=i[15]=void 0,o.length>16&&(o=c(o,8*t.length)),r=0;16>r;r+=1)a[r]=909522486^o[r],i[r]=1549556828^o[r];return e=c(a.concat(g(n)),512+8*n.length),f(c(i.concat(e),640))}function s(t){var n,r,e="0123456789abcdef",o="";for(r=0;r<t.length;r+=1)n=t.charCodeAt(r),o+=e.charAt(n>>>4&15)+e.charAt(15&n);return o}function v(t){return unescape(encodeURIComponent(t))}function I(t){return d(v(t))}function l(t){return s(I(t))}function p(t,n){return h(v(t),v(n))}function E(t,n){return s(p(t,n))}function S(t,n,r){return n?r?p(n,t):E(n,t):r?I(t):l(t)}"function"==typeof define&&define.amd?define(function(){return S}):t.md5=S}(this);//thanks https://github.com/blueimp/JavaScript-MD5/blob/master/js/md5.min.js</script>
(Ele também permite que você carregue os estilos Monster, Wavatar e Retro Gravatar, mas eles são apenas para diversão e não devem ser usados para esse desafio. Infelizmente, os unicórnios estão ausentes devido a restrições de XSS .: /)
Sua tarefa é escrever um programa que produza o bloco de texto de 100 × 100 caracteres 0
's 1
' e é gerado quando você coloca o nome da linguagem de programação na caixa de entrada do trecho.
Por exemplo, se o seu envio estiver escrito em Python , você digitaria Python
no snippet da pilha e veria que
é o identicon para Python e
é a versão em preto e branco (binária) e
0000000000000000000000011111111111111111111111111100000000000000000000000010000000000000000000000000
0000000000000000000001111011111111111111111111111100000000000000000000011110000000000000000000000000
0000000000000000000111111011111111111111111111111100000000000000000001111110000000000000000000000000
0000000000000000011111111011111111111111111111111100000000000000000111111110000000000000000000000000
0000000000000001111111111001111111111111111111111100000000000000001111111110000000000000000000000000
0000000000000111111111111001111111111111111111111100000000000000111111111110000000000000000000000000
0000000000001111111111111000111111111111111111111100000000000111111111111110000000000000000000000000
0000000000000011111111111000111111111111111111111100000000011111111111111110000000000000000000000000
0000000000000000111111111000011111111111111111111100000001111111111111111110000000000000000000000000
0000000000000000001111111000001111111111111111111100000011111111111111111110000000000000000000000000
0000000000000000000011111000001111111111111111111100001111111111111111111110000000000000000000000000
0000000000000000000000111000000111111111111111111101111111111111111111111110000000000000000000000000
0000000000000000000000001000000111111111111111111111111111111111111111111110000001000000000001000000
0000000000000000000000111000000111111111111111111111111111111111111111111110000011000000000001100000
0000000000000000000011111000000011111111111111111111111111111111111111111110000011100000000011100000
0000000000000000001111111000000011111111111111111111111111111111111111111110000111100000000011110000
0000000000000000111111111000000001111111111111111111111111111111111111111110000111110000000111110000
0000000000000011111111111000000001111111111111111111111111111111111111111110001111110000000111111000
0000000000001111111111111000000000111111111111111111111111111111111111111110001111111000001111111000
0000000000000111111111111000000000011111111111111111111111111111111111111110011111111000001111111100
0000000000000001111111111000000000011111111111111111111111111111111111111110011111111100011111111100
0000000000000000011111111000000000001111111111111111111111111111111111111110111111111100011111111110
0000000000000000000111111000000000001111111111111111111111111111111111111110111111111110111111111110
0000000000000000000001111000000000001111111111111111111111111111111111111111111111111110111111111111
0000000000000000000000011000000000000111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000001
0111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000001111
0111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000111111
0111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000011111111
0011111111111111111111111000000000000000000000000000000000000000000000000000000000000000000111111111
0011111111111111111111111000000000000000000000000000000000000000000000000000000000000000011111111111
0001111111111111111111111000000000000000000000000000000000000000000000000000000000000011111111111111
0001111111111111111111111000000000000000000000000000000000000000000000000000000000001111111111111111
0000111111111111111111111000000000000000000000000000000000000000000000000000000000111111111111111111
0000011111111111111111111000000000000000000000000000000000000000000000000000000001111111111111111111
0000011111111111111111111000000000000000000000000000000000000000000000000000000111111111111111111111
0000001111111111111111111000000000000000000000000000000000000000000000000000111111111111111111111111
0000001111111111111111111000000000000000000000000000000000000000000000000001111111111111111111111111
0000001111111111111111111000000000000000000000000000000000000000000000000001111111111111111111111111
0000000111111111111111111000000000000000000000000000000000000000000000000001111111111111111111111111
0000000111111111111111111000000000000000000000000000000000000000000000000001111111111111111111111111
0000000011111111111111111000000000000000000000000000000000000000000000000001111111111111111111111111
0000000011111111111111111000000000000000000000000000000000000000000000000001111111111111111111111111
0000000001111111111111111000000000000000000000000000000000000000000000000001111111111111111111111111
0000000000111111111111111000000000000000000000000000000000000000000000000001111111111111111111111111
0000000000111111111111111000000000000000000000000000000000000000000000000001111111111111111111111111
0000000000011111111111111000000000000000000000000000000000000000000000000001111111111111111111111111
0000000000011111111111111000000000000000000000000000000000000000000000000001111111111111111111111111
0000000000011111111111111000000000000000000000000000000000000000000000000001111111111111111111111111
0000000000001111111111111000000000000000000000000000000000000000000000000001111111111111111111111111
1111111111111111111111111000000000000000000000000000000000000000000000000001111111111111000000000000
1111111111111111111111111000000000000000000000000000000000000000000000000001111111111111100000000000
1111111111111111111111111000000000000000000000000000000000000000000000000001111111111111100000000000
1111111111111111111111111000000000000000000000000000000000000000000000000001111111111111110000000000
1111111111111111111111111000000000000000000000000000000000000000000000000001111111111111110000000000
1111111111111111111111111000000000000000000000000000000000000000000000000001111111111111111000000000
1111111111111111111111111000000000000000000000000000000000000000000000000001111111111111111000000000
1111111111111111111111111000000000000000000000000000000000000000000000000001111111111111111100000000
1111111111111111111111111000000000000000000000000000000000000000000000000001111111111111111100000000
1111111111111111111111111000000000000000000000000000000000000000000000000001111111111111111110000000
1111111111111111111111111000000000000000000000000000000000000000000000000001111111111111111110000000
1111111111111111111111111000000000000000000000000000000000000000000000000001111111111111111111000000
1111111111111111111111111000000000000000000000000000000000000000000000000001111111111111111111000000
1111111111111111111111110000000000000000000000000000000000000000000000000001111111111111111111100000
1111111111111111111111000000000000000000000000000000000000000000000000000001111111111111111111100000
1111111111111111111100000000000000000000000000000000000000000000000000000001111111111111111111110000
1111111111111111110000000000000000000000000000000000000000000000000000000001111111111111111111110000
1111111111111111000000000000000000000000000000000000000000000000000000000001111111111111111111111000
1111111111111100000000000000000000000000000000000000000000000000000000000001111111111111111111111000
1111111111110000000000000000000000000000000000000000000000000000000000000001111111111111111111111100
1111111111000000000000000000000000000000000000000000000000000000000000000001111111111111111111111100
1111111100000000000000000000000000000000000000000000000000000000000000000001111111111111111111111110
1111110000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111110
1111000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111
1100000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111110000000000001100000000000000000000000
1111111111111111111111111111111111111111111111111111111111111111000000000001111000000000000000000000
0111111111110111111111111111111111111111111111111111111111111111000000000001111110000000000000000000
0111111111110011111111110111111111111111111111111111111111111111100000000001111111100000000000000000
0011111111100011111111110111111111111111111111111111111111111111100000000001111111111000000000000000
0011111111000001111111100111111111111111111111111111111111111111110000000001111111111110000000000000
0001111111000001111111100111111111111111111111111111111111111111110000000001111111111111000000000000
0001111111000000111111000111111111111111111111111111111111111111111000000001111111111100000000000000
0000111110000000111111000111111111111111111111111111111111111111111000000001111111110000000000000000
0000111110000000011110000111111111111111111111111111111111111111111100000001111111000000000000000000
0000011100000000011100000111111111111111111111111111111111111111111100000001111100000000000000000000
0000011100000000001100000111111111111111111111111111111111111111111110000001110000000000000000000000
0000001000000000001100000111111111111111111111111111111111111111111110000001000000000000000000000000
0000000000000000000000000111111111111111111111111011111111111111111111000001110000000000000000000000
0000000000000000000000000111111111111111111111100011111111111111111111000001111100000000000000000000
0000000000000000000000000111111111111111111110000011111111111111111111100001111111000000000000000000
0000000000000000000000000111111111111111111000000011111111111111111111100001111111110000000000000000
0000000000000000000000000111111111111111100000000011111111111111111111110001111111111100000000000000
0000000000000000000000000111111111111110000000000011111111111111111111110001111111111111000000000000
0000000000000000000000000111111111111000000000000011111111111111111111111001111111111110000000000000
0000000000000000000000000111111111100000000000000011111111111111111111111001111111111000000000000000
0000000000000000000000000111111110000000000000000011111111111111111111111101111111100000000000000000
0000000000000000000000000111111000000000000000000011111111111111111111111101111110000000000000000000
0000000000000000000000000111100000000000000000000011111111111111111111111111111000000000000000000000
0000000000000000000000000110000000000000000000000011111111111111111111111111100000000000000000000000
é a saída textual correspondente que seu programa Python deve produzir.
No entanto, como os identificadores podem ter muitos ângulos desajeitados e sua rasterização, pois uma imagem em preto e branco pode deixar manchas , sua saída pode ter até 300 0
's ou 1
' s que são os opostos do que deveriam ser. (Isso é 3% do total de 10000 0
e 1
).
Próximo à parte inferior do trecho, você pode colar na saída do seu programa e verificar quantos 0
's ou 1
' s são diferentes do que deveriam ser. Qualquer número de diferenças igual ou inferior a 300 é válido.
Pontuação
O envio com o menor número de bytes vence. ( Contador de bytes de Handy. )
Tiebreaker vai para a apresentação com o menor número de incorrectos 0
's e 1
' s.
Se ainda houver empate, a finalização anterior vence.
Detalhes
- A saída vai para stdout ou uma alternativa semelhante se o seu idioma não tiver stdout.
- A saída pode opcionalmente ter uma nova linha à direita.
- Inclua a imagem de identificação de cor em sua postagem, juntamente com a sequência exata que a gera. Não há necessidade de perder espaço e postar toda a sua saída de texto.
- Seu programa deve ser executado sem uma conexão com a internet. Você precisa gerar o texto em seu código, não consultá-lo no site Gravatar.
- Use o bom senso ao "nomear" seu idioma. Use o nome do idioma que você normalmente usaria neste site. Não seja irritante e invente um nome que facilite o identificação do golfe. por exemplo,
Python 2
é bom para Python, maspython 2.7.2
está esticando-o epython 2.7.2 by Guido van Rossum
seria ridículo. - Sei que algumas linguagens são inerentemente mais fáceis do que outras, porque suas formas de identificação são mais simples. É assim que as coisas serão, não fique muito descontente ou competitivo com isso. ;)
fonte
Respostas:
CJam,
92817971 bytes, 120 errosProvavelmente ainda há espaço para jogar isso.
Teste aqui.
Explicação
Não estou usando nenhuma compactação, mas, em vez disso, eu computo os blocos individuais e ajusto o resultado desses. O bloco superior esquerdo é intencionalmente aproximado. Alguns outros erros resultam da imagem binarizada não ser totalmente simétrica em rotação. Vamos analisar o código.
O primeiro bloco deve teoricamente ser assim:
Isso é, em seguida, 12 linhas, 13 linhas de ponto entre
1
s e0
s diminuindo por dois de cada vez. Observe que o primeiro bloco possui um número par de se0
o segundo bloco possui um número ímpar. Podemos tornar o padrão ainda mais regular se sacrificarmos a precisão na linha do meio e transformá-lo em1
seguido por 240
s. Na verdade, temos uma linha para cada número de zeros de 0 a 24, alternando entre as partes superior e inferior. Assim, podemos apenas gerá-los em ordem (como um único triângulo) e, em seguida, extrair todas as outras linhas:Em seguida, é esse triângulo sofisticado à direita desse bloco:
Se considerarmos um sistema de coordenadas com origem no canto superior direito e
x
indo para a direita ey
vai para baixo, então a região de1
s satisfaz 3 desigualdades:x/y ≥ 1/2
,x/y ≥ 2
,x + y < 38
. Podemos apenas computá-los separadamente e ter o fim lógico. Ele não salva nenhum caractere, mas limpa um pouco o código se combinarmos as duas primeiras desigualdades:Por fim, salvaremos outro byte, verificando o oposto e usando, em
xor
vez de,and
para combinar o resultado com a outra desigualdade:Temos tudo no lugar agora - os blocos restantes são apenas cópias e rotações deles, bem como o bloco sólido (chato) no centro. Então, vamos juntar tudo:
No final do programa, o CJam simplesmente imprime o conteúdo da pilha, criando o resultado desejado.
fonte
Oitava
166164 bytes, 0 errosO Octave tem uma grande resistência no manuseio / construção de matrizes. Para os 'diamantes', criei um sistema de coordenadas xy e usei a norma manhattan para decidir se as entradas serão 1 ou 0. Como os diamantes não são totalmente simétricos, eu tive que mexer na 'distância' e no ponto central, então com o ponto central (13.1,13.1), ele trabalhava para os dois tipos de formas de 'diamante'.
Depois disso, eu poderia definir um quarto desses para zero, a fim de obter essas formas em C. Os quadrados e a concatenação da matriz foram fáceis.
Novos caracteres da versão -2 (funciona da mesma maneira que os antigos, mas consegui abusar ainda mais da sintaxe do Octave:
Versão antiga:
Resultado
fonte
Brainfuck
94182237 bytes, 88 errosEdit: Como mbomb007 apontou, o nome 'oficial' parece não estar em maiúsculas, isso não é mencionado na wikipedia, mas sim em esolangs . Isso me irrita, mas não o suficiente para refazer isso;).
Meu primeiro programa Brainfuck!
Agora, na verdade, usa matemática, lógica e outras coisas! (para cada pixel, decide 0 ou 1, dependendo de alguns condicionais). Isso foi muito divertido de fazer; Dito isto, acho que não vou codificar novamente com o Brainfuck por um longo tempo.
produzindo o bitmap da imagem:
Uma versão com alguns comentários (pode não ser muito útil, pois era principalmente para meu próprio benefício):
fonte
Pitão,
294273239188179170159154 bytesAqui está a versão de 158 bytes :
Este é apenas um programa em Python 2, mas estou usando o identicon para "Python" (ou seja, o do OP). O diff deve ser 78 bits.
Jogando a precisão pela porta, aqui está a versão de 154 bytes :
que possui um diff de 224 bits.
(-4 bytes graças a Stefan Pochmann)
Explicação
Aqui está uma versão expandida alternativa:
Para esta versão, tratamos o identicon como uma grade de padrões 4x4. Começamos com uma grade 100x100 de 0s e fazemos o seguinte quatro vezes:
A versão original é semelhante, mas, em vez de girar após a conclusão dos três padrões, giramos toda vez que modificamos uma única célula . Isso leva o programa a demorar alguns segundos, mas a saída é a mesma.
fonte
J
er
em uma linha usando um ponto e vírgula.~i%12<j/2>i%12
é 3 menor do que,abs(i%12-6)+5<j/2
mas leva a 224 diff, eu acho.C,
255245237234 bytesO identicon de C é realmente simétrico.
Golfed: (novas linhas adicionadas para "legibilidade")
Isso armazena metade de cada linha na metade superior em um número inteiro de 64 bits e depois imprime os 50 bits inferiores do número inteiro apropriado em binário duas vezes, com a segunda impressão sendo revertida.
Ints de 64 bits são necessários para este executar (se o seu sistema não usar ints de 64 bits, então você pode adicionar
long
oulong long
antesd[50]
e(long)
ou(long long)
apóso[i-1]=i<26?
).Ungolfed e comentou:
Saída com 291 erros.
Graças a ace pela dica de usar
puts("")
fonte
putchar(10)
porputs("")
para salvar 3 bytes.C,
224206200176 bytes, 243 errosReplicar:
O código acima gera binário que se correlaciona com esta imagem, com 243 erros:
Pelo que sei, uso um método bastante diferente da solução da es1024. Esse método provavelmente pode ser ainda mais desenvolvido, por isso vou adiar um pouco a explicação, mas aqui está sua glória:
Essencialmente, ele usa um conjunto de desigualdades para definir os polígonos e depende muito da simetria.
Atualmente é meia-noite e minha capacidade de ler meu próprio código está se deteriorando rapidamente. Provavelmente você pode mexer com algumas constantes para diminuir os erros, mas eu só posso quebrar tudo de forma consistente.
Curiosidade, não é apenas a versão mais curta que eu criei , mas o gcc não lança avisos !
fonte
for
loop externofor(;i+1;i+=k=i-50?puts(b),k:-1)
para reduzir um ponto e vírgula e duas chaves, economizando 3 bytes.k=1
paramain(k)
salvar 3 bytes.gs2 : 72 bytes, 200 erros
Ainda não joguei isso de verdade, não tenho certeza se vou. Mnemônicos:
O próprio programa:
fonte
Z80, 194 bytes, 0 erros
Z80, 178 bytes, 80 erros
Os erros são destacados em verde.
Como esta é uma CPU antiga, usei convenções antigas. Eu usei & 8000 para valores hexadecimais em vez do 0x8000 mais familiar e escolhi finalizar cada linha do padrão com um "\ r" em vez de um "\ n".
Código fonte codificado em HEX
Código fonte explicado
Como o Z80 é uma CPU, ele não possui nenhuma saída padrão própria. Como tal, eu apenas escrevi cada caractere diretamente na memória, iniciando em & 4000 e, em seguida, coloquei os 10.100 bytes em MEMDUMP para verificar o padrão correto.
O Z80 possui registros da seguinte maneira:
O registro especial Bandeira contém as seguintes bandeiras:
SZ-H-VNC
. S ign, Z ero, H alf carry, ó v erflow (também utilizado como P aridade), N egative e C arry. As posições marcadas por-
não são utilizadas. Os sinalizadores H alf-carry e N egative são usados apenas internamente pela CPU. S ign e ó v erflow / P aridade tomar bytes extra para usar assim estou usando apenas Z ero e C arry que se configurar ou reconfigurar após cada cálculo, mas não quando se deslocam em torno de valores.Existem outros registros disponíveis, mas eles não são relevantes para um desafio de golfe, pois levam bytes extras para serem usados.
LD
l oa d s um valor para um registo ou o endereço, por exemplo,LD C, 4
éC = 4
. O valor pode ser direto (um ou dois bytes extras para um valor de 8 ou 16 bits, respectivamente) ou pode ser copiado de outro registro. Um valor de(HL)
meios copia para ou do endereço indicado porHL
.PUSH
ePOP
pressione (salvar em) e pop (restaurar a partir) da pilha, que pode armazenar apenas valores de 16 bits. Como tal,AF
é tratado como um único registro de 16 bits, embora nenhuma outra instrução o use dessa maneira.AND
é bit a bit e . O Z80 não possui instruções lógicas booleanas, mas possui sinalizadores booleanos.JR
j ump r elative usando um um-byte com sinal de offset. Este utiliza um byte menos do que o absoluto j hum pJP
, mas tem menos condições que podem ser testados para.INC
eDEC
inc rement e dec rement 8 e 16 bits registradores.DJNZ
d ecrement e j hum se n on- z ero. Isso faz exatamente o mesmo queDEC B; JR NZ, ##;
em um byte a menos, mas está disponível apenas para oB
registro.RET
retém as URLs para o local de chamada. Opcionalmente, ele pode ter condições.ADD
eSUB
adicionar a e sub trato tanto a partir do 8 bitsA
registo ou a 16 bits deHL
registo.CP
c om p subtrai o valor doA
registro, define sinalizadores conforme apropriado, mas descarta o resultado,A
mantendo-o inalterado.RRCA
r odar r ight c ircular um ccumulator. Gira todos os bitsA
uma vez para a direita, copiando o bit 0 para o bit 7. Ele também copia o bit 0 noC
sinalizador Carry ( ), para não ser confundido com oC
registrador.Cada padrão do Identicon pode ser dividido da seguinte forma:
onde 0-3 são os cantos, rotacionados conforme apropriado, 4-7 são os ladrilhos de borda, rotacionados conforme apropriado e 8 é o ladrilho central que é (até onde eu sei) sempre simetricamente rotacionalmente.
Felizmente, o Z80 Identicon pode ser simplificado para:
Coloquei os "0" no centro para permitir a verificação eficiente de uma condição final. De fato, para jogar golfe no código, fazia sentido fazer quase tudo ao contrário!
:Offsets
é um bloco de quatro valores de bytes que eu uso como deslocamento para o padrão de cada bloco. O programa descobre qual bloco executar e se altera para pular para o código certo. Estranhamente, isso parece usar menos bytes do que verificando diretamente!:DATA
(também chamado de dados mágicos nos comentários!) é a ordem codificada na qual os blocos precisam ser renderizados. Existem 16 valores, normalmente exigindo 16 bytes, mas como cada valor tem apenas 2 bits, pude colocar 4 em um byte, economizando 12 bytes! O código para armazenar, restaurar e decodificar esses valores é de 6 bytes. Além disso, ao evitar usar o número 0 nos 2 bits mais altos, eu consegui dobrar isso como um contador, economizando pelo menos 3 bytes (2 para inicializar, 1 para decrementar)! Total de bytes salvos: 12 - 6 + 3 = 9.Os dados de deslocamento devem ser armazenados em um local que termina em 00 hexadecimal para funcionar corretamente. Eu escolhi o & 8000, pois parecia uma boa localização fora do caminho. Isso significa que o programa inicia em & 8008. Coincidentemente, a Intel produziu um CPU inicial chamado 8008, que poderia ser considerado o avô do Z80! A Intel também produziu o 8080, no qual o Zilog baseou o Z80, sendo totalmente compatível. O Z80 possui uma gama de instruções estendidas que o 8080 não possui. Evitei usar essas instruções estendidas, pois cada uma possui um prefixo de um byte, o que significa que esse programa também produzirá os mesmos resultados no 8080!
Como o padrão para o Bloco 3 é todo o "1" s, eu o integrei no loop principal, e é por isso que ele tem um deslocamento de 00. Isso economiza 2 bytes por não ter que retornar do Bloco 3! Felizmente, consegui encaixar os locais de partida dos quatro blocos em menos de 128 bytes. Isso é bom porque o intervalo de um salto relativo é de -128 a 127 a partir da posição atual, calculada após a leitura do byte de deslocamento. Ou seja, uma
JR
instrução lê dois bytes e depois executa o cálculo.JR 00
faz nada.JR 01
pula um byte.JR FF
volta em um byte, fazendo com que a próxima instrução seja o deslocamento do queJR
acabou de ser executado, o que é muito ruim, porque a instruçãoFF
não é para quem tem pouco coração!JR FE
volta em dois bytes, causando um loop infinito, etc. No entanto, o retorno do bloco 0 é muito longe (inferior a -128), então simplesmente pulo de volta para um bloco anterior, que salta novamente!Certamente há espaço para jogar isso um pouco mais. Minha primeira versão totalmente funcional foi de 239 bytes. É possível salvar 4 bytes removendo a seção "Extra-1s" à custa de 48 erros e outros 12 bytes podem ser salvos removendo a seção "Jaggies" à custa de 32 erros.
fonte
Haskell,
201190 bytes, 44 errosUsa uma matriz de funções para cada forma diferente:
a
(diamante);u
,d
,l
,r
(Triângulos voltados para cada direcção) ew
(branco), e aplica-se cada um para uma grelha 25x25 com coordenadas[-12..12]
. As formas de diamante e triângulo são calculadas usando a norma de Manhattan, semelhante à solução Octave da flawr .Na verdade, apenas gerar a metade superior, que necessita apenas
a
,w
,d
, er
. Produza a metade inferior através do espelhamento (map reverse . reverse
).fonte
flip
realmente executa uma rotação geométrica aqui._
nomapM_
. Além disso, se você remover a definiçãol
e substituir a matriz por:,[[a,r,d,a],[r,w,w,d],[u,w,w,flip u],[a,u,u,a]]
poderá salvar alguns bytes e adicionar alguns erros.abs j+i+1<13
é apenasabs j+i<12
C # - 423 bytes, 237 erros
Apenas acumulando desigualdades. A maioria dos erros ocorre devido à substituição de t (= 25) em locais que deveriam estar usando 24.
Aqui está uma tentativa de visualizar como funciona:
Código mais legível:
Provavelmente poderia jogar um pouco de parênteses e operadores lógicos, mas estou recebendo flashbacks do Lisp.
fonte
Perl
186184181151147 bytes, 0 errosO código é
quase tão simples quanto a imagem! Eu poderia reduzi-lo em mais dois bytes fazendo com que o padrão iniciasse com uma nova linha, em vez de terminar com ela, mas tecnicamente ele não é validado sem erros.chegando ao ponto em que estou tendo dificuldades para entender!fonte
x/99$/
.JavaScript (ES6), 239 bytes, 99 diferentes
Isso usa desigualdades para gerar as formas para um quadrante, e o restante do código gira para preencher os outros.
O texto era justo
JavaScript
. Este é um identicon bem simples:Use o trecho de código abaixo para verificar, pois ele usa JavaScript e saídas mais suportados em uma fonte monoespaçada. Você provavelmente terá que clicar em "Página inteira" para ver tudo.
Mostrar snippet de código
fonte
Python 3,
975963 bytesA sequência impressa está
"Python"
em 975 bytes com 30 erros.Para
"Python 3"
eu useiQue iria trazê-lo até 1104 bytes com 124 erros, mas eu acho que vou ficar com apenas
"Python"
a menos que solicitado pelo OP.fonte
J=''.join
e salvar 12 caracteres no lambda.map
; 2) salve alguns bytes definindoR=lambda x:L(Z(*x[::-1]))
; 3) não precisa de espaços depois de fechar parênteses.HTML -
223210193191 bytes, 0 errosHTML 100% válido. Tanto o HTML quanto o JavaScript são bastante detalhados, portanto, apesar da simplicidade do identicon, o código ainda é muito longo.
fonte
document.write()
pordocument.write(c?2-c/2:+(Math.abs(i)+Math.abs(j)<14)),++x);
. Além disso, se você clicar no ícone com<>
, poderá criar um snippet de pilha para mostrar seu código.<!DOCTYPE html><title>A</title><script>for(W=document.write,y=0,A=25;b=y/A&3,j=y%A-12,y<100;W('<br>'),++y)for(x=0;a=x/A&3,c=a*(3-a)+b*(3-b),i=x%A-12,x<100;W(c?2-c/2:+(Math.abs(i)+Math.abs(j)<14)),++x);</script>
.<p style=font-size:25px>◆■■◆<br>■ ■<br>■ ■<br>◆■■◆</p>
PowerShell 2.0,
448399392374349 bytes, 49 errosisto é apenas imprimir uma linha de cada vez, com algumas meta-substituições / expressões sofisticadas para jogar golfe
ungolfed:
é para isso que finalmente é canalizado
iex
:e este que tem 471 bytes, 104 erros, que usa lógica de rotação
(relativamente) ungolfed:
fonte
Python 2,
712711bytesEste programa gera a matriz de bits para 'Python' usando codificação de comprimento de execução e armazenando execuções como caracteres.
Antes do jogador de golfe, ele parecia (bem parecido!):
Este método RLE deve resultar em zero erros.
A matriz de identicon para 'python' parece muito mais fácil, mas pensei que seria trapaça se eu usasse isso.
fonte
in
ezip
. Parece ter perdido o espaço entre35
e nofor
entanto.35 for
seqüências de tipos (cuidado para manter o espaço se o seguinte identificador começar com ume
!). Obrigado pelo teu conselho.e
. Talvez tente atualizar e testar? (para referência que tentei em 2.7.9)IDL, 472 bytes, 290 erros
Ugh. Isso seria muito mais curto se eu pudesse armazenar funções como variáveis ou fazer várias substituições de sequência de uma só vez, etc.
fonte
PHP -
417414413410 bytes, 0 erros, (20 avisos!)Requer PHP> = 5.4.
O PHP permite que suas palavras-chave sejam qualquer caso, então usei maiúsculas para palavras-chave e minúsculas para variáveis dentro do código golfed.
preg_replace
é usado apenas para remover o código eeval
executá-lo. Eu removi$
de todas as variáveis e as reinseri com um regex. Eu também alterei cada instância de&&
e||
para&
e|
e as dobro com uma expressão regular. Não posso fazer o mesmo truque++
porque também uso+
que não quero dobrar. Eu tentei reverter a lógica para me livrar do-
pouco depois,echo
mas isso mudou muitos99
s para100
s. No entanto, consegui evitar o uso de um único espaço!Consegui aplicar a sugestão de Ismael Miguel ao outro conjunto de
{}
chaves para ofor
loop também; no entanto, tive que usar emprint
vez deecho
.print
eecho
são ambas construções de linguagem (palavras-chave "mágicas" que não precisam de parênteses()
) e, portanto, não são permitidas em umafor
declaração. No entanto, comoprint
tem um valor de retorno como uma função, é permitido dentro dofor
. Ao mover as atribuições de variáveis da terceira para a segunda seção, também pude eliminar os avisos!fonte
\r\n
terminações de linha, mas mudei para apenas\n
para salvar o byte, como você sugeriu.Pip , 116 bytes (96 erros)
As novas linhas são apenas para fins de formatação e não têm efeito no código:
Um pouco desinteressado com comentários:
O código cria o identicon como uma lista de seqüências de caracteres. Depois que você souber que
X
é a multiplicação de cadeias,RL
é repetir lista,AL
anexar lista eJ
ingressar, é bastante legível (IMHO). As variáveisb
,t
ew
(na versão não destruída) correspondem às seguintes partes do identicon:O quadrante superior esquerdo é organizado da seguinte forma:
Wt
tb
onde
W
representa 13 linhas deb
colocadas em cima dew
. Em seguida, giramos e invertemos para obter o restante da figura.Os erros resultam de como geramos os triângulos brancos finos (segunda peça acima). Eles não são exatamente do mesmo tamanho - um tem números ímpares de pixels brancos e o outro tem números pares -, mas tratá-los como sendo iguais (sem a linha superior do inferior, para total de 25 linhas) economiza alguns bytes. Aqui está uma versão de 122 bytes que executa as etapas pares ímpares corretamente (0 erros):
E, apenas por diversão, uma tradução em Python do original (sem golf):
fonte
Ruby, 324 bytes, 216 erros
O Identicon usa a string
Ruby
, e eu meio que gosto. Geometria pura + simetria. Equações de aresta para o triângulo, rotação de 45 ゜ para os retângulos para torná-los alinhados ao eixo. Cerca de 100 erros foram sacrificados por alguns bytes a menos.fonte
/// , 1319 bytes, 0 erros
Experimente online!
Demorei cerca de duas horas para fazer, porque eu estava substituindo manualmente as coisas. A maior coisa que fiz em ///.
Provavelmente posso jogar mais alguns bytes.
Veja também a resposta de Erik, o jogador de golfe, em /// (4 bytes mais curto que o meu).
fonte
Fortran, 214 bytes, 200 erros
O Fortran pode não ser a primeira escolha para o código de golfe, mas seu identício parecia tão simples que eu pensei em tentar. Na verdade, não posso competir com algumas das linguagens terser, mas usar variáveis implícitas e outras gentilezas (por exemplo,
-
dobra comoxor
), não é tão ruim - reduzi-o para 214 bytes:Nota: Isso não funcionará com
gfortran
. Ele compilaifort
se você der uma.f90
extensão ao arquivo (isso ativa a fonte de forma livre).fonte
Perl -
3244318816091387 bytes,0136678 errosDemorei um pouco para perceber, mas o ícone é simétrico. Além disso, posso imprimir uma nova linha após cada 100 caracteres, em vez de codificá-la.
Gera o texto para isso:
fonte
$n=0
nemint()
;if($n>=100){print"\n";$n=0}
→$n>99and$n=!print"\n"
;@p
pode ser substituído por/(.*);(.*)/;$n+=$2;print$1x$2
./// , 1315 bytes, 0 erros
Experimente online!
Este é o identicon para
///
. É possivelmente a maior coisa que eu já fiz em ///!fonte
IDL 8.4, 333 bytes, 105 erros
Isso deu um identificador diferente, e eu fui capaz de jogar muito mais usando um método totalmente diferente.
Primeiro, converta os caracteres na linha 1 em valores de bytes e subtraia 64 (para que A = 1, B = 2, etc.). Em seguida, cole esses 1s e 0s consecutivos em uma matriz e altere-a para 50x50 (ou seja, o quadrante superior esquerdo, mas transposto). Em seguida, transponha e gire 4 vezes, junte-as e imprima-as.
fonte
Bubblegum, 535 bytes, 0 erros
Comprimido usando zopfli (
--deflate --i10000
). Experimente online.Bastante direto; Talvez eu experimente adicionar alguns erros mais tarde.
fonte
ForceLang,
274924992495 bytesNão-competitivo, o idioma adia a pergunta.
fonte