Dies ist ein selbstreferenzielles Problem


49

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.

Tuppers Selbstreferenzformel

Wo Fußboden ist die Bodenfunktion.

Es ksei die folgende 543-stellige Zahl: 960939379918958884971672962127852754715004339660129306651505519271702802395266424689642842174350718121267153782770623355993237280874144307891325963941337723487857735749823926629715517173716995165232890538221612403238855866184013235585136048828693337902491454229288667081096184496091705183454067827731551705405381627380967602565625016981482083418783163849115590225610003652351370343874461848378737238198224849863465033159410054974700593138339226497249461751545728366702369745461014655997933798537483143786841806593422227898388722980000748404719

Wenn man Graphen die Menge der Punkte (x, y)in 0 <= x < 106und k <= y < k + 17die 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):

Ergebnis der Selbstreferenzformel von Tupper

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:

  1. Beginnen Sie mit dem unteren Pixel der ersten Spalte Ihres Bildes.
  2. Wenn das Pixel weiß ist, wird eine 0 an den k-Wert angehängt. Wenn es schwarz ist, fügen Sie eine 1 hinzu.
  3. Verschieben Sie die Spalte nach oben und wiederholen Sie Schritt 2.
  4. Wechseln Sie am Ende der Spalte zur nächsten Spalte und beginnen Sie von unten nach dem gleichen Verfahren.
  5. 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:

  1. Alle Bilder werden genau 106x17 sein
  2. Alle Bilder enthalten nur schwarze (# 000000) oder weiße (#FFFFFF) Pixel, nichts dazwischen.

Es gibt auch ein paar Regeln:

  1. Ausgabe ist einfach der k-Wert. Es muss sich in der richtigen Basis befinden, kann aber in jedem Format vorliegen.
  2. Bilder müssen entweder aus einem PNG oder PPM gelesen werden.
  3. Keine Standardlücken.

Bilder testen

[ Nintendo] sollte ~ 1,4946 x 10 542 ergeben

[ Eine große Anzahl] sollte ~ 7.2355x10 159 ergeben

[ 2 ^ 1801 * 17] sollte 2 1801 * 17 ergeben

[ 2 ^ 1802 - 1 * 17] sollte (2 1802 -1) * 17 ergeben

In dieser Übersicht finden Sie die genauen Lösungen.

Das ist , also gewinnt die geringste Anzahl von Bytes.


Nützliche Links

Wikipedia

Wolfram Mathworld


Kann ich ein PPM aufnehmen?
Maltysen,

BEARBEITEN: Ja, das PPM-Format ist zulässig. Als ich mit dem Programm anfing, wollte ich, dass PNGs verwendet werden, aber wenn ich PPM zulasse, sollten mehr Golfsprachen teilnehmen können.
Kade,

3
Als ich diese Frage las, war ich mir sicher, dass ich das Wort quineirgendwo sehen werde, bevor ich zum Teil "Was ist mein Job" komme .
Jacob

Ich werde nicht so tun, als ob ich ein Programmierer wäre, der so etwas kann, sondern ich werde einfach eine unschuldige, ernsthafte Frage stellen: Ja, aber kann es auch umgekehrt gemacht werden? Dh die Lösung einspeisen und die * .png als Ergebnis sehen?

@NotAsSharpAsYouGuys: Wenn Sie eine Arithmetik mit beliebiger Genauigkeit verwenden, ist dies trivial. Sie müssen nur das Ergebnis dieser Formel für jedes Pixel überprüfen und das resultierende Bild ausgeben.
Matteo Italia

Antworten:


12

CJam, 16

l,l~q:~f*/W%ze_b

Vielen Dank an Dennis. Probieren Sie es online aus

Falls Sie Probleme mit der URL haben, ist dies die Eingabe, die ich getestet habe:

P1
106 17
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000011111100000000000000000000000
0000000000000000000000000000000000000000000000000000000000000111111000
0000011111100110000000000000000000000000000000000000000000000000000000
0000000000000000000000000110011111100000100111100001000000000000001100
0110000000000000000000000000000000000000000000000000000000001000011110
0100010011111100001000000000000100101001110000000000000000000000000000
0011000000000000000000000100001111110010010110000110001000000000000100
0110010010000000011000000000000000000100100000000000000000000100011000
0110101111000000111111000000000001000110010011111100100100111001111100
0111001011110000000000000011111100000011111111000000110111000000000001
0000100111100000110000110001100000101000001100001000000000000011101100
0000111110110000001000010000000000010010000100100110011001100100100110
0100110010011001000000000000100001000000110110011000011000010000000000
0100110001001001100110011000001001100100110010011001000000000000100001
1000011001100111111111001100000000000100110001001001100110011001111001
1001001100100110010000000000001100111111111001101111111111111100000000
0001001010010010011001100101000110011001100000110000100000000000001111
1111111111010111001001001110000000000000110001101101100110011000111001
1001100111110011110000000000000001110010010011100010001001000100000000
0000000000000000000000000000000000000000000000000000000000000000000000
1000100100010000100000000001000000000000000000000000000000000000000000
0000000000000000000000000000000000001000000000010000010000000010000000
0000000000000000000000000000000000000000000000000000000000000000000000
0001000000001000000011111111000000000000000000000000000000000000000000
0000000000000000000000000000000000000000111111110000

Ich habe das Format verwendet, das GIMP beim Exportieren als ASCII-PBM generiert hat, wobei der Kommentar entfernt wurde.

Erläuterung:

l,    read the first line ("P1" magic number) and get its length (2)
l~    read and evaluate the second line (106 17)
q     read the rest of the input (actual pixels)
:~    evaluate each character ('0' -> 0, '1' -> 1, newline -> nothing)
f*    multiply each number by 17
/     split into rows of length 106
W%    reverse the order of the rows
z     transpose
e_    flatten (effectively, concatenate the lines)
      now we have all the pixels in the desired order, as 0 and 17
b     convert from base 2 "digits" to a number

Ich habe es in der URL für Sie.
mbomb007

@ mbomb007 danke, nicht sicher, was schief gelaufen ist.
Aditsu

Wenn Sie sich nicht mit Kommentaren auseinandersetzen müssen, l;l~\qN-/W%zs:~2b*sollte das genauso gut funktionieren.
Dennis

@Dennis OMG, da gibt es mehrere Ebenen der Brillanz :) Willst du es selbst posten?
Aditsu

Ich glaube nicht, dass sich eine separate Antwort von Ihrer ausreichend unterscheidet.
Dennis

17

Pyth - 21 Bytes

Einfach mit Pyths iBasis-Konvertierung zu tun . Übernimmt die Eingabe als PBMDateinamen und liest mit dem 'Befehl. Ich musste verwenden !M, um Schwarze und Weiße zu negieren. Alles andere ist selbsterklärend.

*J17i!MsC_cJrstt.z7 2

Probieren Sie es hier online . (Der Webinterpreter kann keine Dateien lesen, wird also geändert und verwendet die Datei als Eingabe.)


60
Ich halte nichts in Pyth für selbsterklärend. : /
Alex A.

3
Keine Sprache, die ich kenne, kann diese schlagen. Aber andererseits ist keine der Sprachen, die ich kenne, "wie geschaffen fürs Golfen".
Mahesh

Der Link kann nicht geöffnet werden, der Pfad ist zu lang. (Safari 8.1)
Kametrixom

Ihr Beispielbild scheint falsch zu sein. Meinten Sie P2 statt P3?
Aditsu

Oh warte, es ist nicht einmal P2, es sieht aus wie P1, aber invertiert
aditsu

9

Python 2: 133 110 Bytes

Ein erster Versuch in Python mit PIL:

from PIL.Image import*
j=open(input()).load()
a=k=0
while a<1802:k=(j[a/17,16-a%17][0]<1)+k*2;a+=1
print k*17

Vielen Dank an hilfreiche Kommentatoren unten


2
Da Sie Image.open (input ()). load nur einmal verwenden und es nicht so aussieht, als würden Sie es ändern, wäre es nicht besser, es so zu verwenden, wie es ist, anstatt ein var j zu verwenden? Es wäre so etwas wie diesfrom 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
Katenkyo

3
Weiter auf @ Katenkyo der Punkt, können Sie auch in nur Stecker a/17und a%17an 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 :)
Kade

@ Kateyenko, wird leider input()bei jeder Iteration der Schleife mit dieser Änderung aufgerufen. Bearbeitung mit anderen Tipps, danke.
joc

1
(...<1) --> 0**...vielleicht?
Sp3000,

7

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.

BigInteger s(string i){return (Enumerable.Range(0,106).SelectMany(x=>Enumerable.Range(0,17).Select(y=>new BigInteger(new Bitmap(i).GetPixel(x,y).B==0?1:0)).Reverse()).Aggregate((x,y)=>(x<<1)+y)*17);}

i ist der Name der Eingabedatei.

Auch als einzelner Ausdruck, nur weil es sich um einen Ausdruck handelt, mit ibereitgestelltem oder untergeordnetem Wert (167 Byte).

(Enumerable.Range(0,106).SelectMany(x=>Enumerable.Range(0,17).Select(y=>new BigInteger(new Bitmap(i).GetPixel(x,y).B==0?1:0)).Reverse()).Aggregate((x,y)=>(x<<1)+y)*17)

1
Die Frage lautet: "Ihre Aufgabe ist es, ein Programm zu erstellen ..."
Sean Latham

1

Mathematica 69 Bytes

17*FromDigits[1-Flatten[Reverse/@Transpose[ImageData@Binarize@#]],2]&

Das Binarize @ kann weggelassen werden, wenn das Bild einfarbig ist.

Diese Funktion gibt das Bild wieder:

   ArrayPlot[Table[Boole[1/2<Floor[Mod[Floor[y/17]2^(-17Floor[x]-Mod[Abs[y],17]),2]]],{y,1+#,17+#},{x,106,1,-1}]]&
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.