Zielsetzung
Ich habe ein schönes Bild, das ich an meine Wand hängen möchte. Und ich möchte, dass es dort auf spektakuläre Weise hängt, also habe ich es an n
Nägeln aufgehängt, wo n
es eine positive ganze Zahl gibt.
Aber ich bin auch unentschlossen. Wenn ich es mir anders überlege, möchte ich nicht viel Mühe haben, das Bild herunterzunehmen. Wenn Sie einen der n
Nägel entfernen, sollte das Bild herunterfallen. Habe ich erwähnt, dass es in meinem Haus keine Reibung gibt?
Kannst du mir helfen?
Regeln
- Ihr Programm muss die Nummer
n
von stdin lesen und in stdout (oder den Entsprechungen Ihrer Sprache) drucken. - Die Ausgabe muss die Lösung gemäß der Ausgabespezifikation ohne andere nachfolgende oder führende Zeichen sein. Nachgestellte Leerzeichen und / oder Zeilenumbrüche sind jedoch akzeptabel.
- Sie müssen genau
n
Nägel verwenden. - Unter der Annahme einer reibungslosen Welt muss Ihre Lösung die folgenden Bedingungen erfüllen:
- Wenn Sie das Bild wie von Ihrer Lösung beschrieben aufhängen, darf es nicht herunterfallen.
- Wenn einer der Nägel entfernt wird, muss das Bild herunterfallen.
- Es gelten Standardlücken. Insbesondere dürfen Sie beispielsweise keine Anfragen an das Verifizierungsprogramm für Brute-Force-Lösungen stellen.
Beachten Sie, dass 4.2 bereits impliziert, dass alle n
Nägel beteiligt sein müssen.
Ausgabespezifikation
- Alle Nägel werden von links nach rechts mit der Position benannt, in der sie sich befinden, beginnend bei
1
. - Es gibt zwei grundlegende Möglichkeiten, die Schnur um einen Nagel zu legen: im Uhrzeigersinn und gegen den Uhrzeigersinn. Wir bezeichnen einen Schritt im Uhrzeigersinn mit
>
und einen Schritt gegen den Uhrzeigersinn mit<
. - Jedes Mal, wenn die Schnur um einen Nagel gelegt wird, kommt sie oben auf den Nägeln heraus. Wenn Sie also die Nägel überspringen, läuft die Schnur über die Oberseite der Zwischennägel.
- Jede Lösung muss am Nagel beginnen
1
und am Nagel endenn
. - Die Ausgabe muss aus einer Folge von Schritten bestehen, wobei ein Schritt eine Kombination aus dem Namen des Nagels und der Richtung ist, in der die Schnur um ihn herum gelegt werden soll.
Beispielausgabe
Hier ist eine Beispielausgabe für n=5
und n=3
:
1>4<3<2>4>5< # n=5, incorrect solution
1>2<1<2>3<2<1>2>1<3> # n=3, correct solution
Und hier ist eine visuelle Darstellung der falschen Lösung für n=5
(awsumz gimp Skillz)
Die richtige Lösung für n=1
ist einfach 1>
oder 1<
. Für mehrere Nägel kann es verschiedene Lösungen geben. Sie müssen nur eine ausgeben, da dies Teil Ihrer Punktzahl ist.
Nachprüfung
Hier können Sie überprüfen, ob eine Lösung korrekt ist: www.airblader.de/verify.php .
Es wird eine GET-Anforderung verwendet, sodass Sie sie direkt aufrufen können, wenn Sie möchten. Wenn es sich beispielsweise foo
um eine Datei handelt, die in jeder Zeile eine Lösung enthält, können Sie diese verwenden
cat foo | while read line; do echo `wget -qO- "www.airblader.de/verify.php?solution=$line" | grep "Passed" | wc -l`; done
Wenn Sie der Meinung sind, dass eine Lösung korrekt ist, der Prüfer sie jedoch als falsch markiert, lassen Sie es mich bitte wissen!
Bearbeiten: Und wenn Ihre Ausgabe so lang ist, dass eine GET-Anfrage sie nicht schneidet, lassen Sie es mich wissen und ich werde eine POST-Anforderungsversion erstellen. :) :)
Wertung
Das ist Code-Golf. Die Punktzahl ist die Anzahl der Bytes Ihres Quellcodes in der UTF-8-Codierung. Verwenden Sie beispielsweise dieses Tool . Für jede Einreichung gibt es jedoch einen potenziellen Bonus:
Führen Sie Ihr Programm für alle n
im Bereich aus [1..20]
und addieren Sie die Länge aller Ausgaben, um Ihre Ausgabewertung zu bestimmen . Subtrahieren Sie Ihre Ausgabewerte von 6291370
, um die Anzahl der Bonuspunkte zu erhalten , die Sie von Ihrer Byteanzahl abziehen können, um Ihre Gesamtbewertung zu erhalten . Es gibt keine Strafe, wenn Ihre Ausgabewertung höher als diese Zahl ist.
Die Einreichung mit der niedrigsten Gesamtpunktzahl gewinnt. Im unwahrscheinlichen Fall eines Unentschieden sind die Unentschieden in dieser Reihenfolge: höhere Bonuspunkte, niedrigere Byteanzahl, früheres Einreichungsdatum.
Bitte geben Sie sowohl die einzelnen Teile (Anzahl der Bytes, Bonuspunkte) der Punktzahl als auch die endgültige Punktzahl an, z LOLCODE (44 - 5 = 39)
. B. " ".
1>
im Bild gezeichnet wird). Und es gibt keinen Ort, ann
dem keine Lösung möglich ist. Eine gültige Lösung fürn=2
ist1>2<1<2>
.Antworten:
GolfScript (
5167 Bytes + (73107150 - 6,291,370) = -6,284,153)Dies basiert auf Chris Lusby Taylors * rekursiver Kommutatorkonstruktion , die besser in Picture-Hanging Puzzles , Demaine et al., Theory of Computing Systems 54 (4): 531-550 (2014) erläutert wird.
Ausgänge für die ersten 20 Eingänge:
NB Ich denke, dass die längeren Antworten den Online-Test nicht bestehen, da er
GET
eher verwendet alsPOST
und URLs nicht garantiert korrekt behandelt werden, wenn sie länger als 255 Zeichen sind.Es gibt zwei Verbesserungen an der Standardkonstruktion:
[x_1, x_2^-1]
stattdessen den Kommutator[x_1, x_2]
.* Keine Beziehung, soweit ich weiß.
** Nun, innerhalb des gleichen rekursiven Kommutatoransatzes. Ich behaupte nicht, das offene Problem, es als optimal zu beweisen, gelöst zu haben.
quelle
Python 2 (208 Bytes + (7230 - 6.291.370) = -6.283.932)
Die Funktion gibt
f
rekursiv eine Antwort, indem sie Halblösungen wie A ^ {- 1} * B ^ {- 1} * A * B kombiniert und Inversen durch Negation darstellt.f(a,b)
ist eine Lösung für die Zahlen im halboffenen Intervall[a,b)
.Bearbeiten: Um die Anforderung zu erfüllen, mit zu beginnen
1
und mit zu endenn
, habe ich die Reihenfolge umgedreht, um immer mitn
umgekehrten Intervallen zu enden , und einfach"1<1>"
an den Anfang angehängt .Bearbeiten : 136 Symbole in der Ausgabe wurden gespeichert, indem in Auswahlintervallen in die andere Richtung gerundet wurde, wodurch Intervalle mit größeren Zahlen (und daher mit größerer Wahrscheinlichkeit zweistellig) kürzer wurden.
Bearbeiten : 100 Symbole wurden gespeichert, indem die Intervalle ungleichmäßig aufgeteilt wurden, sodass das mit größeren Zahlen kürzer ist. Dies verlängert nicht die Anzahl der verwendeten Operationen, solange die Längen niemals Potenzen von 2 überschreiten.
Bearbeiten : Wiedereinführung einer günstigen Rundung, -50 Symbole, 2+ Codezeichen.
Ausgänge für 1 bis 20:
quelle
n>n<
.n=1
jetzt für Ihre Lösung fehl . Arbeiten daran)C - (199 Bytes - 0) = 199
Mit Zeilenumbrüchen:
Wahrscheinlich ein ziemlich naiver Algorithmus, da ich nicht so viel über die Knotentheorie weiß. Fügt im Grunde nur die nächsthöhere Zahl hinzu und kehrt dann den gesamten Befehlssatz um, um ihn abzuwickeln. Dies wäre wahrscheinlich viel prägnanter in einer Sprache, die Sets besser handhabt ...
Die Gesamtausgabelänge
n
im Bereich[1..20]
betrug 6.291.370 Byte Ausgabe (3.145.685 Anweisungen). Dies war groß genug, dass ich nur Beispielausgaben fürn
den Bereich gepostet habe[1..10]
.quelle
6,291,370
ist genau die richtige Nummer, die ich posten wollte. Ich habe versehentlich nur die Nummer für gepostetn=20
, nicht die Summe aller. Ich muss es aufdrehen[1..10]
.199 + 0 = 199
.