Tuppers Selbstreferenzformel (kopiert aus Wikipedia)
Tuppers Selbstreferenzformel ist eine von Jeff Tupper definierte Formel, die, wenn sie in zwei Dimensionen an einer bestimmten Stelle in der Ebene grafisch dargestellt wird, so programmiert werden kann, dass sie die Formel selbst visuell reproduziert. Es wird in verschiedenen Kursen in Mathematik und Informatik als Übung für grafische Formeln verwendet.
Wo ist die Bodenfunktion.
Es k
sei die folgende 543-stellige Zahl:
960939379918958884971672962127852754715004339660129306651505519271702802395266424689642842174350718121267153782770623355993237280874144307891325963941337723487857735749823926629715517173716995165232890538221612403238855866184013235585136048828693337902491454229288667081096184496091705183454067827731551705405381627380967602565625016981482083418783163849115590225610003652351370343874461848378737238198224849863465033159410054974700593138339226497249461751545728366702369745461014655997933798537483143786841806593422227898388722980000748404719
Wenn man Graphen die Menge der Punkte (x, y)
in 0 <= x < 106
und k <= y < k + 17
die Ungleichung gegeben oben, die resultierende Graph sieht wie folgt aus (beachten Sie, dass die Achsen in diesem Diagramm sind vertauscht, da sonst das Bild kommt aus dem Kopf nach unten):
Na und?
Das Interessante an dieser Formel ist, dass sie verwendet werden kann, um alle möglichen Schwarzweißbilder mit 106 x 17 zu zeichnen. Das Durchsuchen zur Suche wäre extrem mühsam. Sie können also den k-Wert ermitteln, auf dem Ihr Bild angezeigt wird. Der Prozess ist ziemlich einfach:
- Beginnen Sie mit dem unteren Pixel der ersten Spalte Ihres Bildes.
- Wenn das Pixel weiß ist, wird eine 0 an den k-Wert angehängt. Wenn es schwarz ist, fügen Sie eine 1 hinzu.
- Verschieben Sie die Spalte nach oben und wiederholen Sie Schritt 2.
- Wechseln Sie am Ende der Spalte zur nächsten Spalte und beginnen Sie von unten nach dem gleichen Verfahren.
- Nachdem jedes Pixel analysiert wurde, konvertieren Sie diese Binärzeichenfolge in eine Dezimalzahl und multiplizieren Sie sie mit 17, um den k-Wert zu erhalten.
Was ist mein Job?
Ihre Aufgabe ist es, ein Programm zu erstellen, das ein beliebiges 106x17-Bild aufnehmen und dessen entsprechenden k-Wert ausgeben kann. Sie können folgende Annahmen treffen:
- Alle Bilder werden genau 106x17 sein
- Alle Bilder enthalten nur schwarze (# 000000) oder weiße (#FFFFFF) Pixel, nichts dazwischen.
Es gibt auch ein paar Regeln:
- Ausgabe ist einfach der k-Wert. Es muss sich in der richtigen Basis befinden, kann aber in jedem Format vorliegen.
- Bilder müssen entweder aus einem PNG oder PPM gelesen werden.
- Keine Standardlücken.
Bilder testen
[ ] sollte ~ 1,4946 x 10 542 ergeben
[ ] sollte ~ 7.2355x10 159 ergeben
[ ] sollte 2 1801 * 17 ergeben
[ ] sollte (2 1802 -1) * 17 ergeben
In dieser Übersicht finden Sie die genauen Lösungen.
Das ist Code-Golf , also gewinnt die geringste Anzahl von Bytes.
Nützliche Links
quine
irgendwo sehen werde, bevor ich zum Teil "Was ist mein Job" komme .Antworten:
CJam, 16
Vielen Dank an Dennis. Probieren Sie es online aus
Falls Sie Probleme mit der URL haben, ist dies die Eingabe, die ich getestet habe:
Ich habe das Format verwendet, das GIMP beim Exportieren als ASCII-PBM generiert hat, wobei der Kommentar entfernt wurde.
Erläuterung:
quelle
l;l~\qN-/W%zs:~2b*
sollte das genauso gut funktionieren.Pyth - 21 Bytes
Einfach mit Pyths
i
Basis-Konvertierung zu tun . Übernimmt die Eingabe alsPBM
Dateinamen und liest mit dem'
Befehl. Ich musste verwenden!M
, um Schwarze und Weiße zu negieren. Alles andere ist selbsterklärend.Probieren Sie es hier online . (Der Webinterpreter kann keine Dateien lesen, wird also geändert und verwendet die Datei als Eingabe.)
quelle
Python 2:
133110 BytesEin erster Versuch in Python mit PIL:
Vielen Dank an hilfreiche Kommentatoren unten
quelle
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
unda%17
an den entsprechenden Stellen, und man kann die Tatsache , dass Missbrauch 1 truthy ist und 0 ist falsy. Hier ist das Ergebnis dieser Änderungen, Sie werden bis zu 111 Bytes sein :)input()
bei jeder Iteration der Schleife mit dieser Änderung aufgerufen. Bearbeitung mit anderen Tipps, danke.(...<1) --> 0**...
vielleicht?C # 199
Das hat Spaß gemacht! Es ist nichts Falsches daran, eine Bitmap 106 * 17 Mal neu zu laden, richtig? Ich habe es als eine Funktion getan, um einige Bytes zu speichern, nicht sicher, ob das legal ist.
i
ist der Name der Eingabedatei.Auch als einzelner Ausdruck, nur weil es sich um einen Ausdruck handelt, mit
i
bereitgestelltem oder untergeordnetem Wert (167 Byte).quelle
Mathematica 69 Bytes
Das Binarize @ kann weggelassen werden, wenn das Bild einfarbig ist.
Diese Funktion gibt das Bild wieder:
quelle