Ihre Aufgabe ist es, eine Folge von Zeichen (die Musik) als Eingabe (in einer Funktion oder einem Programm) zu nehmen und die Musik so auszudrucken (oder zurückzugeben), wie es in einer Spieluhr aussehen würde.
Sie erhalten nur die Zeichen ABCDEFG.()
als Eingabe, und die Eingabe wird niemals leer sein. Sie können die Buchstaben auch in Kleinbuchstaben erhalten, wenn Sie dies wünschen.
Dies ist eine leere Spieluhr mit der Länge 3:
.......
.......
.......
Wie Sie sehen, sind die Zeilen 7 Zeichen lang, und da die Länge der Spieluhr 3 beträgt, haben wir 3 Zeilen. Es gibt nur .
s hier, da die Spieluhr leer ist. Lass uns ein bisschen Musik reinlegen!
Zuerst erstellen wir die Spieluhr. In diesem Beispiel lautet die Eingabe CDAG.DAG
.
Die Länge von CDAG.DAG
ist 8, also brauchen wir eine Spieluhr mit der Länge 8:
.......
.......
.......
.......
.......
.......
.......
.......
Dann lesen wir die Eingabe einzeln und platzieren eine O
an der entsprechenden Position.
Das erste Zeichen ist C
und die Position jeder Note ist gleichbedeutend damit (ich habe der Klarheit halber Leerzeichen hinzugefügt):
A B C D E F G
. . . . . . .
. . . . . . .
(and so on)
Wenn das eingegebene Zeichen a ist .
, wird nur eine leere Zeile gedruckt.......
Das C
wäre also das dritte Zeichen. Lassen Sie es uns oben in unsere Spieluhr legen:
..O....
.......
.......
.......
.......
.......
.......
.......
Wir werden diesen Vorgang für alle anderen Zeichen wiederholen (der Text in Klammern soll Ihnen nur die Notiz zeigen, das sollten Sie nicht ausgeben):
..O.... (C)
...O... (D)
O...... (A)
......O (G)
....... (.)
...O... (D)
O...... (A)
......O (G)
Weil, wie Musik - Boxen arbeiten, wenn wir ein anderes Zeichen als verwenden O
, .
und <insert newline here>
, wie ein Raum, in unserer Ausgabe, dann wird es nicht die richtige Musik spielen!
Dies ist ein Akkord:
(ACE)
Dieser Akkord wird instruiert uns die Noten zu spielen A
, C
und E
zur gleichen Zeit. Es wird niemals eine Pause (dh ein .
) in einem Akkord geben.
So würde es geschrieben werden:
O.O.O...
Und so könnte es in der Musik aussehen: B(ACE)D
Sie erhalten niemals einen Akkord in einem Akkord, dh dies ist nicht gültig: (AB(CD)EF)
oder dies:, A(B())
und der Akkord ist nicht leer, dh dies ist nicht gültig:A()B
Sie erhalten niemals eine ungültige Eingabe.
Beispiele:
B(ACE)D
.O.....
O.O.O..
...O...
B
.O.....
GGABC
......O
......O
O......
.O.....
..O....
...
.......
.......
.......
A..F.C(DA).
O......
.......
.......
.....O.
.......
..O....
O..O...
.......
.(ABCDEF)
.......
OOOOOO.
Ein nachgestelltes / führendes Leerzeichen in der Ausgabe ist zulässig.
Da dies Codegolf ist , gewinnt der kürzeste Code!
()
zweimal enthalten (zBAB(CD)E(FG)
:)?Antworten:
Pip , 29 Bytes
28 Byte Code, +1 für
-l
Flag.Nimmt Eingaben in Kleinbuchstaben als Befehlszeilenargument. Probieren Sie es online!
Erläuterung
Hier ist ein Beispiel, wie eine Eingabe transformiert wird:
quelle
Python 2 ,
95 bis94 Bytes-1 Byte dank Value Ink
Probieren Sie es online! oder Probieren Sie alle Testfälle aus
Erläuterung
'@'<i
ist zu überprüfen, obi
es sich um einen Buchstaben handelt, wobei der.
durchO
an der richtigen Stelle ersetzt wird.'*'>i
zu prüfen ist , obi
eine Klammer ist, wenn esx=i>'('
wird gesetzt0
aufx
den Druck / Clearing von zu verhinderno
, wenni==')'
es gesetzt wird1
auf diex
erneute Aktivierung der Druck / Clearing vono
.Wenn sich
i=='.'
nichts ändert und'.......'
gedruckt wird.Die Zeichenreihenfolge wird durch ihren ASCII-Code angegeben, wobei
'('<')'<'*'<'.'<'@'<'A'
quelle
['.']*7
. Vielleicht ist es ein Überbleibsel aus der Zeit, als Sie ein Tupel verwendeten, für das das Komma erforderlich wäre. Ich könnte mich auch irren, aber dies scheint ein Array['O', '.', '.', '.', '.', '.', '.']
pro Zeile auszugeben , und ich bin mir nicht sicher, ob das erlaubt ist?Batch, 209 Bytes
Sammelt Buchstaben und gibt die Zeile aus, wenn das zuletzt gesehene Symbol nicht a war
(
.quelle
Röda ,
977876 BytesProbieren Sie es online!
Es ist eine anonyme Funktion, die die Eingabe aus dem Stream liest. Verwenden Sie es wie folgt aus :
main { f={...}; push("ABCD") | f() }
. Es verwendet den regulären Ausdruck aus der Antwort von ETHproductions.Ungolfed:
Vorherige Antwort:
Probieren Sie es online!
Es funktioniert, indem die angegebene Zeichenfolge an Stellen aufgeteilt wird, an denen die folgende Zeichenfolge nur übereinstimmende Klammern enthält. Dann durchläuft es für jeden Akkord mögliche Noten und druckt aus,
O
ob die Note ein Mitglied des Akkords ist und.
ansonsten.quelle
JavaScript (ES6),
868576 Byte9 Bytes dank @Neil gespeichert
Erläuterung
Erstens passen wir an, was jede Zeile der Ausgabe bildet: Akkorde und Zeichen, die nicht Teil eines Akkords sind. Dann nehmen wir für jede Zeile die Zeichenfolge
ABCDEFG\n
und ersetzen jedes Nicht-Zeilenumbruch-Zeichen darin durch ein,O
wenn die Zeile es enthält, und ein.
anderes.quelle
s=>s.replace(r=/\(\w+\)|./g,x=>`ABCDEFG\n`.replace(r,c=>x.match(c)?"O":"."))
.\)
sein.
?JavaScript (ES6),
118116114 ByteTestfälle
Code-Snippet anzeigen
quelle
Ruby,
787571 BytesGibt ein Array von Zeichenfolgen zurück.
Ungolfed + Erklärung
quelle
x.gsub(...){l=?.*7;$&.bytes{...};l+$/}
(tauschen Siescan
mitgsub
, entfernen Siemap
und überspringen Sie den ersten,|x|
da Sie$&
auf die letzte Regex-Übereinstimmung zugreifen können ), um 3 Bytes zu sparen und stattdessen eine mehrzeilige Zeichenfolge zurückzugeben. ($/
Wird standardmäßig auch einer neuen Zeile zugeordnet.)PHP, 171 Bytes
Nervenzusammenbruch :
Probieren Sie es hier aus!
quelle
Netzhaut , 120 Bytes
Ich bin sicher, dass es Platz zum Golfen gibt, aber es funktioniert jetzt, also werde ich später versuchen, mehr Golf zu spielen.
Probieren Sie es online!
Wie es funktioniert
Grundsätzlich ändert das Programm jedes Zeichen in eine Zahl und weist
O
dieser Position in einer Zeile eine zu. Es ordnetABCDEFG.
zu01234569
.Um die einzelnen Notenzeilen zu generieren, müssen Sie nur ein Zeichen
O
nach der entsprechenden Anzahl von.
s einfügen und die Zeile dann mit 7 Zeichen auffüllen.Die Akkorde sind jedoch etwas kniffliger. Ein ähnlicher Vorgang wird verwendet, aber die Zahlen müssen in Inkremente übersetzt werden, dh die erste Note im Akkord ist (was auch immer), die zweite ist die X-Position nach der ersten, die dritte ist die Y-Position danach usw.
Code
Sortieren Sie zunächst alle Zeichen in Akkorden.
Führen Sie die Transliteration (Zuordnung) von Buchstaben zu Zahlen durch.
Ersetzen Sie alle Ziffern in Klammern durch eine unäre Darstellung (mit
x
s), gefolgt von einem Leerzeichen.Ersetzen Sie alle schließenden Klammern
m
durch eine neue Zeile. Dasm
wird als eine Art Markierung für die kommende Schleife verwendet:Dies ist eine Ersetzungsphase, die so lange wiederholt wird, bis sie nicht mehr ersetzt werden kann. Es dauert die letzten beiden Folgen von
x
s vor einemm
und subtrahiert die erste von der zweiten, wobei derm
Rücken bewegt wird . Der Markerm
wird benötigt, da er diesen Vorgang von rechts nach links ausführen muss.Entfernen Sie die erste
x
in jeder Sequenz mit Ausnahme der ersten.T
durch Ersetzenx
durch.
, Leerzeichen durchO
und Löschen vonm
und(
.Zu diesem Zeitpunkt wurden alle Linien für die Akkorde erstellt. Nun müssen die Einzelnotenlinien erstellt werden.
Ersetzen Sie jede Ziffer durch so viele
.
s, gefolgt von einemO
und einer neuen Zeile.Füllen Sie jede Zeile auf die Länge 7 auf, indem Sie
.
rechts ein s hinzufügen . Dies funktioniert, indem.
am Ende jeder Zeile 6 s hinzugefügt werden (jede Zeile enthält mindestens ein anderes Zeichen) und dann jedes Zeichen nach den ersten 7 in jeder Zeile durch nichts ersetzt wird. (Da.
Karten bis 9,O
werden die auf diesen Linien ausgeschnitten)quelle
Perl,
877145 + 2 (-nl
Flag) = 47 BytesVerwenden von:
Probieren Sie es auf Ideone.
quelle
Perl 5 - 78 + 1 (Flag) + 2 (Eingabe-Anführungszeichen) = 81 Bytes
Kann so ausgeführt werden:
quelle
Ruby, 68 Bytes
Die Idee ist, die Zeichenfolge
.......
jedes Mal zu ändern, wenn wir einen Buchstaben finden, ihn dann ausgeben und zurücksetzen, aber nur, wenn wir uns außerhalb von Klammern befinden.(
schaltet die Ausgabe aus.)
und.
beide schalten / lassen die Ausgabe an, aber letztere ist belanglos, da sie niemals in einer Klammer zu finden ist.Ungolfed im Testprogramm
quelle
Python 3, 94 Bytes
Eine anonyme Funktion
quelle
Haskell , 101 Bytes
Probieren Sie es online! Verbrauch:
p "AB.(CA)D"
. Gibt eine Liste von Zeichenfolgen zurück.Erläuterung:
Die Funktion
p
rekursiert über die Zeichenfolge. Wenn eine öffnende Klammer gefunden'('
wird(x,_:t)<-span(')'<)r
, wird die verbleibende Zeichenfolge vor und nach dem Auftreten der schließenden Klammerr
in die Zeichenfolgen unterteilt . Andernfalls wird das aktuelle Zeichen in eine Zeichenfolge umgewandelt . In beiden Fällen wird die Funktion mit der aktuellen Notenfolge und der Restzeichenfolge aufgerufen. ordnet die Funktion der Zeichenfolge zu , wobei alle Zeichen, die nicht in der aktuellen Zeichenfolge enthalten sind, durch ersetzt werden . Die resultierende Musikboxzeile wird dem rekursiven Aufruf von in der Restliste vorangestellt .x
')'
t
x
[x]
?
?
#
"ABCDEFG"
#
'.'
p
r
quelle
Retina 0.8.2 , 52 Bytes
Probieren Sie es online! Übernimmt die Eingabe in Kleinbuchstaben. Erläuterung:
Teilen Sie die Musik in Akkorde oder Noten auf und beginnen Sie mit dem Aufbau der Ausgabe, indem Sie die Liste der Notenäquivalente hinzufügen.
Ändern Sie für jede Note in jedem Akkord die Ausgabe in
O
und löschen Sie die Note aus dem Akkord.Löschen Sie alle jetzt irrelevanten Musiktitel und ändern Sie alle nicht zugeordneten Noten in leer.
quelle
PHP, 93 Bytes
Laufen Sie als Pipe mit
-nR
oder versuchen Sie es online .Nervenzusammenbruch
quelle