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

Helge von Koch
źródło
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
2
Powiązane: codegolf.stackexchange.com/q/55593/42545
ETHproductions

Odpowiedzi:

4

Pyth - 28 25 27 25 bajtów

2 bajki zapisane dzięki @Jakube.

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

Wypróbuj online tutaj .

Maltysen
źródło
1
Nie działa *jako wejście. Wyjście jest *0tak, jak powinno być *. Pojawiło się złe dzikie końcowe zero.
Helge von Koch
@HelgevonKoch naprawiono
Maltysen
@Jakube dzięki!
Maltysen
Masz zamienione Ui Dna drodze. W przeciwnym razie dobrze zrobione.
Helge von Koch
@HelgevonKoch oops
Maltysen
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:

              
Lynn
źródło
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
Sherlock9
źródło
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
daniero
źródło
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

Downgoat
źródło
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ę *.

nimi
źródło
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.

LegionMammal978
źródło
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``
edc65
źródło
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
wada
źródło