Идентификаторы - это небольшие изображения геометрических узоров, которые представляют значение хеш-функции строки. Stack Exchange использует идентификаторы из Gravatar в качестве аватара каждого пользователя по умолчанию.
В этом соревновании мы также будем использовать идентификаторы Gravatar для создания текста для гольфа.
Вызов
Этот фрагмент стека (сокращенная версия этого JSFiddle ) позволяет вам вводить строку и возвращает черно-белую версию идентификатора этой строки размером 100 × 100 пикселей, а также текстовую версию, где 1
для черного и 0
для белого:
<!-- 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>
(Он также позволяет загружать стили Monster, Wavatar и Retro Gravatar, но они просто для развлечения и не предназначены для использования в этом испытании. К сожалению, Unicornicons отсутствуют из-за ограничений XSS .: /)
Ваша задача - написать программу, которая выводит текстовый блок размером 100 × 100 символов 0
«s» и 1
«s», который генерируется, когда вы вводите имя вашего языка программирования в поле ввода фрагмента.
Например, если ваша заявка написана на Python , вы должны ввести Python
фрагмент кода и увидеть, что
является идентичным для Python, и
это черно-белая (двоичная) версия, и
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
это соответствующий текстовый вывод, который должна создать ваша программа на Python.
Однако, поскольку у идентификаторов может быть много неловких углов, и их растеризация в виде черно-белого изображения может оставить неровности , ваш вывод может иметь до 300 0
-х или 2 1
-х, которые являются противоположностями того, чем они должны быть. (Это 3% от 10000 общего 0
«ы и 1
» с.)
В нижней части фрагмента вы можете вставить в вывод вашей программы и проверить, сколько 0
или 1
нет, чем они должны быть. Любое количество различий в пределах или ниже 300 действительно.
счет
Представление с наименьшим количеством байтов выигрывает. ( Удобный счетчик байтов. )
Tiebreaker переходит к представлению с наименьшим количеством неправильных 0
«и 1
».
Если есть еще связь, выигрывает более раннее представление.
подробности
- Вывод идет в стандартный вывод или подобную альтернативу, если ваш язык не имеет стандартного вывода.
- Выходные данные могут дополнительно иметь завершающий символ новой строки.
- Пожалуйста, включите цветное изображение в ваш пост вместе с точной строкой, которая его генерирует. Нет необходимости тратить пространство и публиковать весь текстовый вывод.
- Ваша программа должна работать без подключения к интернету. Вам нужно создать текст в своем коде, а не запрашивать его с сайта Gravatar.
- Используйте здравый смысл, когда называете свой язык. Используйте название языка, которое вы обычно используете на этом сайте. Не надо раздражать и придумать имя, которое делает игру в гольф легкой. Например,
Python 2
это хорошо для Python, ноpython 2.7.2
растягивает его иpython 2.7.2 by Guido van Rossum
было бы смешно. - Я понимаю, что некоторые языки по своей природе проще, чем другие, потому что их идентичные формы проще. Так оно и будет, не слишком обижайтесь и не соревнуйтесь об этом. ;)
источник
Ответы:
CJam,
92817971 байт, 120 ошибокВероятно, еще есть место для игры в гольф.
Проверьте это здесь.
объяснение
Я не использую какое-либо сжатие, но вместо этого я фактически вычисляю отдельные плитки и собираю результат из них. Верхний левый тайл намеренно аппроксимируется. Несколько других ошибок являются следствием того, что бинаризованное изображение не является полностью вращательно-симметричным. Давайте пройдемся по коду.
Первая плитка теоретически должна выглядеть так:
Это 12 линий, затем 13 линий точки между
1
s и0
s, уменьшающиеся на 2 за раз. Обратите внимание, что первый блок имеет четное число0
s, а второй блок нечетное число. Мы можем сделать шаблон еще более равномерным, если пожертвуем точностью в среднем ряду и включим1
240
с. Тогда у нас фактически есть одна строка для каждого числа нулей от 0 до 24, чередующихся между верхней и нижней частями. Таким образом, мы можем просто сгенерировать их по порядку (как один треугольник), а затем вытащить все остальные строки:Далее этот причудливый треугольник справа от этой плитки:
Если рассматривать систему координат с началом в верхнем правом углу и
x
идти направо иy
идти вниз, то область1
з удовлетворяет 3 неравенства:x/y ≥ 1/2
,x/y ≥ 2
,x + y < 38
. Мы можем просто вычислить их отдельно и принять логический конец. Он не сохраняет никаких символов, но немного очищает код, если мы объединяем первые два неравенства:В конечном итоге мы сохраним еще один байт, проверив обратное и используя
xor
вместо того,and
чтобы объединять результат с другим неравенством:Теперь у нас все есть - оставшиеся плитки - это просто копии и повороты, а также сплошная (скучная) плитка в центре. Итак, давайте соберем все вместе:
В конце программы CJam просто печатает содержимое стека вплотную, создавая желаемый результат.
источник
Октава
166164 байта, 0 ошибокOctave обладает отличной стойкостью в обработке / построении матриц. Для «алмазов» я создал систему координат xy и использовал манхэттенскую норму для определения, будут ли записи 1 или 0. Поскольку алмазы не являются полностью симметричными, мне пришлось возиться с «расстоянием» и центральной точкой, так что с центральной точкой (13.1,13.1) он работал для обоих видов «ромбовидных» форм.
После этого я мог просто установить четверть из них на ноль, чтобы получить эти C-формы. Квадраты и матричная конкатенация были просты.
Новые символы версии -2 (работают так же, как и старые, но мне удалось еще немного злоупотребить синтаксисом Octave:
Старая версия:
Выход
источник
Brainfuck
94182237 байт, 88 ошибокИзменить: Как mbomb007 указал, что «официальное» имя, кажется, не с большой буквы, это не упоминается в Википедии, но на esolangs . Это раздражает меня, но не достаточно, чтобы переделать это;).
Моя первая программа Brainfuck!
Теперь на самом деле использует математику, логику и прочее! (для каждого пикселя он принимает решение 0 или 1 в зависимости от нескольких условий). Это было довольно весело сделать; это, как говорится, я не думаю, что я собираюсь снова писать код с Brainfuck в течение длительного времени.
создание растрового изображения:
Версия с некоторыми комментариями (может быть не очень полезной, поскольку они были в основном для моей собственной выгоды):
источник
Python,
294273239188179170159154 байтаВот 158-байтовая версия:
Это только программа на Python 2, но я использую тождество для "Python" (то есть, в OP). Разница должна быть 78 бит.
Выбрасывая точность за дверь, вот 154-байтовая версия:
который имеет разность 224 бит вместо.
(-4 байта благодаря Стефану Похманну)
объяснение
Вот альтернативная расширенная версия:
Для этой версии мы рассматриваем тождество как сетку шаблонов 4х4. Мы начинаем с сетки 100x100, равной 0, и делаем следующее четыре раза:
Исходная версия похожа, но вместо того, чтобы вращаться после завершения трех шаблонов, мы вращаемся каждый раз, когда модифицируем одну ячейку . Это заставляет программу занимать несколько секунд, но вывод такой же.
источник
J
иr
в одну строку, используя точку с запятой.~i%12<j/2>i%12
на 3 короче,abs(i%12-6)+5<j/2
но ведет к 224 разн.C
255245237234 байтаИдентичность Си действительно симметрична.
Гольф: (добавлены новые строки для «читабельности»)
Это сохраняет половину каждой строки в верхней половине в 64-битное целое число, а затем печатает младшие 50 битов соответствующего целого числа в двоичном виде дважды, при этом вторая печать переворачивается.
64-разрядные Интсы необходимы для этого , чтобы работать (если система не использует 64-битный Интс, то вы можете добавить
long
илиlong long
до тогоd[50]
, и(long)
или(long long)
послеo[i-1]=i<26?
).Развернулся и прокомментировал:
Выход имеет 291 ошибку.
Спасибо асе за советы по использованию
puts("")
источник
putchar(10)
на,puts("")
чтобы сохранить 3 байта.C,
224206200176 байтов, 243 ошибкиКопировать:
Приведенный выше код выводит двоичный файл, который соответствует этому изображению, с 243 ошибками:
Из того, что я могу сказать, я использую довольно другой метод из решения es1024. Этот метод, вероятно, может быть усовершенствован, так что я немного задержусь на объяснениях, но здесь он в своем великолепном великолепии:
По существу, он использует набор неравенств для определения многоугольников и в значительной степени опирается на симметрию.
Сейчас полночь, и моя способность читать собственный код быстро ухудшается. Вероятно, вы можете поиграть с некоторыми константами, чтобы уменьшить количество ошибок, но я могу только последовательно все сломать.
Забавный факт, это не только самая короткая версия, которую я придумал, но и gcc не выдает предупреждений !
источник
for
циклfor(;i+1;i+=k=i-50?puts(b),k:-1)
так, чтобы сократить одну точку с запятой и две фигурные скобки, экономя 3 байта.k=1
к ,main(k)
чтобы сохранить 3 байта.gs2 : 72 байта, 200 ошибок
Пока еще не играл в гольф, не уверен, что смогу. Мнемоника:
Сама программа:
источник
Z80, 194 байта, 0 ошибок
Z80, 178 байт, 80 ошибок
Ошибки подсвечиваются зеленым.
Поскольку это процессор старой школы, я использовал соглашения старой школы. Я использовал & 8000 для шестнадцатеричных значений вместо более привычного 0x8000, и я решил завершить каждую строку шаблона с "\ r" вместо "\ n".
Исходный код закодирован в HEX
Исходный код объяснил
Поскольку Z80 является процессором, у него нет собственного стандартного выхода. Таким образом, я просто записывал каждый символ непосредственно в память, начиная с & 4000, а затем MEMDUMP выдавал 10 100 байт, чтобы проверить правильный шаблон.
Z80 имеет следующие регистры:
Специальный регистр флагов содержит следующие флаги:
SZ-H-VNC
. S ign, Z ero, H alf-carry, O v erflow (также используется как P arity ), N egative и C arry. Позиции, помеченные-
как, не используются. Н ALF-кэрри и N egative флаги используются только внутри ЦП. S ign и O v erflow / P arity используют дополнительные байты, поэтому я использую только Z ero и C arry, которые устанавливаются или сбрасываются после каждого вычисления, но не при перемещении значений.Существуют и другие доступные регистры, но они не имеют отношения к задаче игры в гольф, так как требуют дополнительных байтов.
LD
л оа д а м значение в регистр или адрес, например ,LD C, 4
этоC = 4
. Значение может быть прямым (один или два дополнительных байта для 8-битного или 16-битного значения соответственно) или может быть скопировано из другого регистра. Значение(HL)
означает скопировать на или с адреса, на который указываетHL
.PUSH
иPOP
толчок (Сохранить в) и поп (восстановить из) стек, который может хранить только 16-битные значения. Таким образом,AF
рассматривается как один 16-битный регистр, хотя никакие другие инструкции не используют его таким образом.AND
поразрядно и . Z80 не имеет инструкций логической логики, но имеет логические флаги.JR
J UMP г elative используя один байт Подписанные смещение. При этом используется один байт меньше , чем абсолютное J ит рJP
, но имеет меньшее количество условий , которые могут быть проверены на.INC
иDEC
вкл rement и декабрем rement 8 и 16 битовых регистров.DJNZ
д ecrement и J UMP , если п на- г эро. Это точно так же, какDEC B; JR NZ, ##;
в одном меньшем байте, но доступно только дляB
регистра.RET
ретр урны к месту вызова. Это может иметь условия на это.ADD
иSUB
добавить к и к югу тракта от любого бита 8A
регистра или бита 16HL
регистра.CP
c om p вычитает значение изA
регистра, устанавливает соответствующие флаги, но отбрасывает результат, оставляяA
без изменений.RRCA
г Повернуть по г РАВ с ircular в ccumulator. Поворачивает все битыA
один раз вправо, копируя бит 0 в бит 7. Он также копирует бит 0 воC
флаг Carry ( ), не путая сC
регистром.Каждый шаблон Identicon можно разбить следующим образом:
где 0-3 - углы, повернутые соответствующим образом, 4-7 - плитки краев, повернутые соответствующим образом, и 8 - центральная плитка, которая (насколько я могу судить) всегда симметрична по вращению.
К счастью, Z80 Identicon можно упростить до:
Я поставил «0» в центре, чтобы я мог эффективно проверить состояние конца. На самом деле, для игры в гольф имело смысл делать почти все задом наперед!
:Offsets
это блок из четырех байтовых значений, которые я использую в качестве смещения для шаблона для каждого блока. Программа решает, какой блок запустить, затем меняет себя, чтобы перейти к нужному коду. Как ни странно, это, кажется, использует меньше байтов, чем при прямой проверке!:DATA
(также называемый магическими данными в комментариях!) - это закодированный порядок, в котором необходимо визуализировать блоки. Есть 16 значений, обычно требующих 16 байтов, но поскольку каждое значение имеет длину всего 2 бита, я смог поместить 4 в один байт, сэкономив 12 байтов! Код для хранения, восстановления и декодирования этих значений составляет 6 байтов. Кроме того, избегая использования числа 0 в старших 2 битах, я смог удвоить его в качестве счетчика, сэкономив не менее 3 байтов (2 для инициализации, 1 для уменьшения)! Всего сохранено байтов: 12 - 6 + 3 = 9.Для корректной работы данные смещения должны храниться в месте, оканчивающемся на гекс 00. Я выбрал & 8000, так как это было похоже на удачное расположение. Это означает, что программа начинается с & 8008. По совпадению, Intel выпустила ранний процессор под названием 8008, который можно считать дедушкой Z80! Intel также выпустила 8080, на которой Zilog основал свой Z80, полностью совместимый с. У Z80 есть ряд расширенных инструкций, которых нет у 8080. Я избегал использования этих расширенных инструкций, так как каждая из них имеет однобайтовый префикс, что означает, что эта программа также выдаст те же результаты на 8080!
Так как шаблон для Block-3 - это все «1», я включил его в основной цикл, поэтому он имеет смещение 00. Это экономит 2 байта, не возвращаясь из Block-3! К счастью, мне удалось разместить начальные местоположения для всех четырех блоков менее чем в 128 байтов. Это хорошо, потому что диапазон относительного скачка составляет от -128 до 127 от текущей позиции, рассчитанной после считывания байта смещения. Т.е.
JR
инструкция читает два байта, затем выполняет вычисление.JR 00
ничего не делает.JR 01
пропускает один байт.JR FF
возвращается на один байт, в результате чего следующая инструкция будет смещениемJR
только что выполненного, что очень плохо, потому что инструкцияFF
не для слабонервных!JR FE
возвращается на два байта, вызывая бесконечный цикл, и т. д. Однако, отскок назад от Block-0 слишком далек (меньше -128), поэтому я просто возвращаюсь к предыдущему блоку, который затем снова переходит!Конечно, есть место для игры в гольф немного дальше. Моя первая полностью рабочая версия была 239 байт. 4 байта можно сохранить, удалив раздел «Extra-1s» за счет 48 ошибок, а еще 12 байтов можно сохранить, удалив раздел «Jaggies» за счет 32 ошибок.
источник
Haskell,
201190 байтов, 44 ошибкиИспользует матрицу функций для каждой формы:
a
(ромб);u
,d
,l
,r
(Треугольники , обращенные друг к направлению) иw
(белый), и применяет к каждому 25x25 сетке с координатами[-12..12]
. Формы ромба и треугольника вычисляются с использованием нормы Манхэттена, аналогично октавному решению Flawr .На самом деле только генерировать верхнюю половину, которая нуждается только
a
,w
,d
, иr
. Произведите нижнюю половину через зеркальное отображение (map reverse . reverse
).источник
flip
самом деле выполняет геометрическое вращение здесь._
вmapM_
. Кроме того, если вы удалите определениеl
и замените матрицу на:,[[a,r,d,a],[r,w,w,d],[u,w,w,flip u],[a,u,u,a]]
вы можете сохранить пару байтов и добавить пару ошибок.abs j+i+1<13
это простоabs j+i<12
C # - 423 байта, 237 ошибок
Просто накапливаются неравенства. Большинство ошибок происходит из-за того, что я подставил t (= 25) в местах, которые должны использовать 24.
Вот попытка визуализировать, как это работает:
Более читаемый код:
Вероятно, смог бы немного поиграть в паренов и логических операторов, но я получаю воспоминания о Лиспе.
источник
Perl
186184181151147 байт, 0 ошибокКод
почти так же прост, как изображение! Я мог бы уменьшить его еще на два байта, если бы шаблон начинался с новой строки, а не заканчивался ею, но технически он не проходит проверку без ошибок.дойти до того, что мне трудно это понять!источник
x/99$/
.JavaScript (ES6), 239 байт, 99 разных
При этом используются неравенства для генерации фигур для одного квадранта, а остальная часть кода поворачивает их для заполнения других.
Текст был просто
JavaScript
. Это довольно простой идентификатор:Используйте приведенный ниже фрагмент для проверки, так как он использует более хорошо поддерживаемый JavaScript и выводит моноширинный шрифт. Возможно, вам придется нажать «Полная страница», чтобы увидеть все это.
Показать фрагмент кода
источник
Python 3,
975963 байтаВыводится строка размером
"Python"
975 байт с 30 ошибками.Ибо
"Python 3"
я использовалЧто увеличило бы его до 1104 байтов с 124 ошибками, но я думаю, что я буду придерживаться только,
"Python"
если не будет запрошено OP.источник
J=''.join
и сохранить 12 символов в лямбда-выражении.map
; 2) сохранить несколько байтов путем определенияR=lambda x:L(Z(*x[::-1]))
; 3) не нужно пробелов после закрытия скобок.HTML -
223210193191 байт, 0 ошибок100% действительный HTML. И HTML, и JavaScript довольно многословны, поэтому, несмотря на простоту идентификации, код все еще очень длинный.
источник
document.write()
наdocument.write(c?2-c/2:+(Math.abs(i)+Math.abs(j)<14)),++x);
. Кроме того, если вы щелкнете по значку с помощью<>
, вы можете создать стапельную куклу, чтобы продемонстрировать свой код.<!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 байт, 49 ошибокэто просто печать одной строки за раз, с некоторыми причудливыми мета-заменами / выражениями для игры в гольф
ungolfed:
это то, что в конечном итоге получает
iex
:и этот, который составляет 471 байт, 104 ошибки, который использует логику вращения
(относительно) негольфированный:
источник
Python 2,
712711 байтЭта программа генерирует битовый массив для Python, используя кодирование длин серий и сохраняя серии в виде символов.
До авто-гольфиста это выглядело (очень похоже!) Примерно так:
Этот метод RLE должен привести к нулевым ошибкам.
Массив идентификаторов для 'python' выглядит намного проще, но я подумал, что это будет обманом, если я воспользуюсь этим.
источник
in
иzip
. Кажется, что пропустил пространство между35
иfor
хотя.35 for
последовательностей типов (стараясь сохранить место, если следующий идентификатор начинается сe
!). Спасибо за совет.e
. Может быть, попробовать обновить и протестировать? (для справки я пробовал на 2.7.9)IDL, 472 байта, 290 ошибок
Тьфу. Это было бы намного короче, если бы я мог хранить функции как переменные или делать несколько замен строк одновременно и т. Д.
источник
PHP -
417414413410 байт, 0 ошибок, (20 предупреждений!)Требуется PHP> = 5.4.
PHP разрешает использовать ключевые слова в любом случае, поэтому я использовал прописные буквы для ключевых слов и строчные буквы для переменных в загаданном коде.
preg_replace
используется только для разгона кода иeval
его запуска. Я удалил$
из всех переменных и вставил их с регулярным выражением. Я также изменил каждый экземпляр&&
и||
на&
и|
и удвоил их с помощью регулярного выражения. Я не могу сделать тот же трюк,++
потому что я также использую+
то, что я не хочу удвоить. Я попытался поменять логику, чтобы избавиться от-
только что,echo
но она превратила слишком много99
s в100
s. Однако мне удалось избежать использования одного пробела!Я смог применить предложение Измаила Мигеля и к другому набору
{}
скобок дляfor
цикла, однако мне пришлось использоватьprint
вместо негоecho
.print
иecho
обе языковые конструкции («магические» ключевые слова, которые не нуждаются в скобках()
) и поэтому не допускаются внутриfor
объявления. Однако, посколькуprint
имеет возвращаемое значение, как у функции, оно разрешено внутриfor
. Переместив присвоения переменных из третьего во второй раздел, я также смог устранить предупреждения!источник
\r\n
окончание строки, но я изменил его, чтобы просто\n
сохранить один байт, как вы предложили.Пип , 116 байт (96 ошибок)
Новые строки предназначены только для форматирования и не влияют на код:
Слегка безразличен к комментариям:
Код строит тождество как список строк. Как только вы узнаете, что
X
это умножение строк,RL
повторный список,AL
добавление списка иJ
объединение, оно становится достаточно читабельным (IMHO). Переменныеb
,t
иw
(в негольфированной версии) соответствуют следующим частям идентификатора:Верхний левый квадрант составляется так:
Wt
tb
где
W
представляет 13 строкb
сверхуw
. Затем мы поворачиваем и поворачиваем назад, чтобы получить остальную часть фигуры.Ошибки возникают из-за того, как мы генерируем узкие белые треугольники (вторая часть выше). Они не совсем одинакового размера - у одного есть нечетные числа белых пикселей, а у другого четные числа, но если рассматривать их как одинаковые (без верхней строки нижней, всего 25 строк), то экономит несколько байт. Вот 122-байтовая версия, которая выполняет четно-нечетные шаги по лестнице (0 ошибок):
И, просто для удовольствия, перевод оригинала на Python (не в гольф):
источник
Ruby, 324 байта, 216 ошибок
Идентикон использует строку
Ruby
, и мне это нравится. Чистая геометрия + симметрия. Уравнения краев для треугольника, вращение на 45 ゜ для прямоугольников, чтобы выровнять их оси. Около 100 ошибок было принесено в жертву на несколько байт меньше.источник
/// , 1319 байт, 0 ошибок
Попробуйте онлайн!
Это заняло у меня около 2 часов, потому что я заменял вещи вручную. Самое большое, что я сделал в ///.
Вероятно, я могу сыграть в гольф еще несколько байтов.
Также см. Ответ Эрика Гольфиста в /// (на 4 байта меньше моего).
источник
Фортран, 214 байт, 200 ошибок
Fortran, возможно, не лучший выбор для Code Golf, но его идентичность выглядела так просто, что я решил попробовать. На самом деле я не могу конкурировать с некоторыми более краткими языками, но используя неявные переменные и другие подобные тонкости (например,
-
удваивается какxor
), это не так уж и плохо - я сократил его до 214 байтов:Примечание: это не будет работать с
gfortran
. Он компилируется,ifort
если вы дадите файлу.f90
расширение (это активирует источник свободной формы).источник
Perl -
3244318816091387 байт,0136678 ошибокМне потребовалось немного времени, чтобы понять это, но значок симметричен. Кроме того, я могу просто печатать новую строку после каждых 100 символов, а не жестко ее кодировать.
Создает текст для этого:
источник
$n=0
ниint()
;if($n>=100){print"\n";$n=0}
→$n>99and$n=!print"\n"
;@p
можно заменить на/(.*);(.*)/;$n+=$2;print$1x$2
./// , 1315 байт, 0 ошибок
Попробуйте онлайн!
Это идентичность для
///
. Возможно, это самая большая вещь, которую я когда-либо делал в ///!источник
IDL 8,4, 333 байта, 105 ошибок
Это дало другой идентификатор, и я смог сыграть в него намного больше, используя совершенно другой метод.
Сначала преобразуйте символы в строке 1 в байтовые значения и вычтите 64 (чтобы A = 1, B = 2 и т. Д.). Затем вставьте эти многочисленные последовательные 1 и 0 в массив и преобразуйте его в 50x50 (т. Е. Верхний левый квадрант, но транспонированный). Затем транспонируйте и вращайте его 4 раза, соедините их вместе и распечатайте.
источник
Bubblegum, 535 байт, 0 ошибок
Сжатый с помощью zopfli (
--deflate --i10000
). Попробуйте онлайн.Довольно просто; Я мог бы поэкспериментировать с добавлением некоторых ошибок позже.
источник
ForceLang,
274924992495 байтНеконкурентоспособен, язык задает вопрос.
источник