Einführung
Der Parsons-Code ist nur eine einfache Möglichkeit, Tonhöhenschwankungen in einem Musikstück zu beschreiben , unabhängig davon, ob eine Note höher oder niedriger als die vorherige ist.
Selbst wenn Sie sich nicht an Melodien erinnern können, können Sie sich noch gut daran erinnern, ob eine Note hoch oder runter geht. Der Parsons-Code kann Ihnen also helfen, eine Musik mithilfe einer Suchmaschine zu identifizieren.
Beschreibung
Jede Variation wird durch ein einzelnes Zeichen dargestellt. Dies ist eines der folgenden:
R
wenn die Note mit der vorherigen identisch ist (steht für " R epeat" )U
wenn die Note höher ist als die vorherige (steht für " U p" )D
wenn die Note niedriger ist als die vorherige (steht für " D own" )
Die Anfangsnotiz ist geschrieben als *
.
Beispiel
Hier ist ein Beispiel für Parsons Code (Beginn von "Ode an die Freude" ):
*RUURDDDDRUURDR
Sie können es tatsächlich so visualisieren :
*-*
/ \
* *
/ \
*-* * *-*
\ / \
* * *-*
\ /
*-*
Wir werden das von nun an eine Kontur nennen .
Die Regeln zum Zeichnen solcher Zähler werden im obigen Beispiel als selbsterklärend angesehen .
Herausforderung
Jetzt kommt die wahre Herausforderung.
Schreiben Sie ein Programm, das bei einer Kontur als Eingabe den entsprechenden Parsons-Code ausgibt.
Sie werden nicht aufgefordert, die Kontur zu zeichnen, sondern das Gegenteil.
Suchen Sie anhand der Kontur den ursprünglichen Parsons-Code.
Regeln
- Es gelten die üblichen Regeln für das Code-Golfen
- Das kürzeste Programm in Anzahl von Bytes gewinnt
- Die Eingabe ist eine Kontur und die Ausgabe muss ein gültiger Parsons-Code sein
- Details zu zusätzlichen Leerzeichen für die Eingabe sind irrelevant. Tun Sie, was für Sie am besten funktioniert
- Aufgrund der vorherigen Regel ist es Ihnen nicht gestattet, Teile der Ausgabe und / oder des Programms auf die eine oder andere Weise mit zusätzlichen Leerzeichen fest zu codieren
Anmerkungen
- Dies kann zum Testen nützlich sein
- Der entsprechende Parsons-Code für
*
ist*
- Eine leere Zeichenfolge ist keine gültige Kontur
- Ein Parsons-Code beginnt immer mit
*
*
dem nichts zu tun ist?*
? Nee. Es sollte wohl drucken*
. Ich werde diesen Eckfall hinzufügen.*
. Immer.Antworten:
Pyth -
28252725 Bytes2 Byes dank @Jakube gespeichert.
Probieren Sie es hier online aus .
quelle
*
als Eingabe. Die Ausgabe ist,*0
während es gerade sein sollte*
. Eine böse wilde nachlaufende Null erschien.U
undD
übrigens. Ansonsten gut gemacht.CJam, 21 Bytes
Falten Sie die Linien (
:
), indem Sie.
eine maximale Zeichenoperation vektorisieren ( )e>
. Da es in jeder Spalte nur ein Nicht-Leerzeichen gibt, ist dieses das Ergebnis, da das Leerzeichen einen kleineren ASCII-Code hat als alle druckbaren Nicht-Leerzeichen.Entfernen Sie die Umschalttaste und drucken Sie das erste Sternchen. Ordnen Sie
(o
dann alle2%
verbleibenden ZeichenUDR
mithilfe der modularen Indizierung zu.Alte Lösung (29 Bytes)
qN/
Ruft Eingabezeilen ab.z
transponiert diese Zeichenmatrix.2%
Lässt jede ungerade Reihe fallen.'*f#
Findet den Index des Sterns in jeder Zeile.0+2ew);
Ruft alle aufeinanderfolgenden Indexpaare ab.::-
berechnet ihre Unterschiede, und"RDU"f=
ordnet sie Buchstaben (über modulare Indizierung:0 → R
,2 → U
,-2 ≡ 1 → D
). Das führende'*
steht vor dem Sternchen.BEARBEITEN : Ich wechselte
2ew
zu0+2ew);
CJam umgehen nichtew
(aufeinanderfolgende Slices) auf Listen, die zu kurz sind. Dadurch funktioniert der Code für die Eingabezeichenfolge*
.Probieren Sie es hier aus oder sehen Sie es sich in Aktion an:
quelle
:-p
*
als Eingabe. Ich bekommeRuntimeException
stattdessen eine nette .[X]2ew
sollte,[]
anstatt einen Fehler zu machen. Ich werde jedoch eine Problemumgehung hinzufügen.Python 3,
1291089886 BytesEs gibt wahrscheinlich mehrere Möglichkeiten, Golf zu spielen, aber ich finde es ziemlich gut, dass ich alles auf eine Linie gebracht habe.
Bearbeiten: Jetzt mit
''.translate()
Edit: Mit vielen Dank an wnnmaw .
Bearbeiten: Ich habe das Eingabeformat in ein Array von Zeichenfolgen geändert, anstatt in eine durch Zeilenumbrüche getrennte Zeichenfolge, um Bytes zu speichern. Auch in der letzten Bearbeitung habe ich verwechselt
U
und dasR
behoben.Die Eingabe muss ein Array von Zeichenfolgen sein. Für das obige Beispiel sieht das ungefähr so aus:
Ungolfed:
quelle
lambda s:'*'+"".join((('D','R')[j=='-'],'U')[j=='/']for l in zip(*s.split('\n'))for j in l if j in'\\/-')
mit 105 Bytes. Der Hauptunterschied ist die Verwendung eines Tupel-Konditional anstelle von translateRuby, 87 Bytes
Benötigt nachgestellte Leerzeichen in der Eingabe, damit alle Zeilen gleich lang sind.
quelle
>:D
.Japt, 38 Bytes
40 41 45 46 482 Bytes gespart dank @ETHproductions
Wenn es einen Befehl zum Trimmen gäbe, wären dies nur 38 Bytes; -; Ich werde eine Erklärung hinzufügen, wenn ich mit dem Golfen fertig bin. Das
:P
ist nicht das Programm, das versucht lustig zu sein, sondern das Programm, das Zeichen ignoriert, die nicht wichtig sind.Probieren Sie es online aus
quelle
x
und transponieren und drehen Funktioneny
undz
(Split bei Zeilenumbrüchen, verwenden Sie die Array - Funktion, verbinden sie mit Zeilenumbrüchen)Yu ?"RUD"g1+(XrS c -47 g):P
Haskell, 89 Bytes
Anwendungsbeispiel:
Transponieren die Eingabe und ersetzen Sie die Zeichen
/
/-
/\
mit Singletons Strings"U"
/"R"
/"D"
. Alle anderen Zeichen werden durch leere Zeichenfolgen ersetzt""
, die später durch Verketten von allem verschwinden. Zum Schluss das Sternchen voranstellen*
.quelle
Mathematica, 103 Bytes
Ganz kurz, wenn man bedenkt, dass dies eine Herausforderung bei der Verarbeitung von Zeichenfolgen ist.
quelle
JavaScript (ES6) 90
Eine anonyme Funktion. Dabei wird die Eingabezeichenfolge nach Zeichen durchsucht, wobei die Position in der aktuellen Zeile berücksichtigt wird. Dadurch baut er einen Ausgang Array subsituting
U D R
für/ \ -
an der richtigen Stellequelle
Matlab, 62 Bytes
Hierfür muss die Eingabe rechteckig sein (gleiche Anzahl von Zeichen in jeder Zeile). Z.B
Erläuterung
quelle