Autor |
Beitrag |
Gausi
Beiträge: 8538
Erhaltene Danke: 475
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Sa 09.12.06 12:55
Das Nachrichten-Rätsel. Die Auflösung.
Die Nachricht kam natürlich von Mr.Spock und lautete " Lebe lang und in Frieden". Ich möchte jetzt übrigens nicht darüber streiten, ob das die angemessene Übersetzung des englischen Originals "Live long and prosper" ist, oder ob es besser "Lebe lang und erfolgreich" heißen muss.
Mit dem ersten Tipp war klar, dass die Nachricht ein Bild ist. Beim zweiten Hinweis war das Stichwort "Arecibo-Botschaft" das Wichtige, denn dort wurde dasselbe Prinzip angewandt. Ein Bild, dessen Höhe und Breite einer Primzahl entspricht, wurde in eine einfache Abfolge von Nullen und Einsen transformiert. Für die Anordnung als Bild gibt es dann nur zwei Möglichkeiten, da die Länge dieser 0-1-Folge gerade das Produkt zweier Primzahlen ist.
Außerirdische Lebensformen sind natürlich technisch etwas weiter wie wir und begnügen sich nicht mit Schwarz-Weiß-Bildern, sondern senden in Farbe. Daher kam die Nachricht nicht als 0-1-Folge bei uns an, sondern als Folge von RGB-Werten, die sich mit Delphi recht einfach zu einem Bild zusammenfügen lassen.
Und für die wenigen, die Mr.Spock und Star Trek nicht kennen: Das Bild findet man ganz leicht über die Google-Bildersuche.
Im Anhang findet ihr eine mögliche Lösung. In dem Projekt ist auch der Code zur Erzeugung einer solchen Nachricht aus einem Bild enthalten. Die entsprechenden Buttons sind aber der Übersichtlichkeit halber disabled.
Andere Lösungsansätze für diese Aufgabe können wieder in diesem Thread geposted und/oder diskutiert werden.
Einloggen, um Attachments anzusehen!
_________________ We are, we were and will not be.
|
|
Chryzler
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: Sa 09.12.06 13:04
Danke für die Auflösung. An die Primzahl hatte ich gar nicht gedacht, hab einfach solange die Breite und Höhe ausprobiert, bis ein anständiges Bild rauskam.
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Sa 09.12.06 13:07
Hier das ganze noch als C#-Programm
Die Nachricht bitte aus dem ersten Beitrag nehmen
Einloggen, um Attachments anzusehen!
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
coder62
Hält's aus hier
Beiträge: 29
|
Verfasst: Sa 09.12.06 13:10
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| <?php $handle = fopen ("./Nachricht.txt", "r"); $i = 0; $i2 = 0; header ("Content-type: image/png"); $im = @imagecreatetruecolor (253, 199); $background_color = ImageColorAllocate ($im, 255, 255, 255); $pixel_color = array(); while (!feof($handle)) { $rrgb = translate(trim(fgets($handle, 4096))); if(!isset($pixel_color[$rrgb[0].$rrgb[1].$rrgb[2]])){ $pixel_color[$rrgb[0].$rrgb[1].$rrgb[2]] = ImageColorAllocate ($im, $rrgb[0],$rrgb[1],$rrgb[2]); } imagesetpixel($im,$i2,$i,$pixel_color[$rrgb[0].$rrgb[1].$rrgb[2]]); if($i2 == 263){ $i++; $i2 = 0; } $i2++; }
ImagePNG ($im); fclose ($handle);
function translate($zahl){ $rgb = array(); $hexv = dechex($zahl); while(strlen($hexv)<6){ $hexv = '0'.$hexv; } $rgb[0] = hexdec(substr($hexv,0,2)); $rgb[1] = hexdec(substr($hexv,2,2)); $rgb[2] = hexdec(substr($hexv,4,2)); return $rgb; } ?> |
das ist meine lösung mit php erstellt, fands lustig hatte erste 350 inner breite (durch ausprobieren), man konnte das bild trotzdem erkennen sah nur hologrammässig aus und spock war mehrfach zu sehen
|
|
Dragonclaw
Beiträge: 196
Windows Vista
Delphi 7 Prof.
|
Verfasst: Sa 09.12.06 13:41
Ich habs so gemacht. Wollte eigentlich auch erst den Text in ne Listbox laden und von da aus. Das ist aber sehr langsam. Direkt aus der Datei lesen ist, meiner Meinung nach viel schneller. Die Weite hab ich halt rausgefunden in dem ich einfach ne Schleife hab laufen lassen die das Bild immer und immer wieder zeichnet, jeweils immer einen pixel breiter.
Hier der Code:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TForm1.Button1Click(Sender: TObject); var s, dir : String; i : Integer; f : TextFile; begin x := -1; y := 1; weite := Edit1.text; dir := 'Nachricht.txt'; AssignFile (f, dir); Reset (f); while not EOF(f)do begin ReadLn(f, s); inc(x); if x > weite then begin x := 0; inc(y); end; Form1.Canvas.Pixels[x,y]:=strtoint('$' + inttohex(strtoint(s),2)); end; end; |
Zuletzt bearbeitet von Dragonclaw am Sa 09.12.06 13:42, insgesamt 1-mal bearbeitet
|
|
F34r0fTh3D4rk
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Sa 09.12.06 13:42
ich hab die breite nicht durch probieren oder durch primzahlen herausbekommen, sondern dadurch dass die differenz an einem punkt der grafik ziemlich groß ist, und zwar immer dann wenn eine neue reihe anfängt und dieses intervall ist die breite. das muss aber nicht auf jedes bild zutreffen.
mfg
Zuletzt bearbeitet von F34r0fTh3D4rk am Sa 09.12.06 13:43, insgesamt 1-mal bearbeitet
|
|
elundril
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Sa 09.12.06 13:42
die falle mit "Contact" mit Jodie Foster war fies. da ist das signal von Wega gekommen und war primzahlen.
lg el
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
F34r0fTh3D4rk
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Sa 09.12.06 13:51
wieso war das ne falle ? man sollte die lösung ja anhand der tipps finden und nicht einfach erraten
mfg
|
|
GTA-Place
Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Sa 09.12.06 14:00
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
elundril
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Sa 09.12.06 14:03
war ja ein tipp!
das war harte arbeit das zu recherchieren.
lg el
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
delfiphan
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Sa 09.12.06 14:15
Im Anhang mein Image-Loader mit integrierter Bildgrössenerkennung (Primfaktorenzerlegung+Korrelationstest für Breit-/Hochformat; Das Bild könnte natürlich noch auf dem Kopf sein, oder gespiegelt, oder gedreht. Das kann das Programm natürlich nicht automatisch erkennen ).
PS: Mathematisch gäbe es noch zwei weitere (etwas unsinnige) Lösungen: 1 ist ein Faktor, somit könnte das "Bild" auch ein Einzeiler sein.
Einloggen, um Attachments anzusehen!
|
|
Lannes
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Sa 09.12.06 15:03
Hallo,
Die Bildgrößenerkennung sah bei mir so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| i := Memo1.Lines.Count; for z := round(sqrt(i)) downto 1 do if Trunc(i/z) = i/z then begin F_X := Trunc(i/z); F_Y := Trunc(i/F_X); break; end; |
@Gausi: Da fehlt noch liste.Free
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Heiko
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: So 10.12.06 21:12
Im Anhang mein Lösungsproggi, wobei das Berechnen der Größe erst im Nachhinhein reinkam (war zuerst zu faul das reinzunehmen, da ich immer leiber probiere (wobei lustige effekte rauskamen)) .
Kann mir z.B. einer sagen, wo die Handfläche von
hier hin ist, denn unten fehlt müssten da noch ein paar Pixelreihen eigentlich hin, aber das Bild ist nicht größer ?:
Einloggen, um Attachments anzusehen!
|
|
jakobwenzel
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: So 10.12.06 21:35
so ein xor $FF hätte (ohne die Entschlüsselung) doch noch schön ausgesehen :
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 10.12.06 22:05
Tja, ich hab die Größe ähnlich wie F34r0fTh3D4rk herausgefunden...
Ich habe einen Wert gesucht, der dem des ersten Pixels ähnlich ist und der sich von dem vorherigen deutlich unterscheidet.
Jedenfalls habe ich jeden Wert in einen Integer umgewandelt und dann diese Werte nacheinander in einen Stream geschrieben.
Die resultierenden Daten habe ich dann als RAW-Daten in Paint Shop Pro geladen und die ermittelte Breite von 263 Pixel angegeben. Was dabei herauskam seht ihr unten... Es reichte mir um Spock zu erkennen .
Mit etwas anderen Parametern habe ich inzwischen bessere Ergebnisse erhalten, aber ans Originalbild kommt das nicht mal annähernd heran.
|
|
jakobwenzel
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: So 10.12.06 22:19
Ich glaub das Bild war zeilenweise aufgebaut und du hasts spaltenweise eingelesen.
Probier mal als Breite 200.
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 10.12.06 22:27
Dann ist gar nix zu erkennen . Naja, da gibts einige Einstellmöglichkeiten, ich glaube ich habe alle durchprobiert.
|
|
Heiko
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Mo 11.12.06 07:30
Einen kleinen Fehler in Gausis Lösung gefunden
Gausi hat folgendes geschrieben: | Daher kam die Nachricht nicht als 0-1-Folge bei uns an, sondern als Folge von RGB-Werten |
Die angaben in der Datei waren nicht RGB, sondern BGR .
|
|
delfiphan
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Mo 11.12.06 07:50
In Intel-Chips mit little endian wird $0000ff als Bytefolge ff 00 00 gespeichert.
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 11.12.06 16:22
So sah mein in die Tastatur gehackter Source aus ...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TForm1.Edit1Change(Sender: TObject); var X:Integer; A, B: Integer;
f: Textfile; begin X := StrToIntDef(Edit1.Text, 228);
AssignFile(F, 'nachricht.txt'); Reset(F); B := 0; While not EOF(f) do BEgin ReadLn(F, A); Canvas.Pixels[B mod X, B div X] := A; Inc(B); end; CloseFile(F); end; |
Einfach ein Edit auf's Form ziehen und die Breite eintragen ...
Edit: Die 228 ist die Wurzel der Pixelanzahl ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|