Les identicons sont de petites images de motifs géométriques représentant la valeur de hachage d'une chaîne. Stack Exchange utilise les identicons de Gravatar comme image d’avatar par défaut de chaque utilisateur.
Dans ce défi, nous utiliserons également les identicons Gravatar pour générer du texte au golf.
Défi
Cet extrait de pile (une version simplifiée de ce JSFiddle ) vous permet de saisir une chaîne et renvoie une version noir et blanc de 100 × 100 pixels de l'identicon de cette chaîne, ainsi qu'une version textuelle indiquant le 1
noir et le 0
blanc:
<!-- 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>
(Il vous permet également de charger les styles Monster, Wavatar et Retro Gravatar, mais ceux-ci sont juste pour le plaisir et ne sont pas destinés à être utilisés pour ce défi. Unicornicons manque malheureusement à cause des contraintes XSS .: /)
Votre tâche consiste à écrire un programme qui génère le bloc de texte de 100 × 100 caractères de 0
'et 1
' qui est généré lorsque vous insérez le nom de votre langage de programmation dans la zone de saisie du code.
Par exemple, si votre soumission est écrite en Python , vous devez taper Python
dans le fragment de pile et voir que
est l'identicon pour Python, et
est la version noir et blanc (binaire), et
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
est la sortie textuelle correspondante que votre programme Python doit produire.
Cependant, étant donné que les identicons peuvent avoir de nombreux angles délicats et que leur tramage en tant qu’image en noir et blanc peut laisser des chanes , votre sortie est autorisée à avoir jusqu’à 300 caractères 0
ou 1
opposés à ce qu’ils sont supposés être. (Cela représente 3% du total des 10000 0
et 1
des.)
Près du bas de l'extrait, vous pouvez coller dans la sortie de votre programme et de vérifier combien de 0
« s ou 1
d » sont différents de ce qu'ils devraient être. N'importe quel nombre de différences inférieures ou égales à 300 est valide.
Notation
La soumission avec le moins d'octets gagne. ( Compteur d'octets pratique. )
Tiebreaker va à la soumission avec le moins de faux 0
et de mauvais 1
.
S'il y a toujours égalité, la soumission précédente l'emporte.
Détails
- La sortie passe à stdout ou à une alternative similaire si votre langue n’a pas stdout.
- La sortie peut éventuellement avoir une fin de ligne.
- S'il vous plaît inclure l'image identicon couleur dans votre message avec la chaîne exacte qui le génère. Il n'est pas nécessaire de perdre de l'espace et de publier l'intégralité de votre sortie textuelle.
- Votre programme devrait fonctionner sans connexion Internet. Vous devez générer le texte dans votre code et non l'interroger à partir du site Gravatar.
- Utilisez votre bon sens pour "nommer" votre langue. Utilisez le nom de langue que vous utiliseriez normalement sur ce site. Ne soyez pas ennuyeux et trouvez un nom qui facilite l’identicon au golf. Par exemple,
Python 2
convient à Python, mais l’python 2.7.2
étire etpython 2.7.2 by Guido van Rossum
serait ridicule. - Je me rends compte que certaines langues sont intrinsèquement plus faciles que d'autres parce que leurs formes d'identicon sont plus simples. C'est comme ça que ça va être, ne soyez pas trop mécontents ou compétitifs à ce sujet. ;)
la source
Réponses:
CJam,
92817971 octets, 120 erreursIl y a probablement encore de la place pour jouer au golf.
Testez-le ici.
Explication
Je n'utilise aucune compression, mais au lieu de cela, je calcule les carreaux individuels et assemble le résultat à partir de ceux-ci. La tuile en haut à gauche est intentionnellement approchée. Quelques autres erreurs résultent du fait que l'image binarisée n'est pas complètement symétrique en rotation. Passons en revue le code.
La première tuile devrait théoriquement ressembler à ceci:
C'est 12 lignes, puis 13 lignes du point entre
1
s et0
s diminuant de 2 à la fois. Notez que le premier bloc a un nombre pair de0
s et le second bloc un nombre impair. Nous pouvons rendre le motif encore plus régulier si nous sacrifions la précision de la rangée du milieu et la transformons en1
suivi de 240
s. Ensuite, nous avons en fait une ligne pour chaque nombre de zéros compris entre 0 et 24, en alternant les parties supérieure et inférieure. Nous pouvons donc simplement les générer dans l’ordre (sous la forme d’un seul triangle), puis tirer toutes les autres lignes:La prochaine étape est ce triangle fantaisie à droite de cette tuile:
Si l' on considère un système de coordonnées avec l' origine dans le coin supérieur droit et
x
aller à droite ety
aller vers le bas, puis la région1
s satisfait 3: inégalitésx/y ≥ 1/2
,x/y ≥ 2
,x + y < 38
. Nous pouvons simplement les calculer séparément et prendre la fin logique. Cela ne sauvegarde aucun caractère mais nettoie légèrement le code si nous combinons les deux premières inégalités:En fin de compte, nous allons économiser un autre octet en vérifiant le contraire et en utilisant
xor
plutôt que deand
combiner le résultat avec l'autre inégalité:Nous avons tout en place maintenant - les tuiles restantes ne sont que des copies et des rotations de celles-ci, ainsi que la tuile solide (ennuyeuse) au centre. Alors, rassemblons tout:
À la fin du programme, CJam imprime simplement le contenu de la pile, créant le résultat souhaité.
la source
Octave
166164 octets, 0 erreursOctave a une grande force dans les matrices de manipulation / construction. Pour les "diamants", j'ai créé un système de coordonnées xy et utilisé la norme manhattan pour décider si les entrées devaient être 1 ou 0. Comme les diamants ne sont pas complètement symétriques, j'ai dû bricoler avec la "distance" et le centre. avec le point central (13.1, 13.1), cela fonctionnait pour les deux types de formes en «diamant».
Après cela, je pourrais simplement régler le quart de ceux-ci à zéro afin d'obtenir ces formes en C. Les carrés et la concaténation de la matrice étaient faciles.
Nouvelle version -2 caractères (fonctionne de la même manière que l'ancienne, mais j'ai quand même réussi à abuser un peu plus de la syntaxe Octave:
Ancienne version:
Sortie
la source
Brainfuck
94182237 octets, 88 erreursEdit: Comme le fait remarquer mbomb007, le nom "officiel" ne semble pas être mis en majuscule, ceci n'est pas mentionné sur wikipedia, mais sur esolangs . Cela me gêne, mais pas assez pour refaire ça;).
Mon premier programme Brainfuck!
Maintenant utilise réellement les mathématiques et la logique et des trucs! (pour chaque pixel, il choisit 0 ou 1 en fonction de quelques conditions). C'était très amusant à faire. Cela étant dit, je ne pense pas que je vais coder à nouveau avec Brainfuck pendant très longtemps .
produire le bitmap de l'image:
Une version avec quelques commentaires (pourrait ne pas être très utile car ils étaient principalement pour mon propre bénéfice):
la source
Python,
294273239188179170 170159154 octetsVoici la version de 158 octets :
Ceci est un programme uniquement Python 2, mais j'utilise l'identicon pour "Python" (c'est-à-dire celui de l'OP). Le diff devrait être 78 bits.
En jetant de la précision par la porte, voici la version à 154 octets :
qui a un diff de 224 bits à la place.
(-4 octets grâce à Stefan Pochmann)
Explication
Voici une autre version développée:
Pour cette version, nous traitons l'identicon comme une grille de motifs 4x4. Nous commençons avec une grille de 100x100 de 0 et faisons les quatre fois suivantes:
La version d'origine est similaire, mais au lieu de tourner une fois les trois modèles terminés, nous effectuons une rotation à chaque fois que nous modifions une seule cellule . Cela fait que le programme prenne quelques secondes, mais la sortie est la même.
la source
J
etr
sur une ligne en utilisant un point-virgule.~i%12<j/2>i%12
est 3 plus courte queabs(i%12-6)+5<j/2
mais conduit à 224 diff je pense.C,
255245237234 octetsL'identicon de C est vraiment symétrique.
Golfé: (nouvelles lignes ajoutées pour "lisibilité")
Ceci stocke la moitié de chaque ligne dans la moitié supérieure dans un entier de 64 bits, puis imprime deux fois les 50 bits inférieurs de l'entier approprié en binaire, la seconde impression étant inversée.
64 bits ints sont nécessaires pour que cela fonctionner (si votre système n'utilise pas ints 64 bits, vous pouvez ajouter
long
oulong long
avantd[50]
, et(long)
ou(long long)
aprèso[i-1]=i<26?
).Ungolfed et commenté:
La sortie a 291 erreurs.
Merci à ace pour le conseil d'utiliser
puts("")
la source
putchar(10)
parputs("")
pour sauvegarder 3 octets.C,
224206200176 octets, 243 erreursPour répliquer:
Le code ci-dessus génère des données binaires qui correspondent à cette image, avec 243 erreurs:
D'après ce que je peux dire, j'utilise une méthode assez différente de celle de la solution es1024. Cette méthode peut probablement être utilisée davantage, alors je vais m'arrêter un peu sur l'explication, mais la voici dans toute sa splendeur:
Il utilise essentiellement un ensemble d'inégalités pour définir les polygones et s'appuie fortement sur la symétrie.
Il est actuellement minuit et ma capacité à lire mon propre code se détériore rapidement. Vous pouvez probablement jouer avec certaines constantes pour réduire les erreurs, mais je ne peux que systématiquement tout casser.
Fait amusant, non seulement c'est la version la plus courte que j'ai proposée, mais gcc ne lance aucun avertissement !
la source
for
boucle externe defor(;i+1;i+=k=i-50?puts(b),k:-1)
manière à réduire le point-virgule et les deux accolades, en économisant 3 octets.k=1
surmain(k)
pour économiser 3 octets.gs2 : 72 octets, 200 erreurs
Je n'ai pas encore vraiment joué au golf, pas sûr de pouvoir le faire. Mnémotechnique:
Le programme lui-même:
la source
Z80, 194 octets, 0 erreurs
Z80, 178 octets, 80 erreurs
Les erreurs sont surlignées en vert.
Comme il s'agit d'un processeur old-school, j'ai utilisé des conventions old-school. J'ai utilisé & 8000 pour les valeurs hexadécimales au lieu du 0x8000 plus familier et j'ai choisi de terminer chaque ligne du motif par un "\ r" au lieu d'un "\ n".
Code source codé HEX
Code source expliqué
Le Z80 étant un processeur, il ne possède pas de sortie standard. En tant que tel, j’ai simplement écrit chaque caractère directement dans la mémoire, en partant de & 4000, puis MEMDUMP a utilisé les 10 100 octets pour vérifier le bon motif.
Le Z80 a des registres comme suit:
Le registre de drapeau spécial contient les drapeaux suivants:
SZ-H-VNC
. S ign, Z ero, H alf transporter, O v erflow (également utilisé en tant que P arité), N egative et C arry. Les positions marquées par-
sont inutilisées. Les indicateurs H alf-carry et N egative ne sont utilisés qu'en interne par la CPU. S ign et O v erflow / P arité prennent octets supplémentaires à utiliser si je n'utilise Z ero et C Arry qui se régler ou réinitialiser après chaque calcul, mais pas lors du déplacement autour de valeurs.Il existe d'autres registres disponibles mais ils ne sont pas pertinents pour un défi de golf car ils utilisent des octets supplémentaires à utiliser.
LD
l oa d est une valeur dans un registre ou une adresse, par exemple ,LD C, 4
estC = 4
. La valeur peut être directe (un ou deux octets supplémentaires pour une valeur de 8 bits ou de 16 bits, respectivement) ou peut être copiée à partir d'un autre registre. Une valeur de(HL)
moyen copie vers ou depuis l'adresse indiquée parHL
.PUSH
etPOP
pousser (sauf dans) et pop (restaurer à partir de ) la pile, qui ne peut stocker des valeurs 16 bits. En tant que tel, ilAF
est traité comme un seul registre à 16 bits, même si aucune autre instruction ne l’utilise comme ça.AND
est bitwise et . Le Z80 n'a pas d'instructions logiques booléennes, mais possède des drapeaux booléens.JR
j UMP r élatif l' aide d' un unique octet signé décalé. Celui - ci utilise un octet inférieur à l'absolu j um pJP
, mais a moins de conditions qui peuvent être testées pour.INC
etDEC
augmenter et diminuer les registres à 8 et 16 bits.DJNZ
d Ecrement et j UMP si n ON- z ero. Cela fait exactement la même chose queDEC B; JR NZ, ##;
dans un octet en moins mais n’est disponible que pour leB
registre.RET
renvoyer les urnes au lieu d’appel. Il peut éventuellement avoir des conditions.ADD
etSUB
ajouter à et sous- tract duA
registre 8 bits ou duHL
registre 16 bits .CP
c om p soustrait la valeur duA
registre, définit les indicateurs comme il convient, mais supprime le résultat sansA
modification.RRCA
r Otate r roite c ircular un ccumulator. Fait pivoter tous les bitsA
une fois vers la droite, en copiant le bit 0 dans le bit 7. Il copie également le bit 0 dans l'C
indicateur Carry ( ), pour ne pas le confondre avec leC
registre.Chaque motif Identicon peut être décomposé de la manière suivante:
où 0 à 3 sont les angles, pivotés selon le cas, 4-7, les pavés latéraux et le cas échéant, et 8 est le pavé central qui est (pour autant que je sache) toujours symétrique en rotation.
Heureusement, le Z80 Identicon peut être simplifié pour:
Je mets les "0" au centre pour me permettre de vérifier efficacement une condition de fin. En fait, pour jouer au code, il était logique de faire presque tout à l’arrière!
:Offsets
est un bloc de quatre octets que j'utilise comme décalage du motif pour chaque bloc. Le programme détermine le bloc à exécuter, puis se modifie pour passer au bon code. Bizarrement, cela semble utiliser moins d'octets qu'en vérifiant directement!:DATA
(également appelées données magiques dans les commentaires!) est l’ordre codé dans lequel les blocs doivent être restitués. Il y a 16 valeurs, nécessitant normalement 16 octets, mais comme chaque valeur ne fait que 2 bits de long, j'ai pu en mettre 4 dans un octet, économisant ainsi 12 octets! Le code pour stocker, restaurer et décoder ces valeurs est de 6 octets. De plus, en évitant d’utiliser le nombre 0 dans les 2 bits les plus élevés, j’ai pu le doubler en tant que compteur, en économisant au moins 3 octets (2 pour initialiser, 1 pour diminuer)! Nombre total d'octets enregistrés: 12 - 6 + 3 = 9.Les données de décalage doivent être stockées dans un emplacement se terminant par 00 hex pour fonctionner correctement. J'ai choisi & 8000 car cela semblait être un bon emplacement, loin des sentiers battus. Cela signifie que le programme commence à & 8008. Par coïncidence, Intel a produit un ancien processeur appelé le 8008, qui pourrait être considéré comme le grand-père du Z80! Intel a également produit le 8080, sur lequel Zilog a basé son Z80, étant entièrement compatible. Le Z80 dispose d'une gamme d'instructions étendues que le 8080 ne propose pas. J'ai évité d'utiliser ces instructions étendues car chacune d'entre elles a un préfixe d'un octet, ce qui signifie que ce programme produira également les mêmes résultats sur le 8080!
Comme le motif du bloc 3 est composé de "1", je l’ai incorporé dans la boucle principale. C’est pourquoi il a un décalage de 00. Cela évite 2 octets en évitant de revenir du bloc 3! Heureusement, j'ai pu adapter les emplacements de départ des quatre blocs en moins de 128 octets. Cela est utile car la plage d'un saut relatif est comprise entre -128 et 127 de la position actuelle, calculée après lecture de l'octet de décalage. Par exemple, une
JR
instruction lit deux octets puis effectue le calcul.JR 00
ne fait rien.JR 01
saute un octet.JR FF
revient en arrière d’un octet, ce qui fait que l’instruction suivante est le décalage de l’JR
exécutant qui vient d’être exécuté, ce qui est vraiment mauvais car l’instructionFF
n’est pas faite pour les âmes sensibles!JR FE
revient en arrière de deux octets, provoquant une boucle infinie, etc. Cependant, le retour du bloc-0 est trop éloigné (inférieur à -128), je retourne donc simplement dans un bloc précédent, qui saute à nouveau!Il y a certainement de la place pour jouer au golf un peu plus loin. Ma première version entièrement fonctionnelle était de 239 octets. Vous pouvez enregistrer 4 octets en supprimant la section "Extra-1s" aux dépens de 48 erreurs et vous pouvez enregistrer 12 octets supplémentaires en supprimant la section "Jaggies" au détriment de 32 erreurs.
la source
Haskell,
201190 octets, 44 erreursUtilise une matrice de fonctions pour chaque forme différente:
a
(losange);u
,d
,l
,r
(Triangles faisant face direction) etw
(blanc), et applique chacun à une grille de 25x25 avec des coordonnées[-12..12]
. Les formes de losanges et de triangles sont calculées selon la norme de Manhattan, similaire à la solution Octave de flawr .En fait , seulement générer la moitié supérieure, qui n'a besoin que
a
,w
,d
etr
. Produisez la moitié inférieure par symétrie (map reverse . reverse
).la source
flip
effectue réellement une rotation géométrique ici._
dansmapM_
. En outre, si vous supprimez la définition del
et remplacez la matrice par:,[[a,r,d,a],[r,w,w,d],[u,w,w,flip u],[a,u,u,a]]
vous pouvez enregistrer quelques octets et ajouter quelques erreurs.abs j+i+1<13
est justeabs j+i<12
C # - 423 octets, 237 erreurs
Juste accumuler des inégalités. La plupart des erreurs sont dues à ma substitution de t (= 25) dans des endroits qui devraient utiliser 24.
Voici une tentative pour visualiser comment cela fonctionne:
Code plus lisible:
Peut-être que les parens et les opérateurs logiques pourraient jouer au golf, mais je reçois des flashbacks Lisp.
la source
Perl
186184181151147 octets, 0 erreursLe code est
presque aussi simple que l'image! Je pourrais le réduire de deux octets supplémentaires en faisant commencer le motif par une nouvelle ligne au lieu de le terminer, mais techniquement, il ne valide pas sans erreurs.arriver au point où j'ai du mal à le comprendre!la source
x/99$/
.JavaScript (ES6), 239 octets, 99 différents
Cela utilise des inégalités pour générer les formes pour un quadrant et le reste du code fait pivoter celle-ci pour remplir les autres.
Le texte était juste
JavaScript
. C'est un identicon assez simple:Utilisez l'extrait de code ci-dessous pour vérifier, car il utilise un code JavaScript mieux pris en charge et des sorties dans une police monospace. Vous devrez probablement cliquer sur "Pleine page" pour tout voir.
Afficher l'extrait de code
la source
Python 3,
975963 octetsLa chaîne imprimée est
"Python"
à 975 octets avec 30 erreurs.Pour
"Python 3"
j'ai utiliséCe qui porterait à 1104 octets avec 124 erreurs, mais je pense que je vais m'en tenir à tout
"Python"
sauf si demandé par OP.la source
J=''.join
et sauvegarder 12 caractères sur le lambda.map
; 2) économiser quelques octets en définissantR=lambda x:L(Z(*x[::-1]))
; 3) ne pas besoin d'espaces après la fermeture des parenthèses.HTML -
223210193191 octets, 0 erreursHTML valide à 100%. Le HTML et le JavaScript sont assez verbeux, donc malgré la simplicité de l'identicon, le code reste très long.
la source
document.write()
pardocument.write(c?2-c/2:+(Math.abs(i)+Math.abs(j)<14)),++x);
. De plus, si vous cliquez sur l'icône avec<>
, vous pouvez créer un stacksnippet pour présenter votre code.<!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 octets, 49 erreursil s’agit simplement d’imprimer une ligne à la fois, avec quelques méta-remplacements / expressions sophistiqués pour le golf
ungolfed:
c'est ce qui finit par être canalisé vers
iex
:et celui-ci qui est 471 octets, 104 erreurs, qui utilise la logique de rotation
(relativement) non-golfé:
la source
Python 2,
712711 octetsCe programme génère le tableau de bits pour 'Python' en utilisant un codage de longueur d'exécution et en stockant les exécutions sous forme de caractères.
Avant l'auto-golfeur, il ressemblait (assez semblable!) À:
Cette méthode RLE ne devrait générer aucune erreur.
Le tableau identicon pour 'python' semble beaucoup plus facile, mais je pensais que ce serait tricher si je l'utilisais.
la source
in
etzip
. Il semble avoir manqué l'espace entre35
etfor
bien.35 for
séquences de types (en prenant soin de conserver l'espace si l'identifiant suivant commence par une
!). Merci pour vos conseils.e
. Peut-être essayer de mettre à jour et de tester? (pour référence j'ai essayé sur 2.7.9)IDL, 472 octets, 290 erreurs
Pouah. Ce serait beaucoup plus court si je pouvais stocker des fonctions en tant que variables, ou faire plusieurs remplacements de chaînes à la fois, etc.
la source
PHP -
417414413410 octets, 0 erreurs, (20 avertissements!)Nécessite PHP> = 5.4.
PHP autorise ses mots-clés dans tous les cas, j'ai donc utilisé des majuscules pour les mots-clés et des minuscules pour les variables dans le code mis en jeu.
preg_replace
est uniquement utilisé pour déverrouiller le code et l’eval
exécuter. J'ai enlevé$
toutes les variables et les ai réinsérées avec une regex. J'ai également changé chaque instance de&&
et||
à&
et|
et les doublé avec une regex. Je ne peux pas faire le même tour++
parce que j'utilise aussi ce+
que je ne veux pas doubler. J'ai essayé d'inverser la logique pour me débarrasser de-
juste après,echo
mais cela a transformé trop de99
s en100
s. Cependant, j'ai réussi à éviter d'utiliser un seul espace!J'ai pu appliquer la suggestion d' Ismael Miguel à l'autre ensemble d'
{}
accolades pour lafor
boucle également, mais je devais utiliser à laprint
placeecho
.print
etecho
sont tous deux des constructions de langage (mots clés "magiques" qui n'ont pas besoin de parenthèses()
) et ne sont donc pas autorisés dans unefor
déclaration. Cependant, comme la fonctionprint
a une valeur de retour, elle est autorisée à l'intérieur du fichierfor
. En déplaçant les affectations variables de la troisième à la deuxième section, j'ai également pu éliminer les avertissements!la source
\r\n
fins de ligne, mais je l'ai modifié afin\n
de sauvegarder le seul octet que vous avez suggéré.Pip , 116 octets (96 erreurs)
Les nouvelles lignes servent uniquement à la mise en forme et n'ont aucun effet sur le code:
Légèrement pas golfé avec des commentaires:
Le code construit l'identicon sous la forme d'une liste de chaînes. Une fois que vous savez qu'il
X
s'agit d'une multiplication de chaîne, d'uneRL
liste répétée, d'une listeAL
annexée et d'uneJ
jointure, la lecture est assez lisible (IMHO). Les variablesb
,t
etw
(dans la version non-golfée) correspondent aux parties suivantes de l'identicon:Le quadrant supérieur gauche est composé comme suit:
Wt
tb
où
W
représente 13 lignes deb
placé au-dessus dew
. Nous tournons et inversons ensuite pour obtenir le reste de la figure.Les erreurs résultent de la façon dont nous générons les triangles blancs maigres (deuxième pièce ci-dessus). Ils ne sont pas exactement de la même taille - l’un a des nombres impairs de pixels blancs et l’autre des nombres pairs - mais les traiter comme étant identiques (sans la rangée supérieure de celle du bas, pour un total de 25 rangées) enregistre quelques octets. Voici une version de 122 octets qui gère correctement les marches impaires (0 erreurs):
Et, juste pour le plaisir, une traduction en Python de l'original (non joué au golf):
la source
Ruby, 324 octets, 216 erreurs
Identicon utilise la chaîne
Ruby
et je l'aime bien. Géométrie pure + symétrie. Équations de bord pour le triangle, rotation de 45 pour que les rectangles soient alignés. Environ 100 erreurs ont été sacrifiées pour quelques octets de moins.la source
/// , 1319 octets, 0 erreurs
Essayez-le en ligne!
Cela m'a pris environ 2 heures à faire, car je remplaçais manuellement les choses. La plus grande chose que j'ai faite à ///.
Je peux probablement jouer au golf quelques octets de plus.
En outre, voir Erik la réponse du golfeur dans /// (4 octets plus court que le mien).
la source
Fortran, 214 octets, 200 erreurs
Fortran n'est peut-être pas le premier choix pour le golf de code, mais son identicon semblait si simple que je pensais pouvoir l'essayer. En fait, je ne peux pas rivaliser avec certains des langages spéculatifs, mais en utilisant des variables implicites et d'autres subtilités similaires (par exemple,
-
doubler commexor
), ce n'est pas si grave - je l'ai eu jusqu'à 214 octets:Note: Cela ne fonctionnera pas avec
gfortran
. Il compile avecifort
si vous donnez une.f90
extension au fichier (ceci active la source de formulaire libre).la source
Perl -
3244318816091387 octets,0136678 erreursIl m'a fallu un peu de temps pour le réaliser, mais l'icône est symétrique. De plus, je peux simplement imprimer une nouvelle ligne tous les 100 caractères plutôt que de la coder en dur.
Génère le texte pour cela:
la source
$n=0
niint()
;if($n>=100){print"\n";$n=0}
→$n>99and$n=!print"\n"
;@p
peut être remplacé par/(.*);(.*)/;$n+=$2;print$1x$2
./// , 1315 octets, 0 erreurs
Essayez-le en ligne!
C'est l'identicon pour
///
. C'est peut-être la plus grosse chose que j'ai jamais faite à ///!la source
IDL 8.4, 333 octets, 105 erreurs
Cela a donné un identicon différent, et j’ai pu jouer beaucoup plus au golf en utilisant une méthode totalement différente.
Commencez par convertir les caractères de la ligne 1 en valeurs d'octet et soustrayez 64 (de sorte que A = 1, B = 2, etc.). Ensuite, collez ces nombreux 1 et 0 consécutifs dans un tableau et reformez-le en 50x50 (c'est-à-dire le quadrant supérieur gauche, mais transposé). Ensuite, transposez-le et faites-le pivoter 4 fois, cousez-les et imprimez-les.
la source
Bubblegum, 535 octets, 0 erreurs
Compressé avec zopfli (
--deflate --i10000
). Essayez-le en ligne.Assez simple; Je pourrais essayer d'ajouter quelques erreurs plus tard.
la source
ForceLang,
274924992495 octetsNon compétitif, le langage postdate la question.
la source