Zobacz kod Parsonsa


22

Wprowadzenie

Kod Parsons jest tylko prosty sposób na opisanie zmian wysokości w utworze muzycznym, czy notatka jest wyższa lub niższa od poprzedniej.

Nawet jeśli lubisz zapamiętywać melodie, wciąż możesz prawie pamiętać, czy nuta idzie w górę, czy w dół, dlatego kod Parsons może pomóc Ci zidentyfikować muzykę za pomocą wyszukiwarki.


Opis

Każda odmiana jest reprezentowana przez pojedynczy znak, który jest jednym z następujących:

  • Rjeśli nuta jest taka sama jak poprzednia (oznacza R epeat” )
  • Ujeśli nuta jest wyższa niż poprzednia (oznacza U p” )
  • Djeśli nuta jest niższa niż poprzednia (oznacza D własne” )

Pierwsza notatka jest zapisana jako *.


Przykład

Oto przykład kodu Parsons (początek „Oda do radości” ):

*RUURDDDDRUURDR

Możesz to sobie wyobrazić tak:

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

Odtąd nazwiemy to konturem .

Zasady rysowania takich konturów są uważane za wyjaśnione na powyższym przykładzie.



Wyzwanie

Teraz nadchodzi prawdziwe wyzwanie.

Napisz program, który na podstawie konturu jako wejścia wyprowadza odpowiadający mu kod Parsons.

Nie jesteś proszony o narysowanie konturu, ale wręcz przeciwnie.
Z konturu znajdź oryginalny kod Parsonsa.


Zasady

  • Obowiązują zwykłe zasady gry w golfa kodowego
  • Najkrótszy program pod względem liczby bajtów wygrywa
  • Dane wejściowe to kontur, a dane wyjściowe powinny być poprawnym kodem Parsonsa
  • Szczegóły dotyczące dodatkowych białych znaków dla danych wejściowych są nieistotne, rób wszystko, co dla ciebie najlepsze
  • Ze względu na poprzednią regułę nie można zakodować na stałe, w taki czy inny sposób, części danych wyjściowych i / lub programu przy użyciu dodatkowych białych znaków

Notatki



Więc musi zaczynać się od *tego, że nic nie robi?
nicael

Co masz na myśli? kiedy dane wejściowe są tylko *? Nie. Powinien wydrukować, jak *sądzę. Dodam tę skrzynkę narożną.
Helge von Koch,

1
@nicael Tak, musi zaczynać *. Zawsze.
Helge von Koch

Odpowiedzi:



24

CJam, 21 bajtów

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

Zwiń linie ( :) przez wektoryzację ( .) maksymalnej operacji znakowej e>. Ponieważ w każdej kolumnie jest tylko jeden znak spacji, ten będzie wynikiem, ponieważ spacja ma mniejszy kod ASCII niż wszystkie drukowalne znaki spacji.

Usuń przesunięcie i wydrukuj pierwszą gwiazdkę (o, a następnie zamapuj co drugi ( 2%) pozostały znak na UDRużycie indeksowania modułowego.

Stare rozwiązanie (29 bajtów)

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

qN/pobiera linie wejściowe. ztransponuje tę matrycę znaków. 2%upuszcza każdy nieparzysty rząd. '*f#znajduje indeks gwiazdki w każdym wierszu. 0+2ew);pobiera wszystkie kolejne pary indeksów. ::-oblicza ich różnice i "RDU"f=mapuje je do listów (przez modułowej indeksowania: 0 → R, 2 → U, -2 ≡ 1 → D). Wiodący '*wstawia gwiazdkę.

EDYCJA : Zmieniłem, 2ewaby 0+2ew);obejść CJam nie obsługujący ew(kolejne wycinki) na listach, które są zbyt krótkie. Dzięki temu kod działa dla ciągu wejściowego *.

Wypróbuj tutaj lub obejrzyj w akcji:

              

7
To naprawdę niesamowite do oglądania.
Jeel Shah

2
Zgadzam się! +1 za kod, chciałbym móc +10 za GIF.
ETHproductions

BTW, podoba mi się buźka o długości kodu 17:-p
ETHprodukcje

1
Zgadzam się, to jest niesamowite do oglądania. *Jednak nie działa jako wejście. RuntimeExceptionZamiast tego dostaję miły .
Helge von Koch

Ugh, uważam, że błąd CJam: [X]2ewpowinien powrócić []zamiast błędu. Dodam jednak obejście.
Lynn

4

Python 3, 129 108 98 86 bajtów

Prawdopodobnie istnieje kilka sposobów na grę w golfa, ale raczej podoba mi się, że wszystko sprowadziłem do jednej linii.

Edycja: teraz używa''.translate()

Edycja: Z wieloma podziękowaniami dla wnnmaw .

Edycja: Zmieniłem format wejściowy na tablicę ciągów zamiast ciągu oddzielonego znakiem nowej linii, aby zapisać bajty. Ponadto w ostatniej edycji pomieszałem Ui Rnaprawiłem to.

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

Dane wejściowe muszą być tablicą ciągów. W powyższym przykładzie wygląda to tak:

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

Nie golfowany:

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

Nie chcę udzielić nowej odpowiedzi, ponieważ dużo pożyczyłem od twojej, ale lambda s:'*'+"".join((('D','R')[j=='-'],'U')[j=='/']for l in zip(*s.split('\n'))for j in l if j in'\\/-')osiąga 105 bajtów. Główną różnicą jest użycie krotki warunkowej zamiast tłumaczenia
wnnmaw

Dzięki @wnnmaw! Myślę, że mogę pograć w golfa jeszcze bardziej!
Sherlock9,

Fajna gra w golfa pod warunkiem z przodu, to jest super sprytne!
wnnmaw

Ah pieprzy. Dzięki za wskazówkę @wnnmaw
Sherlock9

3

Rubinowy, 87 bajtów

Wymaga końcowych spacji na wejściu, aby wszystkie linie miały tę samą długość.

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

4
Z pewnością jest to złośliwy kod, ponieważ zawiera >:D.
Alex A.,

3

Japt, 38 bajtów 40 41 45 46 48

Zaoszczędź 2 bajty dzięki @ETHproductions

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

Gdyby było polecenie przycinania, byłoby to tylko 38 bajtów; -; dodam wyjaśnienie, kiedy skończę grać w golfa. To :Pnie jest program, który próbuje być zabawny, to w rzeczywistości program ignorujący postacie, które nie są ważne.

Wypróbuj online


Kiedy zobaczyłem, że istnieje wyzwanie wymagające transpozycji tablicy i że Doᴡɴɢᴏᴀᴛ odpowiedział na nie, wiedziałem, że to musi być Japt.
ETHprodukcje

BTW, dodam funkcję przycinania na x oraz transponuję i obracam funkcje na yi z(dzielenie na nowe linie, użyj funkcji tablicowej,
łącz

Możesz zapisać dwa bajty w ten sposób:Yu ?"RUD"g1+(XrS c -47 g):P
ETHproductions

Dzięki @ETHproductions, do 40 bajtów!
Downgoat

3

Haskell, 89 bajtów

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

Przykład użycia:

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

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

Transponuj dane wejściowe i zamień znaki / / -/ na \ciągi singletonowe "U"/ "R"/ "D". Wszystkie pozostałe znaki są zastępowane pustymi ciągami "", które później znikają, łącząc wszystko. Na koniec wstaw gwiazdkę *.


2

Mathematica, 103 bajty

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

Krótko mówiąc, biorąc pod uwagę, że jest to wyzwanie związane z przetwarzaniem łańcucha.


2

JavaScript (ES6) 90

Anonimowa funkcja. Skanuje wejściowy ciąg znaków char po char, biorąc pod uwagę pozycję w bieżącym wierszu. Spowoduje to, że buduje tablicę wyjściową subsituting U D Rdla / \ -na właściwym miejscu

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

2

Matlab, 62 bajty

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

Wymaga to, aby dane wejściowe były prostokątne (ta sama liczba znaków w każdym rzędzie). Na przykład

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

Wyjaśnienie

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.