Deaktivieren Sie den Parsons-Code

22

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:

  • Rwenn die Note mit der vorherigen identisch ist (steht für " R epeat" )
  • Uwenn die Note höher ist als die vorherige (steht für " U p" )
  • Dwenn 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

Helge von Koch
quelle
1
Siehe auch
Türklinke
Also muss es anfangen, mit *dem nichts zu tun ist?
nicael
Was meinst du? wann ist der eingang gerade *? Nee. Es sollte wohl drucken *. Ich werde diesen Eckfall hinzufügen.
Helge von Koch
1
@nicael Ja, es muss mit beginnen *. Immer.
Helge von Koch
2
Related: codegolf.stackexchange.com/q/55593/42545
ETHproductions

Antworten:

4

Pyth - 28 25 27 25 Bytes

2 Byes dank @Jakube gespeichert.

s+\*@L"RDU"-VFtBxR\*%2C.z

Probieren Sie es hier online aus .

Maltysen
quelle
1
Es funktioniert nicht mit *als Eingabe. Die Ausgabe ist, *0während es gerade sein sollte *. Eine böse wilde nachlaufende Null erschien.
Helge von Koch
@HelgevonKoch behoben
Maltysen
@ Jakube danke!
Maltysen
Du hast getauscht Uund Dübrigens. Ansonsten gut gemacht.
Helge von Koch
@HelgevonKoch oops
Maltysen
24

CJam, 21 Bytes

qN/:.e>(o2%:i"DRXU"f=

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 (odann alle 2%verbleibenden Zeichen UDRmithilfe der modularen Indizierung zu.

Alte Lösung (29 Bytes)

'*qN/z2%'*f#0+2ew);::-"RDU"f=

qN/Ruft Eingabezeilen ab. ztransponiert 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 2ewzu 0+2ew);CJam umgehen nicht ew(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:

              
Lynn
quelle
7
Das ist wirklich toll anzusehen.
Jeel Shah
2
Genau! +1 für den Code, wünschte, ich könnte +10 für das GIF.
ETHproductions
Übrigens, ich mag den Smiley bei Codelänge 17:-p
ETHproductions
1
Ich stimme zu, das ist großartig anzusehen. Es funktioniert jedoch nicht *als Eingabe. Ich bekomme RuntimeExceptionstattdessen eine nette .
Helge von Koch
Ugh, ich denke, dass ein CJam-Bug: zurückkehren [X]2ewsollte, []anstatt einen Fehler zu machen. Ich werde jedoch eine Problemumgehung hinzufügen.
Lynn
4

Python 3, 129 108 98 86 Bytes

Es 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 Uund das Rbehoben.

lambda a:'*'+"".join(('UR'[j<'/']+'D')[j>'/']for l in zip(*a)for j in l if j in'-/\\')

Die Eingabe muss ein Array von Zeichenfolgen sein. Für das obige Beispiel sieht das ungefähr so ​​aus:

["      *-*                    ","     /   \                   ","    *     *                  ","   /       \                 ","*-*         *         *-*    ","             \       /   \   ","              *     *     *-*","               \   /         ","                *-*          "]

Ungolfed:

def f(a):
    s = ''
    for c in zip(*a):           # transpose
        for d in c:             # for each letter in column c
            if e in "-/\\":     # if that letter is either -,/,\
                if e < '/':     # if < '/' (same as if == '-')
                    s += "R"
                elif e > '/':   # if > '/' (same as if == '\')
                    s += "D"
                else:           # if == '/'
                    s += "U"
        return "*" + s          # in the code we ''.join() it all together
                                # in this ungolfing, we add to an empty string
Sherlock9
quelle
Ich möchte keine neue Antwort geben, weil ich viel von Ihnen geliehen habe, aber 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 translate
wnnmaw
Danke @wnnmaw! Ich denke, ich kann das noch weiter verbessern!
Sherlock9
Nettes Golfen unter Vorbehalt in der Front, das ist super clever!
wnnmaw
Ah schält. Danke für den Tipp @wnnmaw
Sherlock9
3

Ruby, 87 Bytes

Benötigt nachgestellte Leerzeichen in der Eingabe, damit alle Zeilen gleich lang sind.

$><<?*+$<.readlines.map(&:chars).transpose.join.gsub(/./,{?-=>:R,?/=>:U,?\\=>:D}).strip
daniero
quelle
4
Dies ist sicherlich bösartiger Code, wie er enthält >:D.
Alex A.
3

Japt, 38 Bytes 40 41 45 46 48

2 Bytes gespart dank @ETHproductions

'*+U·y £Yu ?"RUD"g1+(XrS c -47 g):P} q

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 :Pist nicht das Programm, das versucht lustig zu sein, sondern das Programm, das Zeichen ignoriert, die nicht wichtig sind.

Probieren Sie es online aus

Downgoat
quelle
Als ich sah, dass es eine Herausforderung gab, die praktisch eine Array-Transponierung erforderte, und dass Doᴡɴɢᴏᴀᴛ darauf geantwortet hatte, wusste ich, dass es sich um Japt handeln musste.
ETHproductions
BTW, werde ich in einer Trimm - Funktion an hinzufügen xund transponieren und drehen Funktionen yund z(Split bei Zeilenumbrüchen, verwenden Sie die Array - Funktion, verbinden sie mit Zeilenumbrüchen)
ETHproductions
Sie könnten zwei Bytes wie folgt speichern:Yu ?"RUD"g1+(XrS c -47 g):P
folgt ETHproductions
@ETHproductions danke, bis unter 40 Bytes!
Downgoat
3

Haskell, 89 Bytes

import Data.List
m '/'="U"
m '-'="R"
m '\\'="D"
m _=""
('*':).(>>=(>>=m)).transpose.lines

Anwendungsbeispiel:

*Main> ('*':).(>>=(>>=m)).transpose.lines $ "      *-*                    \n     /   \\                   \n    *     *                  \n   /       \\                 \n*-*         *         *-*    \n             \\       /   \\   \n              *     *     *-*\n               \\   /         \n                *-*          "
"*RUURDDDDRUURDR"

*Main> ('*':).(>>=(>>=m)).transpose.lines $ "*"
"*"

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 *.

nimi
quelle
2

Mathematica, 103 Bytes

"*"<>(Differences@Position[Thread@Characters@StringSplit[#,"
"],"*"][[;;,2]]/.{-2->"U",0->"R",2->"D"})&

Ganz kurz, wenn man bedenkt, dass dies eine Herausforderung bei der Verarbeitung von Zeichenfolgen ist.

LegionMammal978
quelle
2

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 Rfür / \ -an der richtigen Stelle

c=>[...c].map(c=>c>'*'?t[i++]=c>'/'?'D':c<'/'?'R':'U':c<' '?i=0:++i,t=['*'],i=0)&&t.join``
edc65
quelle
2

Matlab, 62 Bytes

r=@(s)[85-(s<14)*3-(s>59)*17,''];@(p)r(sum(p(:,2:2:end)-32))

Hierfür muss die Eingabe rechteckig sein (gleiche Anzahl von Zeichen in jeder Zeile). Z.B

    ['      *-*                    ';    '     /   \                   ';    '    *     *                  ';    '   /       \                 ';    '*-*         *         *-*    ';    '             \       /   \   ';    '              *     *     *-*';    '               \   /         ';    '                *-*          '];

Erläuterung

sum(p(:,2:2:end)-32)        % exctract every second column, substract 32 (spaces->zeros) 
                            % and sum column wise (results in a vector of 3 different values)
[85-(s<14)*3-(s>59)*17,'']  % map each of the values to the corresponding value of the letter and convert back to characters
fehlerhaft
quelle