Znamy już ostatecznych (oby ;)) zwycięzców konkursu na najkrótszy skrypt. Jak liczyliśmy oficjalne wyniki?
Krótka przemowa jury w osobie Szymona Piłkowskiego:
Liczy się rozmiar kodu razem z deklaracja funkcji (inaczej trzeba by
dodawać argumenty itp); bez deklaracji alfabetu (niektórzy przysyłali
tak, inni inaczej), ze spacjami dookoła ‘=’ przy deklaracji (dodałem
tym, którzy sobie usunęli), bez spacji pomiędzy function a (), () i {,
{ i kodem, kodem i } – usunąłem tym, którzy mieli.
Testowałem dla kilku rożnych alfabetów, w tym podany przykładowy,
jednoznakowy, zawierający znaki \”!% itp.
Nie testowałem dla bigintow, bo nie przeszłoby nic co używa bitwise, a
nie pisalismy o tym.
Screen z testów:
Po długich naradach (w klimacie wakacyjnym) zdecydowaliśmy wykluczyć rozwiązania oparte na zmiennych globalnych zdefiniowanych w funkcjach. Jednocześnie bardzo przepraszam za wprowadzenie w błąd w jednym z komentarzy – jak widać do trzech razy sztuka, jeśli chodzi o perfekcyjny regulamin. Wszystko jest robione dla funu, mam nadzieję, że zrozumiecie tę wtopę.
Przechodząc do wyników, wygrał Grzegorz Kućmierz (218). Gratulacje!
var alfabet = "abcdefghjpz679";
var convertToLetters = function(n,r,a,l){r='',++n;for(a=alfabet,l=a.length;r=a[--n%l]+r,n=n/l|0;);return r};
var convertToNumber = function(s,r,a,i){a=alfabet;for(i=0;s[i];)r=~~r*a.length-~a.indexOf(s[i++]);return~-r};
Drugie miejsce zajął Piotr Koszuliński (220)!
var alfabet = 'abcdefghjpz679';
var convertToLetters = function(n,a,l){a=alfabet,l=a.length;return(n<l?'':convertToLetters(n/l-1|0))+a[n%l]};
var convertToNumber = function(s){for(var d=alfabet,i=0,v=0;s[i];v=d.length*v+d.indexOf(s[i++])+1);return--v};
Trzecie natomiast Lech Wilczyński (221):
var alfabet="abcdefghjpz679";
var convertToLetters=function(n){var a=alfabet,l=a.length;return n<l?a[n]:convertToLetters(n/l-1|0)+a[n%l]};
var convertToNumber=function(c){var t=0,d=alfabet,x=-1;for(;c[t];x=++x*d.length+d.search(c[t++]));return x};
Jednocześnie w ramach wynagrodzenia tego zamieszania dotychczasowym zwycięzcom (Bartkowi Szopce oraz Gustaffowi Weldonowi) chciałbym również wręczyć wejściówki na konferencję onGameStart. Za bilety podziękowania niezmiennie należą się Michałowi Budzyńskiemu!


Komentarze
Gratulacje dla kolejnych zwycięzców ;P
Drugi!!!!111 ;-)
Gratulacje :) i respect za pomysly na algorytm :)
drugi moze byc w prosty sposob pierwszy kasujac vary wewnatrz funkcji :)
Nom, gratulacje dla zwycięzców :)
Oczywiście dało się jeszcze lepiej (o dwa bajty). Proszę bardzo:
var alfabet = "abcdefghjpz679";var convertToLetters = function(n){++n;for(var r='',a=alfabet,l=a.length;r=a[--n%l]+r,n=n/l|0;);return r};
var convertToNumber = function(s,r,a,i){a=alfabet;for(i=0;s[i];)r=~~r*a.length-~a.indexOf(s[i++]);return~-r};
Tylko ja już na samym początku wmówiłem sobie, że najlepsza metoda na utworzenie zmiennych globalnych to wrzucenie ich jako argumenty funkcji.
Ogólnie to fajny konkurs, oby więcej takich :)
@Grzegorz może dziwne pytanie, ale jak wpadłeś na to aby obliczenia robić w zakresie liczb ujemnych? Tak po prostu, czy to był jakiś proces myślowy?
@opengrid metodą iteracji. Wpatrywałem się w poszczególne kawałki kodu, który już miałem i zadawałem sobie pytanie czy na pewno jest mi to potrzebne i jak to usunąć.
Jeszcze krótsza wersja jednej z funkcji ;)
var convertToLetters = function(n){for(var a=alfabet,l=a.length,r='';n>=0;n=n/l-1)r=a[n%l|0]+r;return r};
211:
var convertToLetters = function(n){for(var a=alfabet,c='',l=a.length;c=a[n%l]+c,n=n/l|0,n--;);return c};var convertToNumber = function(s,i,v){with(alfabet)for(i=v=0;s[i];v=v*length-~indexOf(s[i++]));return~-v};
@opengrid Grzegorz chyba nie tyle operuje na liczbach ujemnych, co pomysłowo wykorzystuje fakt, że
~x == -x-1@wojtekk Sprytne, że też na to nie wpadłem! A też zastanawiałem się, jak wykorzystać fakt, że po pętli for i tak muszę wstawić średnik :)
To może spróbujemy wspólnymi siłami zebrać razem najkrótszy zestaw funkcji? ;)