Eine Herausforderung mit einfachen Regeln, aber nicht trivialen Algorithmen. :-)
Aufgabe
Nehmen Sie die Eingabe in Form von durch Leerzeichen getrennten ganzen Zahlen vor:
N A B S
Wobei N die Seitenlänge einer 2D-Quadratmatrix ist, die mit eindeutigen Zahlen (Ganzzahlen) zwischen A und B einschließlich gefüllt ist . Für jede Zeile und Spalte in dieser Matrix ist die Summe immer dieselbe: S. (Mit anderen Worten, die Matrix ist ein halbmagisches Quadrat).
Hinweis:
Alle Zahlen sind positiv. Ausnahme ist A, das 0 sein kann.
Beispiele
Zum
3 1 10000 2015
eine gültige lösung wäre
Zum
8 1 300 500
eine gültige lösung wäre
Ausgabe
Die Ausgabe sollte eine ASCII-Tabelle sein. Beispiel für das erste Beispiel oben:
384 159 1472
1174 499 342
457 1357 201
Rechtsbündige Ganzzahlen, die mit Leerzeichen aufgefüllt sind. Die Breite jeder Spalte ist die Breite der größten Ganzzahl in dieser Spalte.
Wertung
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes. Es gelten Standard-Regelungslücken (insbesondere bei integrierten Funktionen zur Lösung dieses Problems). Sie müssen sich nicht um falsche oder anderweitig unmögliche Eingaben (einschließlich negativer Zahlen) kümmern. Bitte geben Sie in Ihrer Antwort (obligatorisch) ein Beispiel für das zweite Beispiel oben an.
A
,B
, undN
kann negativ sein?Antworten:
CJam,
11991 BytesDies ist ein nachweislich korrekter, nicht deterministischer Ansatz.
Auf meinem Desktop ist der zweite Testfall in der Regel in weniger als 10 Minuten abgeschlossen.
Der erste Fall wird sofort beendet. Probieren Sie es online im CJam-Interpreter aus .
Probelauf
Idee
Ohne zeitliche Begrenzung könnten wir nur nach dem Zufallsprinzip Quadrate erzeugen, bis wir ein gültiges Quadrat gefunden haben. Dieser Ansatz baut auf dieser Idee auf und fügt zwei Optimierungen hinzu:
Anstatt ein Quadrat der Seitenlänge N pseudozufällig zu erzeugen , erzeugen wir Quadrate der Seitenlänge N-1 , fügen eine Spalte hinzu, um ein N × (N-1) -Rechteck zu bilden, dessen Zeilen die Summe S haben , und dann eine Zeile, um ein Quadrat von zu bilden Seitenlänge N, deren Spalten die Summe S haben .
Da die Summe der Elemente aller Spalten NS und die Summe der Elemente der ersten N-1 sein wird Zeilen (N-1) S , wird die letzte Reihe auch sum hat S .
Dieser Vorgang kann jedoch zu einer ungültigen Matrix führen, da nicht garantiert werden kann, dass alle Elemente der letzten Zeile und Spalte eindeutig sind oder in den Bereich fallen [A ... B] fallen .
Auswählen eines Quadrats eindeutiger Ganzzahlen in [A ... B] und Seitenlänge N-1 nach dem Zufallsprinzip wäre viel zu lang. Wir müssen irgendwie Quadrate priorisieren, die eine höhere Wahrscheinlichkeit haben, ein gültiges Quadrat mit der Seitenlänge N zu erhalten, nachdem wir den im vorherigen Aufzählungspunkt beschriebenen Prozess angewendet haben.
Vorausgesetzt, jede Zeile und Spalte muss eine Summe von haben S , haben seine Elemente einen Durchschnitt von S / N . Wenn Sie also mehr Elemente in der Nähe dieses Durchschnitts auswählen, erhöhen Sie unsere Chancen.
Für jedes I in [A ... B] wählen wir pseudozufällig einen Float zwischen 0 und (I - S / N) 2 + 1 und sortieren die Elemente von [A ... B] nach den ausgewählten Floats. Wir behalten die ersten N 2 -Zahlen und ordnen sie in Lesereihenfolge in einem Quadrat ein.
Unter der Annahme einer vollkommen gleichmäßigen Verteilung aller reellen Zahlen zwischen 0 und (I - S / N) 2 + 1 in jedem Schritt haben alle Quadrate eine Wahrscheinlichkeit ungleich Null, ausgewählt zu werden, was bedeutet, dass der Prozess schließlich beendet wird.
Code
quelle