Wzór referencyjny Tuppera (skopiowany z Wikipedii)
Samoreferencyjna formuła Tuppera jest formułą zdefiniowaną przez Jeffa Tuppera, która po wykreśleniu w dwóch wymiarach w bardzo konkretnym miejscu w płaszczyźnie może być „zaprogramowana” w celu wizualnego odtworzenia samej formuły. Jest wykorzystywany na różnych kursach matematycznych i informatycznych jako ćwiczenie w formułach graficznych.
Gdzie jest funkcja podłogi.
Niech k
będzie następujący 543-cyfrowy numer:
960939379918958884971672962127852754715004339660129306651505519271702802395266424689642842174350718121267153782770623355993237280874144307891325963941337723487857735749823926629715517173716995165232890538221612403238855866184013235585136048828693337902491454229288667081096184496091705183454067827731551705405381627380967602565625016981482083418783163849115590225610003652351370343874461848378737238198224849863465033159410054974700593138339226497249461751545728366702369745461014655997933798537483143786841806593422227898388722980000748404719
Jeśli jeden wykresy zbiór punktów (x, y)
w 0 <= x < 106
i k <= y < k + 17
spełniającą nierówność podane powyżej, otrzymany wykres wygląda następująco (zauważ, że osie w tej działki zostały odwrócone, w przeciwnym razie obraz wychodzi do góry nogami):
Więc co?
Ciekawą rzeczą w tej formule jest to, że można jej użyć do wykreślenia dowolnego możliwego czarno-białego obrazu 106x17. Teraz przeszukiwanie w celu wyszukiwania byłoby niezwykle uciążliwe, więc istnieje sposób, aby obliczyć wartość k, w której pojawia się twój obraz. Proces jest dość prosty:
- Zacznij od dolnego piksela pierwszej kolumny obrazu.
- Jeśli piksel jest biały, do wartości k zostanie dodane 0. Jeśli jest czarny, dodaj 1.
- Przejdź w górę kolumny, powtarzając krok 2.
- Na końcu kolumny przejdź do następnej kolumny i zacznij od dołu, wykonując ten sam proces.
- Po przeanalizowaniu każdego piksela przekonwertuj ten ciąg binarny na dziesiętny i pomnóż przez 17, aby uzyskać wartość k.
Jaka jest moja praca
Twoim zadaniem jest stworzenie programu, który może przyjmować dowolny obraz 106x17 i wyświetlać odpowiednią wartość k. Możesz przyjąć następujące założenia:
- Wszystkie obrazy będą miały dokładnie 106 x 17
- Wszystkie obrazy będą zawierać tylko czarne (# 000000) lub białe (#FFFFFF) piksele, nic pomiędzy.
Jest też kilka zasad:
- Dane wyjściowe to po prostu wartość k. Musi mieć odpowiednią podstawę, ale może mieć dowolny format.
- Obrazy należy odczytać z pliku PNG lub PPM.
- Brak standardowych luk.
Testuj obrazy
[ ] powinien dać ~ 1,4946x10 542
[ ] powinien dać ~ 7,2355x10 159
[ ] powinien dać 2 1801 * 17
[ ] powinien produkować (2 1802 -1) * 17
Sprawdź tę listę, aby uzyskać dokładne rozwiązania.
To jest golf golfowy , więc wygrywa najmniejsza liczba bajtów.
Przydatne linki
quine
gdzieś to słowo zobaczę .Odpowiedzi:
CJam, 16 lat
Z wielkimi podziękowaniami dla Dennisa. Wypróbuj online
W przypadku problemów z adresem URL przetestowałem dane wejściowe:
Użyłem formatu wygenerowanego przez GIMP podczas eksportowania jako ASCII pbm, z usuniętym komentarzem.
Wyjaśnienie:
źródło
l;l~\qN-/W%zs:~2b*
powinno działać równie dobrze.Pyth - 21 bajtów
Prosty w obsłudze z
i
podstawową konwersją Pytha . Pobiera dane wejściowe jakoPBM
nazwę pliku i odczytuje za pomocą'
polecenia. Musiałem użyć!M
do zanegowania czerni i bieli. Wszystko inne jest oczywiste.Wypróbuj tutaj online . (Tłumacz internetowy nie może odczytać plików, dlatego został zmodyfikowany i pobiera plik jako dane wejściowe).
źródło
Python 2:
133110 bajtówPierwsza próba w Pythonie przy użyciu PIL:
Dzięki pomocnym komentującym poniżej
źródło
from PIL import Image k=0 for a in range(1802):y=a%17;x=a/17;k=(0 if Image.open(input()).load()[x,16-y][0]else 1)+k*2 print k*17
a/17
ia%17
w odpowiednich lokalizacjach, a także możesz nadużywać faktu, że 1 jest prawdą, a 0 jest fałszem. Oto wynik tych zmian, będziesz miał do 111 bajtów :)input()
wywoływana jest przy każdej iteracji pętli z tą modyfikacją. Dziękuję za edycję z innymi wskazówkami.(...<1) --> 0**...
może?C #, 199
To była zabawa! Nie ma nic złego w przeładowaniu bitmapy 106 * 17 razy, prawda? Zrobiłem to w celu zaoszczędzenia niektórych bajtów, nie jestem pewien, czy to legalne.
i
to nazwa pliku wejściowego.Ponadto jako pojedyncze wyrażenie tylko dlatego, że jest to jedno wyrażenie, z
i
podanym lub podrzędnym (167 bajtami)źródło
Mathematica 69 bajtów
Binarize @ można pominąć, jeśli obraz ma format monochromatyczny.
Ta funkcja odtworzy obraz:
źródło