| Autor | Beitrag | 
| Gausi 
          Beiträge: 8550
 Erhaltene Danke: 478
 
 Windows 7, Windows 10
 D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
 
 | 
Verfasst: Sa 09.12.06 11: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 12: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 12: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 12: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 12: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 12: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 12: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 12: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 12: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 12: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 13: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 13: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 13: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 14: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 20: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 20: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: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: So 10.12.06 21: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 21: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: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: So 10.12.06 21: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 06: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 06: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 15: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.
 | 
|  |