Autor |
Beitrag |
Gausi
Beiträge: 8540
Erhaltene Danke: 475
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Di 23.12.08 12:57
Weil morgen schon Heiligabend ist, und das Gewinnspiel dann endet, kommt hier der Tipp für das letzte Rätsel:
- Wem das hier zu schwer ist, dem sei gesagt: Lass einfach mal das Paranüsse knacken sein und fahr nach Paris auf eine Party. Das liegt ja nichtmal ein Parsec von hier entfernt. Unterhalte dich dort im Parlament mit ein paar paranoiden Parapsychologen über Parabeln in Parallelogrammen und Parfümherstellung im Paradies. Und wer jetzt denkt "Hier sind doch ein paar Par's zu viel...", der hat ganz recht.
Also: Viel Spaß beim Knobeln, und dabei die Weihnachtseinkäufe nicht vergessen!
_________________ We are, we were and will not be.
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 24.12.08 14:46
Weil heute Weihnachten ist - und nur deswegen - gibt es eine kleine Winkrunde mit dem Gartenzaun: - Im ersten Tipp waren ein paar Par's zuviel. Das haben ja alle verstanden (oder auch nicht ). Im Rätsel selbst ist aber auch eins zuviel drin Lässt man das weg, kommt man der Lösung schon sehr nahe...
mx
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 25.12.08 01:30
Und hier die Auflösung für das letzte Rätsel, wieder zuerst die Tipps: - Ein "Par" zu viel Par-affine Verschlüsselung Affine Chiffre
- Nun, der Tipp sollte sich dann von selbst erklären...
Die Buchstaben auf den Kerzen sind mit dem Paar (7,15) affin chiffriert und ergeben mit dem zugehörigen Paar (15,15) dechiffriert wieder:
Auf den Kerzen steht im Klartext: | Ruprecht ist doof |
Damit ist Antwort 1 die korrekte Lösung.
mx
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
GTA-Place
Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Do 25.12.08 01:35
Alles kein Problem. Rezept für ein gelugenes Rätsel 4:
Benötigt:
- Tipp 1
- Titel
- Wikipedia
- Geistesblitz (Marke Martok)
- Delphi
- BruteForce
Durchführung:
Man lese Tipp 1 ungefähr 483.482 Mal durch und verstehe nur Bahnhof. Dazu gibt man einen Geistesblitz von Martok. Hat man nun stundenlang die Wikipedia durchgelesen um herauszufinden, was Araffine Abbildungen sind, prüfe man weitere Möglichkeiten. Zum Schluss noch ein Schuss Delphi und BruteForce dazu. Fertig ist der Affine-Chifre-Knacker à la Carte.
Geschmack: *****
Anforderung: ******
Tipp: *****
Lösungsprogramm:
Siehe unten, es gab kein Lösungsprogramm
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Zuletzt bearbeitet von GTA-Place am Do 25.12.08 02:04, insgesamt 1-mal bearbeitet
|
|
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: Do 25.12.08 01:48
Fand Rätsel 4 auch mehr als gelungen. Hat auf jeden Fall Spaß gemacht ...
Benötigt:
- Tipp 1
- Titel
- Wikipedia
- Geistesblitz (Marke Martok)
- PHP
- BruteForce
Durchführung:
Man lese Tipp 1 ungefähr 4.711 Mal durch und verstehe nur Bahnhof. Dazu gibt man einen Freundlichen Hinweis von GTA. Hat man nun kurz die Wikipedia überflogen, implementiere man eine Quick&Dirty-Lösung in PHP für einen Bruteforce-Ansatz über eine Known-Plaintext-Attacke und einer Invertierungstabelle. Fertig ist der Affine-Chifre-Knacker à la Carte.
Geschmack: *****
Anforderung: ******
Tipp: *****
Lösungsprogramm:
C#-Quelltext 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:
| <?php
$s = ""; $a = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; $l = strlen($a);
$t = array(); for($x = 0; $x < strlen($s); $x++) { $t[] = strpos($a, $s[$x]); }
$b = array(1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25);
foreach($b as $j) { for($i = 0; $i < $l; $i++) { echo "<br/>\n"; echo "A = $j, B = $i: "; for($x = 0; $x < $l; $x ++) { $invtab[($j * $x + $i) % $l] = $x; } for($x = 0; $x < strlen($s); $x++) { echo $a[$invtab[$t[$x]]]; } } }
?> |
_________________ 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.
|
|
Martok
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Do 25.12.08 01:59
Jup, war auf jeden fall geil
Benötigt:
- Tipp 1
- Titel
- Wikipedia
- Geistesblitz (Marke Eigenbau)
- Delphi
- BruteForce, wurde mir aber abgenommen weil jemand schneller war
Durchführung:
Man lese die Frage und verstehe nur Bahnhof. Dann lasse man das etwas ziehen und warte auf Tipp Nummer 1. Streichen von par führt über Wikipedia zum Ergebnis. Implementieren einer sauberen Lösung und basteln an einer Lösung für das Negativ-mod-Problem und mitten drin Nachricht von GTA-Place kriegen weil er schon fertig ist. Damit fällt das Bruteforcen weg, fertig ist der Affine-Chifre-Knacker à la Carte.
Geschmack: *****
Anforderung: ******
Tipp: *****
Lösungsprogramm:
Delphi-Quelltext 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:
| function index2chr(idx: Smallint): char; begin Result:= chr(ord('A') + idx); end;
function chr2idx(cc: char): Smallint; begin Result:= ord(cc) - ord('A'); end;
function mod26(x: smallint): smallint; begin if X >= 0 then Result:= x mod 26 else Result:= x mod 26 + 26; end;
function Decode(s: string; a_index, b: smallint): string; var p: integer; begin Result:= s; for p:= 1 to length(s) do if s[p] in ['A'..'Z'] then Result[p]:= index2chr(mod26(crypt[a_index][1] * (chr2idx(s[p]) - b))); end; |
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
GTA-Place
Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Do 25.12.08 02:02
Achja, ich hab mein "Lösungsprogramm" vergessen:
-> Google -> www.math.temple.edu/...yptology/affine.html
-> Schlüssel solange durchprobieren, bis was sinnvolles rauskommt (BruteForce )
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
Wolle92
Beiträge: 1296
Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
|
Verfasst: Do 25.12.08 02:21
Tja, melde mich mal mit einer Nicht-Lösung:
Also, dank Yogu bin ich darauf gekommen, dass in Narses Tipp ein Hinweis drinsteht:
Normalerweise schreibt Narses "cu" unter seine Posts, diesmal hat er mx geschrieben...
Also konnte man denken:
c -> m => 2 -> 12
u -> x => 20 -> 23
Dann hat man ja die tolle Rechnung in der Chiffre:
(a * x + b) mod 26...
Okay, dann hab ich mir also nen Array mit den Werten für a gemacht und zwei for-Schleifen ineinander gepackt und a, b und die beiden für 2 und 20 errechneten Werte ausgegeben, dann nach dem Wertepaar 12, 23 gesucht...
Problem war nur: Es gab kein Wertepaar 12, 23...
Und dann war Bescherung, Essen, Lego-Käfer bauen (noch nicht fertig), Gottesdienst und dann wars halb 1 und dann war vorbei...
_________________ 1405006117752879898543142606244511569936384000000000.
|
|
Marc.
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Do 25.12.08 02:22
Benötigt:
- Tipp 1
- Titel
- Wikipedia
- Geistesblitz (BenBe "Les den Tipp nochmal genau durch...")
- Delphi
- BruteForce
Durchführung:
Man lese Tipp1 mehrmals und gibt Gausi bei jedem Durchlesen recht, dass hier doch ein paar Par's zu viel sind...
Diese Aussage nimmt man jedoch zunächst als Fakt hin, bevor einem der eigentliche Sinn dieses Satzes plötzlich erschließt.
Die Umsetzung lief daraufhin beinahe reibungslos.
Geschmack: ******
Anforderung: ****
Tipp: *******
Lösungsprogramm:
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:
| function Crypt(s: string; a, b: Integer): string; var i: integer; a1: integer; begin SetLength(Result, length(s)); for i := 1 to length(result) do begin result[i] := Chr(((Ord(s[i]) - 65) * a + b) mod 26 + 65); end; end;
function DeCrypt(s: string; a, b: Integer): string; const ar1: array[1..12] of Integer = (1, 9, 21, 15, 3, 19, 7, 23, 11, 5, 17, 25); ar: array[1..12] of Integer = (1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25); var i, j: integer; a1: integer; begin for j := 1 to 12 do if (ar[j] = a) then begin a1 := ar1[j]; break; end;
SetLength(Result, length(s)); for i := 1 to length(result) do begin result[i] := Chr((Ord(s[i]) - 65 - b + 26) * a1 mod 26 + 65); end; end; |
|
|
Jann1k
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Do 25.12.08 02:27
Bin ich eigentlich der einzige Idiot, der ne halbe Stunde lang überlegt hat was es denn bringen soll das "par" von "paar Buchstaben-Kerzen" wegzustreichen? Egal, großes Lob an das Team die Rätsel versüssen einem die Adventszeit immer wieder aufs neue.
|
|
Nersgatt
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Do 25.12.08 10:56
Diese Mod mit negativen Zahlen hat mich wahnsinnig gemacht. Dass das ein Problem ist, habe ich bisher nicht gewusst.
Wikipedia-Beispiel durchgespielt -> Zu dem Schluss gekommen, dass die da falsch gerechnet haben.
Noch eine andere Erklärung zu der Verschlüsselung gesucht -> Die rechnen ja auch falsch.... oder??
Irgendwann habe ich es dann doch zusammen bekommen und bin mit Brute Force auf die richtige Lösung gekommen. Es sind ja nur 119 Schlüssel möglich. Man hätte aber auch auf die Idee kommen können, dass der selbe Schlüssel wie in dem Wiki-Beispiel verwendet wurde. (Bei Miau war die Programmstruktur mit der vom Wiki-Beispiel ja auch sehr ähnlich).
Das ganze Zusammen ergibt folgenden grauenhaften Code (aber funktioniert):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type TSchluessel = Record a : Integer; b : Integer; End;
const ar : Array [0..11] of Integer = (1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25); const ar1 : Array [0..11] of Integer = (1, 9, 21, 15, 3, 19, 7, 23, 11, 5, 17, 25); [...] private arSchluessel : Array of TSchluessel; |
Alle möglichen Schlüsselpaare berechnen:
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:
| Procedure TForm1.FillSchluessel; var a, i, b, k : Integer; bGGT : Boolean; begin SetLength(arSchluessel, 0);
for i := low(ar) to high(ar) do begin a := ar[i]; for b := a + 1 to 25 do begin bGGT := False; for k := 2 to a do begin if (a mod k = 0) and (b mod k = 0) then begin bGGT := True; break; end; end;
if not bGGT then begin setLength(arSchluessel, high(arSchluessel) + 2); arSchluessel[high(arSchluessel)].a := a; arSchluessel[high(arSchluessel)].b := b; end;
end; end;
end; |
Mod-Krücke
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Function TForm1.Rest (wert : Integer) : Integer; begin if wert >= 0 then result := wert mod 26 else begin result := wert; while result < 0 do result := result + 26; end; end; |
Entschlüsselung:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| function TForm1.Decrypt(s: TSchluessel; sText: String): String; var a1, i, y: Integer; begin
result := ''; a1 := 0; i := 0; while (a1 = 0) and (i <= high(ar)) do begin if ar[i] = s.a then a1 := ar1[i]; inc(i); end;
for i := 1 to length(sText) do begin y := ord(sText[i]) - 65; result := result + Chr(rest(a1 * (y - s.b)) + 65); end;
end; |
Mit Brute Force alles durchprobieren:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.Button1Click(Sender: TObject); var i : Integer; begin mem.Lines.Clear; FillSchluessel; for i := 0 to high(arSchluessel) do begin mem.lines.Add(intToStr(arSchluessel[i].a) + ';' + intToStr(arSchluessel[i].b) + ' ' + Decrypt(arSchluessel[i], eText.Text)); end;
mem.Lines.Add(intToStr(mem.Lines.Count));
end; |
Ich wäre dankbar, wenn mir jemand noch etwas Hintergrundinfo zu diesem Mod-Problem mit negativen Zahlen geben könnte? Ist die Mod-Funktion bei Delphi einfach nur anders definiert?
Danke,
Jens
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Arne K.
Beiträge: 112
C# (VS 2008 Professional)
|
Verfasst: Do 25.12.08 13:57
Hallo,
ich habe mich mit PHP dran versucht und bin auch beim mod (allerdings nur bei der Dechiffrierung?) kleben geblieben. Ich habe 15 Minuten hin und her überlegt, weil mir mein Computer (calc.exe und php.exe) ebenso wie mein Taschenrechner für 60/26=2R8<=>60mod26=8 ergeben hat und nicht 3R18. Die Funktion hat sich hier ja quasi der 60 "von oben" (bzw. im Negativen "von unten") genähert? Ich habe mir dann einfach eine eigene Mod-Funktion geschrieben, die genau das gemacht hat und weiter ging's, aber der mathematische Zusammenhang ist mir da bisher auch unklar.
Ergo: Ich würde mich über eine kurze Erklärung auch freuen =)
Beste Grüße,
Arne
|
|
jakobwenzel
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: Do 25.12.08 14:05
Delphi scheint bei mod mit negativen Zahlen einfach mit dem Betrag zu rechnen.
Hier muss mans aber anders angehen, wie es auch schon im Wiki-Artikel zur Affinen Chiffre steht:
de.wikipedia.org/wik...Entschl.C3.BCsselung (letzter Satz des Abschnitts): | Anstatt durch 26 zu teilen kann man bei negativen Zahlen auch sooft 26 addieren, bis man eine positive Zahl erhält. Diese Zahl ist mit dem Rest der Division identisch.
|
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
Arne K.
Beiträge: 112
C# (VS 2008 Professional)
|
Verfasst: Do 25.12.08 14:09
Ach, interessant!
Den Teil hatte ich gar nicht gelesen. Ich habe mich wie gesagt quasi "von oben" genähert:
Quelltext 1: 2: 3:
| 60%26 ?= 18 26*3 = 78 = 60+18 => 60%26 = 18 |
So habe ich es auch implementiert und es hat wunderbar funktioniert, obwohl es ja im Wesentlichen dasselbe ist.
(warum das mathematisch so sein soll, frage ich mich aber immernoch. Für mich ist (-60)%26 per Definition eigentlich 8 )
Edit:
Ah ja, wer sich noch dafür interessiert, siehe hier:
de.wikipedia.org/wik..._der_Modulo-Funktion
|
|
Boldar
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Do 25.12.08 15:33
mmmh ich hab Benbe's Geistesblitz verpasst...
|
|
Xentar
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Do 25.12.08 16:56
Ahh, verdammt..
hab zwar das richtige Lösungswort raus, aber dieses dann falsch gedeutet
War irgendwie der Meinung, dass "Die Kerzen ergeben eine verschlüsselte, abfällige Bemerkung über Engelchen." besser passt, auch wenn Ruprecht ja eigentlich kein Engel ist (könnt ja ein anderer so heißen).
Nagut, trotzdem schönes Rätsel.
Hatte zeurst an Caesar Verschlüsselung gedacht, aber da kam nichts sinnvolles raus.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Xong
Beiträge: 113
WIN 2000
Borland Developer Studio 2006
|
Verfasst: Do 25.12.08 21:56
Arne K. hat folgendes geschrieben : | ich habe mich mit PHP dran versucht und bin auch beim mod (allerdings nur bei der Dechiffrierung?) kleben geblieben. |
Es reicht eine hinreichende große Zahl, die durch 26 geteilt, den Rest 0 ergibt, hinzuzuaddieren. So umgeht man die fehlerhafte Implementation des Modulo-Operators in den Programmiersprachen.
Ich habe einfach 2600 dazuaddiert.
Um Modulo zu verstehen, muss man sich mit Restklassen und Zahlenkörpern auseinandersetzen. Hat man eigentlich bei jedem Informatikstudium...
LG,
Xong
|
|
elundril
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Fr 26.12.08 04:15
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 26.12.08 15:16
Moin!
Wolle92 hat folgendes geschrieben : | Also, dank Yogu bin ich darauf gekommen, dass in Narses Tipp ein Hinweis drinsteht:
Normalerweise schreibt Narses "cu" unter seine Posts, diesmal hat er mx geschrieben... |
Wollte nur nett sein und mal "Merry Christmas" wünschen...
(also wieder verwirrungsfreies) cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
jaenicke
Beiträge: 19287
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 26.12.08 15:25
|
|
|