Non visualizzare il codice Parsons


22

introduzione

Il codice Parsons è solo un modo semplice per descrivere le variazioni di intonazione in un brano musicale, indipendentemente dal fatto che una nota sia più alta o più bassa della precedente.

Anche se fai schifo nel ricordare i brani, puoi ancora ricordare se una nota sale o scende, quindi il codice Parsons può aiutarti a identificare una musica usando un motore di ricerca.


Descrizione

Ogni variazione è rappresentata da un singolo carattere, che è uno dei seguenti:

  • Rse la nota è la stessa della precedente (sta per " R epeat" )
  • Use la nota è superiore alla precedente (sta per " U p" )
  • Dse la nota è inferiore alla precedente (sta per " D own" )

La nota iniziale è scritta come *.


Esempio

Ecco un esempio del codice Parsons (inizio di "Ode to Joy" ):

*RUURDDDDRUURDR

Puoi effettivamente visualizzarlo , in questo modo:

      *-*                    
     /   \                   
    *     *                  
   /       \                 
*-*         *         *-*    
             \       /   \   
              *     *     *-*
               \   /         
                *-*          

Lo chiameremo un contorno da ora in poi.

Le regole per disegnare tali consiglieri sono considerate autoesplicate dall'esempio sopra.



Sfida

Ora arriva la vera sfida.

Scrivi un programma che, dato un contorno come input, emetta il suo corrispondente codice Parsons.

Non ti viene chiesto di disegnare il contorno, ma in realtà il contrario.
Dal contorno, trova il codice Parsons originale.


Regole

  • Si applicano le solite regole per il golf del codice
  • Vince il programma più breve in numero di byte
  • L'input è un contorno e l'output deve essere un codice Parsons valido
  • I dettagli sugli spazi bianchi extra per l'input sono irrilevanti, fai tutto ciò che funziona meglio per te
  • Non è consentito codificare, in un modo o nell'altro, parti dell'output e / o del programma utilizzando spazi bianchi extra a causa della regola precedente

Gli appunti



Quindi deve iniziare con *chi non fa nulla?
nicael,

Cosa intendi? quando l'ingresso è giusto *? No. Dovrebbe stampare *suppongo. Aggiungerò questo caso d'angolo.
Helge von Koch,

1
@nicael Sì, deve iniziare con *. Sempre.
Helge von Koch,

Risposte:



24

CJam, 21 byte

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

Piega le linee ( :) vettorializzando ( .) un'operazione massima in termini di caratteri e>. Poiché esiste un solo carattere non spaziale in ogni colonna, questo sarà il risultato, poiché lo spazio ha un codice ASCII più piccolo di tutti i caratteri non spaziali stampabili.

Deseleziona e stampa il primo asterisco (o, quindi mappa ogni altro 2%carattere rimanente ( ) UDRusando l'indicizzazione modulare.

Vecchia soluzione (29 byte)

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

qN/ottiene linee di input. ztraspone questa matrice di caratteri. 2%lascia cadere ogni riga dispari. '*f#trova l'indice dell'asterisco in ogni riga. 0+2ew);ottiene tutte le coppie successive di indici. ::-calcola le differenze e "RDU"f=le mappe di lettere (via indicizzazione modulare: 0 → R, 2 → U, -2 ≡ 1 → D). Il leader '*antepone l'asterisco.

EDIT : ho cambiato 2ewper 0+2ew);aggirare CJam non gestendo ew(sezioni successive) su elenchi troppo corti. Questo fa funzionare il codice per la stringa di input *.

Provalo qui o guardalo in azione:

              

7
È davvero fantastico da guardare.
Jeel Shah,

2
Sono d'accordo! +1 per il codice, vorrei poter +10 per la GIF.
Produzioni ETH il

A proposito, mi piace lo smiley alla lunghezza del codice 17:-p
ETHproductions

1
Sono d'accordo, è fantastico da guardare. *Tuttavia, non funziona come input. Ottengo RuntimeExceptioninvece un bel posto.
Helge von Koch,

Ugh, ritengo che un bug di CJam: [X]2ewdovrebbe tornare []invece di sbagliare. Aggiungerò una soluzione alternativa, però.
Lynn,

4

Python 3, 129 108 98 86 86 byte

Probabilmente ci sono diversi modi per giocare a golf, ma mi piace piuttosto che ho ottenuto tutto in una riga.

Modifica: ora utilizzando''.translate()

Modifica: grazie mille a wnnmaw .

Modifica: ho cambiato il formato di input in un array di stringhe anziché in una stringa separata da nuova riga per salvare byte. Inoltre, nell'ultima modifica, ho confuso Ue R, quindi, l'ho risolto.

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

L'input deve essere una matrice di stringhe. Per l'esempio sopra, questo assomiglia a:

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

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

Non voglio dare una nuova risposta perché ho preso molto in prestito dalla tua, ma lambda s:'*'+"".join((('D','R')[j=='-'],'U')[j=='/']for l in zip(*s.split('\n'))for j in l if j in'\\/-')arriva a 105 byte. La differenza principale sta nell'usare un condizionale tupla invece di tradurre
wnnmaw,

Grazie @wnnmaw! Penso di poter golf ulteriormente!
Sherlock9,

Bel golf sul condizionale nella parte anteriore, che è super intelligente!
wnnmaw,

Ah schifo. Grazie per la punta @wnnmaw
Sherlock9

3

Rubino, 87 byte

Richiede spazi finali nell'input in modo che tutte le linee abbiano la stessa lunghezza.

$><<?*+$<.readlines.map(&:chars).transpose.join.gsub(/./,{?-=>:R,?/=>:U,?\\=>:D}).strip

4
Sicuramente questo è un codice dannoso, in quanto contiene >:D.
Alex A.

3

Japt, 38 byte 40 41 45 46 48

Salvato 2 byte grazie a @ETHproductions

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

Se ci fosse un comando trim questo sarebbe solo 38 byte; -; aggiungerò una spiegazione quando avrò finito di giocare a golf. Non :Pè il programma che cerca di essere divertente, in realtà è il programma che ignora i personaggi che non sono importanti.

Provalo online


Quando ho visto che c'era una sfida che richiedeva praticamente una trasposizione di array e che Doᴡɴɢᴏᴀᴛ aveva risposto, ho capito che doveva essere Japt.
ETHproductions

A proposito, aggiungerò una funzione di taglio su xe trasporrò e ruoterò le funzioni su ye z(dividere su newline, usare la funzione array, unire con
newline

È possibile salvare due byte in questo modo:Yu ?"RUD"g1+(XrS c -47 g):P
ETHproductions

@ETHproductions grazie, fino a meno di 40 byte!
Downgoat,

3

Haskell, 89 byte

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

Esempio di utilizzo:

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

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

Trasporre l'input e sostituire i caratteri // -/ \con stringhe singleton "U"/ "R"/ "D". Tutti gli altri caratteri vengono sostituiti da stringhe vuote "", che in seguito scompaiono concatenando tutto. Infine, anteporre l'asterisco *.


2

Mathematica, 103 byte

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

Abbastanza breve, considerando che si tratta di una sfida di elaborazione delle stringhe.


2

JavaScript (ES6) 90

Una funzione anonima. Analizza la stringa di input char con char, prendendo in considerazione la posizione nella riga corrente. Facendo questo, si costruisce una matrice di uscita subsituting U D Rper / \ -al posto giusto

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

2

Matlab, 62 byte

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

Ciò richiede che l'input sia rettangolare (stesso numero di caratteri in ogni riga). Per esempio

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

Spiegazione

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.