Po spędzeniu trochę czasu na Stack Exchange mogę rozpoznać większość stron w Hot Network Questions po ich małej ikonie (która jest również ich faviconem ), ale na pewno nie wszystkie. Napiszmy program, który potrafi! Masz napisać kod, który określa stronę, biorąc pod uwagę jeden z (obecnie) 132 ulubionych, w tym przepełnienie stosu w języku japońskim (które jest nadal w prywatnej wersji beta):
W GitHub przesłałem plik ZIP ze wszystkimi tymi obrazami w formacie PNG . Kliknij przycisk „Raw”, aby go pobrać. Kolejność powyższych ikon to kolejność alfabetyczna nazw plików w pliku zip.
Odpowiednie nazwy witryn (w tej kolejności) to:
Uwagi:
- Mam usunięte
®
zLEGO® Answers
aExpressionEngine® Answers
, więc nie trzeba się martwić o Unicode. - Z tego samego powodu użyłem angielskich nazw przelewów stosu w języku japońskim i portugalskim.
- Ikony nauk o ziemi i języka hiszpańskiego są nie do odróżnienia. Dlatego, biorąc pod uwagę jedną z tych ikon, Twój kod może zwrócić dowolną z tych stron (twojego wyboru). To samo dotyczy Magento i sztuk walki .
Zasady
Możesz napisać program lub funkcję, która
- odbiera (lokalną) nazwę pliku obrazu przez STDIN, argument wiersza poleceń lub argument funkcji lub otrzymuje zawartość pliku obrazu przez STDIN
- zwraca lub drukuje do STDOUT nazwę strony, jak wymieniono powyżej.
Twój kod musi poprawnie rozpoznawać wszystkie 132 witryny (z wyjątkiem wspomnianym powyżej).
Nie możesz przyjmować żadnych założeń dotyczących nazwy pliku (tak się nazywa codegolf.png
). Możesz założyć, że obraz ma wymiary 16 x 16 i że rzeczywiście będzie to jeden ze 132 zdjęć powyżej. Powyższe obrazy to wszystkie PNG, ale możesz użyć dowolnego wygodnego formatu grafiki rastrowej, ale będziesz musiał przekonwertować je samodzielnie. Nie należy przyjmować żadnych założeń dotyczących rzeczywistego strumienia bajtów pliku obrazu, poza tym, że jest to prawidłowy obraz w dowolnym wybranym formacie. W szczególności, jeśli istnieje wiele sposobów kodowania tego samego obrazu w twoim formacie (np. Poprzez dodanie nieistotnych pól do sekcji nagłówka), twój kod musi działać dla wszystkich z nich. Krótko mówiąc, twój kod powinien polegać tylko na samych wartościach pikseli, bez szczegółów pliku, który go koduje.
Jak zwykle nie można pobierać żadnych danych z Internetu. Musisz określić witrynę na podstawie samego obrazu.
Możesz użyć funkcji wbudowanych lub zewnętrznych, aby odczytać plik obrazu i uzyskać listę wartości kolorów, ale nie możesz używać żadnych innych istniejących funkcji przetwarzania obrazu.
To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach).
źródło
pngcrush
nie będą istnieć.Odpowiedzi:
Python 3.x + poduszka,
230118941878 bajtówChodzi o to, aby zaszyfrować obraz i znaleźć odpowiedni ciąg ze słownika (podobnie jak inne odpowiedzi).
Kluczowy kod to:
Otwieramy plik, a następnie przekształcamy go w 1024-bajtowy ciąg wartości RGBA. Po odrobinie eksperymentów okazuje się, że suma kontrolna ADLER-32 co szósty bajt tego ciągu bajtów jest unikalna dla tych 132 obrazów. A następnie dalsze testy pokazują, że biorąc moduł sumy kontrolnej z 2003 roku daje najmniejszy słownik.
Oryginalny słownik wygląda następująco:
Zauważyliśmy, że wszystkie nazwy witryn nie zawierają liczb. Dlatego możemy połączyć cały słownik w jeden ciąg:
A następnie użyj wyrażenia regularnego np. W
1969(\D+)
celu wyodrębnienia nazwy witryny. Ten ogromny ciąg jest następnie kompresowany w celu zaoszczędzenia miejsca (pozwól, aby silnik kompresji zauważył wiele wystąpień „Języka”), a na koniec zakodowany w standardzie Base-85.Ponieważ teraz jest on również oznaczony jako złożoność kolmogorowa , tutaj jest 2394-bajtowe rozwiązanie, które nie używa kompresji (zlib jest nadal importowany dla adler32).
źródło
.tobytes()
pobiera dane w pikselach (16 × 16 × 4 = 1024), więc opiera się na obrazie. Plik musi być jednak w RGBA.C #, 2760 bajtów
Moje rozwiązanie nie używa mieszania, analizuje poszczególne piksele obrazu i na podstawie tego decyduje. Odkryłem, że wystarczyło zbadać niebieski komponent obrazu modulo 9. Chodzi o to, aby wielokrotnie rozdzielać w oparciu o wartość pixel.B% 9, tak jak poniżej:
Za pomocą skryptu wygenerowałem następujący monstrualny program (5197 bajtów), który rozwiązuje problem za pomocą binarnego drzewa decyzyjnego:
Niektóre osoby korzystały z wbudowanych funkcji kompresji w swoich rozwiązaniach. Zrobiłem własny, pisząc skrypt, który identyfikuje typowe podciągi i zastępuje je skrótami jednoznakowymi. Kod jest kompresowany do następującego ciągu 2502 bajtów:
Słownik potrzebny do dekompresji to zaledwie 108 bajtów:
Słownik używa średników jako separatora i zawiera pojedyncze znaki, a następnie ich dekompresję. Aby zdekompresować, „:” zostanie najpierw zastąpione przez „&”, a następnie „<” przez „%!”, „|” przez „ic” i tak dalej. Dekompresja ciągu c może być wyrażona w dość zwięzły sposób:
Następnie po dekompresji korzystam z czarnej magii refleksyjnej, aby skompilować kod w locie i uruchomić go:
Zauważ, że przykłady użyte tutaj dla wyjaśnienia nieco różnią się od tych użytych w rozwiązaniu bajtowym 2876.
źródło
Node.js,
3178313026672608 bajtówOblicza skrót SHA1 danych obrazu każdego pliku i używając bajtów od 16 do 19 skrótu szesnastkowego indeksuje nazwy witryn.
Używając bajtów od 12 do 16 skrótu szesnastkowego skrótu SHA1 każdego pliku, indeksuje nazwy witryn. Może istnieć krótsza kombinacja wykorzystująca tylko 3 bajty skrótu szesnastkowego.źródło
h="17352368".match(/.{4}/g)
(skróty 4-znakowe, podzielone na tablicę),s="MathOverflow;StackOverflow in Portuguese".split(";")
(nazwy oddzielone znakiem;), a następnie ponownie zbierz wszystko razem:t={}h.forEach(function(k,i){t[k]=s[i]})
(wynikiem jest ten sam obiekt co kod). Jest 132 średników, więc nawet jeśli zmienisz znak na 2-bajtowy (OP mówi, że w nazwach stron nie powinno być Unicode), zaoszczędzisz miejsce. Możesz także dodać optymalizację @manatwork oprócz tej dodatkowej oszczędności.split()
s: nam pojedynczy ciąg znaków, np. „1234Site; 5678Other”. Następnie, zakładając, że nie dojdzie do konfliktu między fragmentami skrótu a nazwami witryn, wystarczy jedenmatch()
:function $(e){r=require;return"8d4fAcademia;3a6dAndroid Enthusiasts;5caeAnime & Manga;804cAsk Different;bef3Arduino".match(r("crypto").createHash("sha1").update(r("fs").readFileSync(e)).digest("hex").slice(12,16)+"([^;]+)")[1]}
Python 2.7,
19061889 bajtówTo rozwiązanie wykorzystuje CRC32 na danych pikselowych, aby stworzyć unikalny 2-cyfrowy podstawowy identyfikator 95. Indeks identyfikatora jest następnie używany do wyszukiwania ciągu odpowiedzi.
Problem polegał na znalezieniu kombinacji funkcji w stylu skrótu, w wyniku których 132 (lub 131) małych, ale unikalnych etykiet. Wypróbowałem kilka opcji, zanim zdecydowałem się na tę. Wydaje się dość zwarty.
Program wykorzystuje Python PIL do odczytu danych pikselowych z pliku.
Python 2.7 2150 bajtów
To jest wersja bez użycia bibliotek kompresji lub kodowania. Lista wymiany stosów jest kompresowana za pomocą prostej metody wymiany. Znaki, które nie są używane w tekście:
są używane do przechowywania wspólnych odcinków łańcucha. Tekst jest nieskompresowany
for k,v in [(v[0],v[1:]) for v in K.split('|')]:T=T.replace(k,v)
linią. Dwuznakowa tabela indeksowania jest taka sama jak w powyższym programie.źródło
C #, 2672 bajtów
Tabela (ciąg) etykiet i częściowe skróty SHA są kompresowane w celu zaoszczędzenia kilku bajtów. Oryginalny słownik wygląda następująco:
źródło
var
powinien zabezpieczyć kilka bajtów. 2) Co jest z budowniczym ciągu? Nie widzę tego używanego. 3) równieżStreamReader.ReadToEnd
może trochę pomóc.