Identikony to małe obrazy wzorów geometrycznych, które reprezentują wartość skrótu łańcucha. Stack Exchange używa identyfikatorów z Gravatar jako domyślnego obrazu awatara każdego użytkownika.
W tym wyzwaniu wykorzystamy również identyfikatory Gravatar do wygenerowania tekstu do gry w golfa.
Wyzwanie
Ten fragment stosu (zminimalizowana wersja tego JSFiddle ) umożliwia wpisanie ciągu znaków i zwraca czarno-białą wersję identikonu tego ciągu o wymiarach 100 × 100 pikseli, wraz z wersją tekstową, gdzie 1
jest dla czerni, a 0
dla bieli:
<!-- 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>
(Pozwala także ładować style Monster, Wavatar i Retro Gravatar, ale są one tylko dla zabawy i nie są przeznaczone do użycia w tym wyzwaniu. Unicornicons niestety brakuje z powodu ograniczeń XSS .: /)
Twoim zadaniem jest napisanie programu, który wyświetli blok tekstowy o rozmiarze 100 × 100 znaków 0
i 1
generowany po wstawieniu nazwy języka programowania do pola wprowadzania fragmentu kodu.
Na przykład, jeśli przesłanie zostało napisane w języku Python , należy wpisać Python
fragment kodu stosu i to zobaczyć
jest identycznym dla Pythona, i
jest wersją czarno-białą (binarną) oraz
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
to odpowiednie wyjście tekstowe, które musi wytworzyć Twój program w języku Python.
Ponieważ jednak identyfikatory mogą mieć wiele dziwnych kątów, a ich rasteryzacja jako czarno-biały obraz może pozostawić postrzępione , twoja produkcja może mieć do 300 0
lub inaczej 1
, które są przeciwieństwami tego, co powinny być. (To jest 3% 10000 Całkowity 0
'S 1
' S).
W dolnej części fragmentu kodu możesz wkleić dane wyjściowe programu i sprawdzić, ile 0
ich jest lub 1
jest więcej niż powinny. Każda liczba różnic równa lub mniejsza niż 300 jest ważna.
Punktacja
Zgłoszenie z najmniejszą liczbą bajtów wygrywa. ( Przydatny licznik bajtów. )
Tiebreaker przechodzi do zgłoszenia z najmniejszą liczbą nieprawidłowych 0
i błędnych danych 1
.
Jeśli nadal jest remis, wygrywa wcześniejsze zgłoszenie.
Detale
- Dane wyjściowe są przesyłane do standardowego wyjścia lub podobnej alternatywy, jeśli Twój język nie ma standardowego wyjścia.
- Wyjście może opcjonalnie mieć końcowy znak nowej linii.
- W swoim poście umieść kolorowy obraz identikonu wraz z dokładnym ciągiem, który go generuje. Nie musisz marnować miejsca i publikować całego tekstu.
- Twój program powinien działać bez połączenia z Internetem. Musisz wygenerować tekst w kodzie, a nie wyszukiwać go w witrynie Gravatar.
- Zachowaj zdrowy rozsądek, nazywając swój język. Użyj nazwy języka, której normalnie używasz na tej stronie. Nie denerwuj się i wymyśl nazwę, która ułatwia identyfikację. np.
Python 2
jest w porządku dla Pythona, alepython 2.7.2
rozciąga go ipython 2.7.2 by Guido van Rossum
byłoby śmieszne. - Zdaję sobie sprawę, że niektóre języki są z natury łatwiejsze niż inne, ponieważ ich kształty identyczne są prostsze. Tak właśnie będzie, nie bądź niezadowolony ani konkurencyjny. ;)
źródło
Odpowiedzi:
CJam,
92817971 bajtów, 120 błędówPrawdopodobnie jest jeszcze miejsce na grę w golfa.
Sprawdź to tutaj.
Wyjaśnienie
Nie używam żadnej kompresji, ale zamiast tego obliczam poszczególne kafelki i łączę z nich wynik. Lewa górna płytka jest celowo przybliżona. Kilka innych błędów wynika z faktu, że binariowany obraz nie jest w pełni symetryczny obrotowo. Przejdźmy przez kod.
Pierwszy kafelek powinien teoretycznie wyglądać tak:
To 12 linii, a następnie 13 linii punktu między
1
si0
si zmniejsza się o 2 na raz. Zauważ, że pierwszy blok ma parzystą liczbę0
s, a drugi blok nieparzystą liczbę. Możemy sprawić, że wzór będzie jeszcze bardziej regularny, jeśli poświęcimy dokładność w środkowym rzędzie i zmienimy na1
240
sekundy. W rzeczywistości mamy jeden wiersz dla każdej liczby zer od 0 do 24, na przemian między górną i dolną częścią. Możemy więc po prostu wygenerować je w kolejności (jako pojedynczy trójkąt), a następnie wyciągnąć co drugą linię:Następny jest fantazyjny trójkąt po prawej stronie tego kafelka:
Jeśli weźmiemy pod uwagę układ współrzędnych o początku w prawym górnym rogu i
x
idzie w prawo iy
zejście, następnie region1
s 3 spełnia nierówności:x/y ≥ 1/2
,x/y ≥ 2
,x + y < 38
. Możemy po prostu obliczyć je osobno i logicznie zakończyć. Nie zapisuje żadnych znaków, ale delikatnie czyści kod, jeśli połączymy dwie pierwsze nierówności:Ostatecznie zaoszczędzimy kolejny bajt, sprawdzając przeciwieństwo i używając
xor
zamiastand
łączyć wynik z innymi nierównościami:Mamy wszystko na swoim miejscu - pozostałe kafelki to tylko ich kopie i rotacje, a także solidna (nudna) płytka na środku. Więc zbierzmy wszystko razem:
Pod koniec programu CJam po prostu drukuje zawartość stosu jeden po drugim, tworząc pożądany rezultat.
źródło
Oktawa
166164 bajtów, 0 błędówOktawa ma dużą wytrzymałość w obsłudze / budowaniu matryc. Dla „diamentów” stworzyłem układ współrzędnych xy i użyłem normy Manhattanu do podjęcia decyzji, czy wpisy będą wynosić 1 czy 0. Ponieważ diamenty nie są w pełni symetryczne, musiałem się bawić z „odległością” i punktem środkowym, więc z punktem środkowym (13.1, 13.1) działało ono dla obu rodzajów kształtów „diamentowych”.
Potem mogłem ustawić jedną czwartą z nich na zero, aby uzyskać te litery C. Kwadraty i konkatenacja macierzy były łatwe.
Nowa wersja -2 znaków (działa tak samo jak stare, ale udało mi się nadużyć składni Octave nawet trochę więcej:
Stara wersja:
Wynik
źródło
Brainfuck
94182237 bajtów, 88 błędówEdycja: Jak zauważył mbomb007, „oficjalna” nazwa wydaje się nie być pisana wielkimi literami, nie jest to wspomniane na wikipedii, ale na esolangach . Denerwuje mnie to, ale nie na tyle, aby to przerobić;).
Mój pierwszy program Brainfuck!
Teraz używa matematyki, logiki i innych rzeczy! (dla każdego piksela decyduje 0 lub 1 w zależności od kilku warunków warunkowych). To było całkiem zabawne; że mówi nie sądzę, mam zamiar kodować ponownie brainfuck przez długi długi czas.
tworzenie bitmapy obrazu:
Wersja z niektórymi komentarzami (może nie być bardzo przydatna, ponieważ były one głównie dla mojej korzyści):
źródło
Python,
294273239188179170159154 bajtówOto 158-bajtowa wersja:
Jest to program tylko dla języka Python 2, ale używam identikonu dla „Python” (tj. Ten w OP). Różnica powinna wynosić 78 bitów.
Rzucając dokładność za drzwi, oto 154-bajtowa wersja:
który zamiast tego ma różnicę 224 bitów.
(-4 bajty dzięki Stefanowi Pochmann)
Wyjaśnienie
Oto alternatywna wersja rozszerzona:
W tej wersji traktujemy identicon jako siatkę wzorów 4x4. Zaczynamy od siatki 0 x 100 x 100 i wykonujemy następujące cztery razy:
Oryginalna wersja jest podobna, ale zamiast obracać się po ukończeniu trzech wzorów, obracamy za każdym razem, gdy modyfikujemy pojedynczą komórkę . To sprawia, że program zajmuje kilka sekund, ale wynik jest taki sam.
źródło
J
ir
w jedną linię za pomocą średnika.~i%12<j/2>i%12
jest 3 krótszy niż,abs(i%12-6)+5<j/2
ale myślę, że prowadzi do 224 diff.C,
255245237234 bajtówIdenticon C. jest naprawdę symetryczny.
Gra w golfa: (dodano nowe wiersze dla „czytelności”)
To przechowuje połowę każdej linii w górnej połowie na 64-bitowej liczbie całkowitej, a następnie drukuje dwukrotnie 50 bitów odpowiedniej liczby całkowitej w formacie binarnym dwukrotnie, przy czym drugi wydruk jest odwracany.
64-bitowe inty są wymagane do tego działania (jeśli twój system nie używa 64-bitowych ints, możesz dodać
long
lublong long
przedd[50]
i po(long)
lub ).(long long)
o[i-1]=i<26?
Nie golfił i skomentował:
Dane wyjściowe zawierają 291 błędów.
Dzięki asowi za wskazówkę użycia
puts("")
źródło
putchar(10)
sięputs("")
zapisać 3 bajty.C,
224206200176 bajtów, 243 błędyDo zreplikowania:
Powyższy kod wyświetla dane binarne, które korelują z tym obrazem, z 243 błędami:
Z tego, co mogę powiedzieć, używam raczej innej metody niż rozwiązanie es1024. Metodę tę można prawdopodobnie pograć w golfa, więc odłożę się nieco na wyjaśnienia, ale tutaj jest w pełnej krasie:
Zasadniczo wykorzystuje zestaw nierówności do definiowania wielokątów i opiera się w dużej mierze na symetrii.
Jest północ, a moja umiejętność czytania własnego kodu gwałtownie się pogarsza. Prawdopodobnie możesz majstrować przy niektórych stałych, aby obniżyć błędy, ale mogę konsekwentnie wszystko zepsuć.
Zabawne jest to, że nie tylko jest to najkrótsza wersja, jaką wymyśliłem, ale gcc nie generuje ostrzeżeń !
źródło
for
pętlęfor(;i+1;i+=k=i-50?puts(b),k:-1)
, aby wyciąć jeden średnik i dwa nawiasy klamrowe, oszczędzając 3 bajty.k=1
do,main(k)
aby zapisać 3 bajty.gs2 : 72 bajty, 200 błędów
Tak naprawdę jeszcze nie grałem w golfa, nie jestem pewien, czy to zrobię. Mnemonika:
Sam program:
źródło
Z80, 194 bajtów, 0 błędów
Z80, 178 bajtów, 80 błędów
Błędy są podświetlone na zielono.
Ponieważ jest to oldskulowy procesor, użyłem konwencji oldschoolowych. Użyłem & 8000 dla wartości szesnastkowych zamiast bardziej znanego 0x8000 i postanowiłem zakończyć każdą linię wzorca „\ r” zamiast „\ n”.
Kod źródłowy zakodowany w formacie HEX
Kod źródłowy wyjaśniony
Ponieważ Z80 jest procesorem, nie ma własnego standardowego wyjścia. W związku z tym po prostu zapisałem każdy znak bezpośrednio do pamięci, zaczynając od & 4000, a następnie MEMDUMP dodał 10 100 bajtów, aby zweryfikować prawidłowy wzorzec.
Z80 ma następujące rejestry:
Specjalny rejestr Oznacz zawiera następujące flagi:
SZ-H-VNC
. S IGN Z ero, H alf carry, O v erflow (również jako P Arity) N egative i C arry. Pozycje oznaczone przez-
są nieużywane. H alf przenoszenie i N flagi egative służą tylko wewnętrznie przez jednostkę centralną. S IGN i O v erflow / P arity podjąć dodatkowe bajty w użyciu, więc jestem tylko przy użyciu Z ero i C arry które ulegną ustawiane lub zerowane po każdym obliczeniu, ale nie wtedy, gdy porusza się wokół wartości.Dostępne są inne rejestry, ale nie są one istotne dla gry w golfa, ponieważ wymagają dodatkowych bajtów.
LD
l OA d a wartość w rejestrze lub adresu, na przykładLD C, 4
jestC = 4
. Wartość może być bezpośrednia (jeden lub dwa dodatkowe bajty odpowiednio dla wartości 8-bitowej lub 16-bitowej) lub może być skopiowana z innego rejestru. Wartość(HL)
oznacza kopię do lub z adresu wskazanego przezHL
.PUSH
iPOP
popchnij (zapisz do) i pop (przywróć z) stosu, który może przechowywać tylko 16-bitowe wartości. Jako takiAF
jest traktowany jako pojedynczy rejestr 16-bitowy, chociaż żadne inne instrukcje nie używają go w ten sposób.AND
jest bitowe i . Z80 nie ma instrukcji logiki boolowskiej, ale ma flagi boolowskie.JR
j UMP r elativus użyciu jednobajtowe podpisany offset. Wykorzystuje jednego bajtu mniej niż całkowita J um sJP
, ale mniej warunków można badać.INC
iDEC
Inc rement i dec rement 8 i 16-bitowe rejestrów.DJNZ
d ecrement i J UMP jeśli n na- z ero. Robi to dokładnie tak samo, jakDEC B; JR NZ, ##;
w jednym bajcie mniejszym, ale jest dostępne tylko dlaB
rejestru.RET
ret urny do lokalizacji dzwoniącej. Opcjonalnie może mieć warunki.ADD
iSUB
dodać do sub oddechowych z każdym z 8 bitowychA
rejestru albo 16-bitowyHL
rejestr.CP
c om p odejmuje wartość zA
rejestru, ustawia flagi odpowiednio, ale odrzuca pozostawiającA
niezmienione.RRCA
R Obróć w r rawo c ircular do ccumulator. Obraca wszystkie bityA
raz w prawo, kopiując bit 0 do bitu 7. Kopiuje również bit 0 doC
flagi Carry ( ), aby nie pomylić go zC
rejestrem.Każdy wzór Identicon można rozbić w następujący sposób:
gdzie 0-3 to rogi, odpowiednio obrócone, 4-7 to płytki brzegowe, odpowiednio obrócone, a 8 to środkowa płytka, która (o ile wiem) jest zawsze symetryczna obrotowo.
Na szczęście Z80 Identicon można uprościć:
Umieszczam „0” na środku, aby umożliwić mi skuteczne sprawdzenie stanu końcowego. W rzeczywistości, aby zagrać w golfa, sensowne jest zrobienie prawie wszystkiego wstecz!
:Offsets
jest blokiem czterech bajtów, których używam jako przesunięcia wzoru dla każdego bloku. Program ustala, który blok ma zostać uruchomiony, a następnie zmienia się, aby przejść do właściwego kodu. O dziwo, wydaje się, że zużywa mniej bajtów niż przez bezpośrednie sprawdzanie!:DATA
(zwane także w komentarzach danymi magicznymi!) to zakodowana kolejność, w której bloki muszą być renderowane. Jest 16 wartości, zwykle wymagających 16 bajtów, ale ponieważ każda wartość ma tylko 2 bity, byłem w stanie umieścić 4 w jednym bajcie, oszczędzając 12 bajtów! Kod do przechowywania, przywracania i dekodowania tych wartości to 6 bajtów. Dodatkowo, unikając używania liczby 0 w najwyższych 2 bitach, byłem w stanie podwoić to jako licznik, oszczędzając co najmniej 3 bajty (2 do inicjalizacji, 1 do zmniejszenia)! Całkowita liczba zapisanych bajtów: 12–6 + 3 = 9.Dane przesunięcia muszą być przechowywane w miejscu kończącym się cyfrą szesnastkową 00, aby działały poprawnie. Wybrałem & 8000, ponieważ wydawało się, że to dobra, nietypowa lokalizacja. Oznacza to, że program zaczyna się od & 8008. Przypadkowo Intel wyprodukował wczesny procesor o nazwie 8008, który można uznać za dziadka Z80! Intel wyprodukował również 8080, na którym Zilog oparł swoją Z80, będąc w pełni kompatybilnym. Z80 ma szereg rozszerzonych instrukcji, których nie ma w 8080. Unikałem używania tych rozszerzonych instrukcji, ponieważ każda z nich ma jednobajtowy prefiks, co oznacza, że ten program będzie również generował takie same wyniki na 8080!
Ponieważ wzorzec dla bloku-3 to wszystkie „1”, osadziłem go w głównej pętli, dlatego ma przesunięcie o wartości 00. To oszczędza 2 bajty, nie musząc wracać z bloku-3! Na szczęście udało mi się dopasować początkowe lokalizacje wszystkich czterech bloków do mniej niż 128 bajtów. Jest to dobre, ponieważ zakres względnego skoku wynosi od -128 do 127 od bieżącej pozycji, obliczonej po odczytaniu bajtu przesunięcia. Czyli
JR
instrukcja czyta dwa bajty, a następnie wykonuje obliczenia.JR 00
nic nie robi.JR 01
pomija jeden bajt.JR FF
cofa się o jeden bajt, powodując, że następna instrukcja jest przesunięciemJR
właśnie wykonanej operacji , co jest naprawdę złe, ponieważ instrukcjaFF
nie jest dla osób o słabym sercu!JR FE
cofa się o dwa bajty powodując nieskończoną pętlę itp. Jednak skok z powrotem z bloku 0 jest za daleko (mniej niż -128), więc po prostu wskakuję z powrotem do poprzedniego bloku, który następnie ponownie skacze!Z pewnością jest jeszcze miejsce na grę w golfa. Moja pierwsza w pełni działająca wersja miała 239 bajtów. Można zapisać 4 bajty, usuwając sekcję „Extra-1” kosztem 48 błędów, a kolejne 12 bajtów można zapisać, usuwając sekcję „Jaggies” kosztem 32 błędów.
źródło
Haskell,
201190 bajtów, 44 błędyWykorzystuje macierz funkcji dla każdego innego kształtu:
a
(diament);u
,d
,l
,r
(Trójkąty skierowane każdym kierunku) iw
(biały) i dotyczy każdego z siatki 25x25 ze współrzędnymi[-12..12]
. Kształty diamentów i trójkątów są obliczane przy użyciu normy Manhattanu, podobnej do rozwiązania Octave flawr .Właściwie tylko generować górną połowę, która wymaga jedynie
a
,w
,d
, ir
. Wytwórz dolną połowę poprzez mirroring (map reverse . reverse
).źródło
flip
faktycznie wykonuje tutaj obrót geometryczny._
inmapM_
. Ponadto, jeśli usuniesz definicjęl
i zamienisz macierz na:,[[a,r,d,a],[r,w,w,d],[u,w,w,flip u],[a,u,u,a]]
możesz zapisać kilka bajtów i dodać kilka błędów.abs j+i+1<13
jest po prostuabs j+i<12
C # - 423 bajty, 237 błędów
Po prostu piętrzą się nierówności. Większość błędów wynika z tego, że podstawiam t (= 25) w miejscach, w których powinno być używane 24.
Oto próba wizualizacji, jak to działa:
Bardziej czytelny kod:
Prawdopodobnie mógłby trochę zagrać w golfa w pareny i operatorów logicznych, ale dostaję retrospekcje Lisp.
źródło
Perl
186184181151147 bajtów, 0 błędówKod jest
prawie tak prosty jak obraz! Mógłbym zmniejszyć go o dwa kolejne bajty, rozpoczynając od nowej linii zamiast nowej linii, ale technicznie nie sprawdza się bez błędów.Przechodzę do punktu, w którym trudno mi to zrozumieć!źródło
x/99$/
.JavaScript (ES6), 239 bajtów, 99 różnych
Wykorzystuje to nierówności do generowania kształtów dla jednej ćwiartki, a reszta kodu obraca je, aby wypełnić pozostałe.
Tekst był sprawiedliwy
JavaScript
. To dość prosty identyfikator:Użyj poniższego fragmentu, aby to zweryfikować, ponieważ używa on lepiej obsługiwanego kodu JavaScript i wyświetla czcionkę o stałej szerokości. Prawdopodobnie będziesz musiał kliknąć „Pełna strona”, aby zobaczyć wszystko.
Pokaż fragment kodu
źródło
Python 3,
975963 bajtówWydrukowany ciąg ma
"Python"
975 bajtów i 30 błędów.Bo
"Python 3"
użyłemKtóry będzie doprowadzić go do 1104 bajtów z 124 błędów, ale myślę, że będę trzymać się tylko
"Python"
o ile wymagane przez OP.źródło
J=''.join
i zapisywać 12 znaków na lambda.map
; 2) zapisz kilka bajtów, definiującR=lambda x:L(Z(*x[::-1]))
; 3) nie potrzebują spacji po zamknięciu nawiasów.HTML -
223210193191 bajtów, 0 błędów100% poprawny HTML. Zarówno HTML, jak i JavaScript są dość szczegółowe, więc pomimo prostoty identikonu kod jest wciąż bardzo długi.
źródło
document.write()
godocument.write(c?2-c/2:+(Math.abs(i)+Math.abs(j)<14)),++x);
. Ponadto, jeśli klikniesz ikonę za pomocą<>
, możesz zbudować pakiet kodów kreskowych, aby zaprezentować swój kod.<!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 bajtów, 49 błędówto tylko drukuje jedną linię na raz, z kilkoma fantazyjnymi meta-zamiennikami / wyrażeniami do gry w golfa
bez golfa:
do tego ostatecznie dołącza się
iex
:a ten, który ma 471 bajtów, 104 błędów, wykorzystuje logikę rotacji
(stosunkowo) niepoddany golfowi:
źródło
Python 2,
712711 bajtówTen program generuje tablicę bitów dla „Pythona” za pomocą kodowania długości przebiegu i przechowywania przebiegów jako znaków.
Przed auto-golfistą wyglądało (dość podobnie!) Jak:
Ta metoda RLE powinna powodować zero błędów.
Tablica identicon dla „python” wygląda o wiele łatwiej, ale myślałem, że oszukuje, jeśli jej użyję.
źródło
in
izip
. Wygląda na to, że ominęła go przestrzeń między35
ifor
chociaż.35 for
sekwencje typów (uważaj, aby zachować spację, jeśli następujący identyfikator zaczyna się ode
!). Dzięki za radę.e
. Może spróbuj zaktualizować i przetestować? (dla porównania próbowałem w wersji 2.7.9)IDL, 472 bajtów, 290 błędów
Ugh. Byłoby to znacznie krótsze, gdybym mógł przechowywać funkcje jako zmienne lub wykonywać wiele zamian ciągów jednocześnie itp.
źródło
PHP -
417414413410 bajtów, 0 błędów, (20 ostrzeżeń!)Wymaga PHP> = 5,4.
PHP pozwala, aby słowa kluczowe były dowolnymi przypadkami, więc użyłem wielkich liter dla słów kluczowych i małych dla zmiennych w kodzie golfowym.
preg_replace
służy tylko do odkodowania kodu ieval
uruchomienia go. Usunąłem$
ze wszystkich zmiennych i ponownie wstawiłem je za pomocą wyrażenia regularnego. I również zmienić każdej instancji&&
i||
do&
a|
i podwoiła ich regex. Nie mogę zrobić tej samej sztuczki,++
ponieważ używam również+
tego, czego nie chcę podwoić. Próbowałem odwrócić logikę, aby pozbyć się-
zaraz po,echo
ale zmieniło to zbyt wiele99
s na100
s. Udało mi się jednak uniknąć użycia pojedynczego miejsca!Byłem w stanie zastosować sugestię Ismaela Miguela do innego zestawu
{}
nawiasów klamrowych dlafor
pętli, jednak musiałem użyćprint
zamiast tegoecho
.print
iecho
oba są konstrukcjami językowymi („magiczne” słowa kluczowe, które nie wymagają nawiasów()
) i dlatego nie są dozwolone wfor
deklaracji. Ponieważ jednakprint
ma wartość zwracaną tak jak funkcja, jest dozwolona wewnątrzfor
. Przenosząc przypisania zmiennych z trzeciej do drugiej sekcji, byłem również w stanie wyeliminować ostrzeżenia!źródło
\r\n
zakończenia linii, ale zmieniłem go tak,\n
aby zapisać jeden bajt, jak sugerowałeś.Pip , 116 bajtów (96 błędów)
Newlines służą wyłącznie do formatowania i nie mają wpływu na kod:
Nieznacznie niepolecany z komentarzami:
Kod buduje identicon jako listę ciągów znaków. Kiedy wiesz, że
X
jest to mnożenie ciągów,RL
lista powtórzeń, listaAL
dołączania iJ
dołączanie, jest ona dość czytelna (IMHO). Zmienneb
,t
, iw
(w wersji ungolfed) są zgodne z następujących części identicon:Lewa górna ćwiartka składa się w następujący sposób:
Wt
tb
gdzie
W
reprezentuje 13 liniib
umieszczonych na górzew
. Następnie obracamy i odwracamy, aby uzyskać resztę figury.Błędy wynikają z tego, jak generujemy chude białe trójkąty (drugi kawałek powyżej). Nie mają dokładnie tego samego rozmiaru - jeden ma nieparzystą liczbę białych pikseli, a drugi ma liczby parzyste - ale traktowanie ich jako takich samych (od górnego rzędu dolnego do 25 rzędów) pozwala zaoszczędzić kilka bajty. Oto 122-bajtowa wersja, która poprawnie wykonuje parzyste nieparzyste schody (0 błędów):
I dla zabawy tłumaczenie oryginalnego (nie golfowego) tłumaczenia w języku Python:
źródło
Rubinowy, 324 bajty, 216 błędów
Identicon używa łańcucha
Ruby
i podoba mi się to. Czysta geometria + symetria. Równania krawędzi dla trójkąta, obrót o 45 ゜ dla prostokątów w celu wyrównania ich osi. Około 100 błędów zostało poświęconych o kilka bajtów mniej.źródło
/// , 1319 bajtów, 0 błędów
Wypróbuj online!
Zajęło mi to około 2 godzin, ponieważ ręcznie wymieniałem rzeczy. Największa rzecz, którą zrobiłem w ///.
Prawdopodobnie umiem golfa jeszcze kilka bajtów.
Zobacz także odpowiedź Erika the Golfer w /// (4 bajty krótsze niż moje).
źródło
Fortran, 214 bajtów, 200 błędów
Fortran może nie jest pierwszym wyborem do gry w golfa kodowego, ale jego identyfikator wyglądał tak prosto, że myślałem, że spróbuję. W rzeczywistości nie mogę konkurować z niektórymi bardziej zwartymi językami, ale używając ukrytych zmiennych i innych takich subtelności (np.
-
Podwaja sięxor
), nie jest tak źle - sprowadziłem to do 214 bajtów:Uwaga: To nie zadziała
gfortran
. Kompiluje się z,ifort
jeśli podasz.f90
rozszerzenie pliku (aktywuje to wolne źródło).źródło
Perl -
3244318816091387 bajtów,0136678 błędówZajęło mi to trochę czasu, ale ikona jest symetryczna. Mogę też po prostu wydrukować nowy wiersz po każdych 100 znakach, zamiast go kodować.
Generuje tekst do tego:
źródło
$n=0
aniint()
;if($n>=100){print"\n";$n=0}
→$n>99and$n=!print"\n"
;@p
można zastąpić/(.*);(.*)/;$n+=$2;print$1x$2
./// , 1315 bajtów, 0 błędów
Wypróbuj online!
To jest identyfikator
///
. To prawdopodobnie największa rzecz, jaką kiedykolwiek zrobiłem w ///!źródło
IDL 8.4, 333 bajty, 105 błędów
To dało inny identyfikator, a ja byłem w stanie grać w golfa znacznie bardziej, używając zupełnie innej metody.
Najpierw przekonwertuj znaki w wierszu 1 na wartości bajtowe i odejmij 64 (tak, aby A = 1, B = 2 itd.). Następnie umieść te kolejne jedności i zera w tablicy i przekształć je w 50x50 (tj. Lewy górny kwadrant, ale transponowany). Następnie transponuj i obróć 4 razy, połącz je ze sobą i wydrukuj.
źródło
Bubblegum, 535 bajtów, 0 błędów
Kompresowany za pomocą zopfli (
--deflate --i10000
). Wypróbuj online.Dość bezpośredni; Mogę eksperymentować z dodawaniem błędów później.
źródło
ForceLang,
274924992495 bajtówNiekonkurencyjny, język przesuwa pytanie na później.
źródło