파슨스 코드 시각화


22

소개

파슨스 코드를 설명하는 단순한 방법이다 피치 변화를 메모가 높은지, 음악의 조각 또는 이전보다.

곡을 기억하는 데 어려움을 겪어도 음표가 올라가거나 내려가는 것을 여전히 기억할 수 있으므로 Parsons 코드 는 검색 엔진을 사용하여 음악을 식별하는 데 도움이 될 수 있습니다.


기술

각 변형은 단일 문자로 표현되며 다음 중 하나입니다.

  • R노트 인 경우 같은 이전보다 (의미 " R의 EPEAT" )
  • U노트가 이전 노트 보다 높은 경우 ( " U p"를 의미 )
  • D노트가 이전 노트 보다 낮은 경우 ( " D own"을 의미 )

초기 메모는로 작성됩니다 *.


다음은 Parsons 코드의 예입니다 ( "Ode to Joy"시작 ).

*RUURDDDDRUURDR

실제로 다음과 같이 시각화 할 수 있습니다 .

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

우리는 지금부터 그것을 윤곽 이라고 부를 것 입니다.

그러한 계수를 이끌어내는 규칙 은 위의 예에서 자체 설명 된 것으로 간주됩니다 .



도전

이제 진짜 도전이 온다.

형상을 입력으로하여 해당 파슨스 코드를 출력하는 프로그램을 작성하십시오.

윤곽선을 그리라는 메시지는 표시되지 않지만 실제로는 반대입니다.
형상에서 원래 파슨스 코드를 찾으십시오.


규칙

  • 코드 골프에 대한 일반적인 규칙이 적용됩니다
  • 바이트 수가 가장 짧은 프로그램이 승리
  • 입력은 윤곽이며 출력은 유효한 Parsons 코드 여야합니다.
  • 입력에 대한 추가 공백에 대한 세부 사항은 관련이 없으며 가장 적합한 것을 수행하십시오.
  • 이전 규칙으로 인해 여분의 공백을 사용하여 출력의 일부 및 / 또는 일부 및 / 또는 프로그램을 하드 코딩 할 수 없습니다.

노트



그래서 *아무것도하지 않는 것으로 시작해야 합니까?
nicael

무슨 소리 야? 입력이 단지 *언제입니까? 아니. *내가 추측 인쇄해야합니다 . 이 코너 케이스를 추가하겠습니다.
Helge von Koch

1
@nicael 예,로 시작 해야합니다* . 항상.
Helge von Koch

답변:


4

Pyth- 28 25 27 25 바이트

@Jakube 덕분에 2 Byes이 (가) 저장되었습니다.

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

여기에서 온라인으로 사용해보십시오 .


1
*입력으로 는 작동하지 않습니다 . 출력은 *0그냥 있어야합니다 *. 사악한 야생 후행 0이 나타났습니다.
Helge von Koch

@HelgevonKoch fixed
Maltysen

@Jakube 감사합니다!
Maltysen

당신은 교환 한 U하고 D그런데. 그렇지 않으면 잘했다.
Helge von Koch

@HelgevonKoch oops
Maltysen

24

CJam, 21 바이트

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

문자 별 최대 연산 :을 벡터화 하여 ( ) 행 을 접습니다 ( .) e>. 각 열에 공백이 아닌 문자가 하나만 있기 때문에 공백이 인쇄 가능한 모든 공백이 아닌 문자보다 ASCII 코드가 작기 때문에이 결과가 나타납니다.

첫 번째 별표를 이동하지 않고 인쇄 (o한 다음 2%나머지 모든 문자를 UDR모듈 형 색인 을 사용하여 매핑하십시오 .

이전 솔루션 (29 바이트)

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

qN/입력 라인을 가져옵니다. z이 문자 매트릭스를 바꿉니다. 2%홀수 행마다 삭제합니다. '*f#각 행에서 별표의 색인을 찾습니다. 0+2ew);모든 연속적인 인덱스 쌍을 가져옵니다. ::-자신의 차이를 계산하고, "RDU"f=문자로 매핑 (모듈 색인을 통해 : 0 → R, 2 → U, -2 ≡ 1 → D). 선행 '*은 별표 앞에 붙습니다.

편집 : 너무 짧은 목록에서 CJam을 처리하지 못하는 ( 성공한 조각) 문제를 해결 2ew하기 0+2ew);위해 변경 했습니다 ew. 이것은 입력 문자열에 대해 코드가 작동하도록합니다 *.

여기 에서 시도 하거나 작동 중인지 확인하십시오.

              

7
정말보기 좋습니다.
Jeel Shah

2
동의한다! 코드는 +1, GIF는 +10 할 수 있기를 바랍니다.
ETHproductions

BTW, 나는 코드 길이 17에서 스마일리를 좋아한다:-p
ETHproductions

1
동의합니다.보기에 좋습니다. *그래도 입력으로 는 작동하지 않습니다 . 나는 RuntimeException대신 좋은 것을 얻는다 .
Helge von Koch

어쩌면 CJam 버그 : 오류 대신 [X]2ew반환해야한다고 생각합니다 []. 그래도 해결 방법을 추가하겠습니다.
Lynn

4

파이썬 3 129 108 98 86 바이트

골프를 치는 방법은 여러 가지가 있지만, 한 줄로 줄인 것이 좋습니다.

편집 : 이제 사용 중''.translate()

편집 : wnnmaw 덕분에 많이 .

편집 : 바이트를 절약하기 위해 줄 바꿈으로 구분 된 문자열 대신 입력 형식을 문자열 배열로 변경했습니다. 또한, 마지막 편집에서, 나는 혼합 U하고 R나는 그것을 고정, 그래서.

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

입력은 문자열 배열이어야합니다. 위 예제의 경우 다음과 같습니다.

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

언 골프 드 :

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

나는 당신에게서 많은 것을 빌 렸기 때문에 새로운 대답을하고 싶지 않지만 lambda s:'*'+"".join((('D','R')[j=='-'],'U')[j=='/']for l in zip(*s.split('\n'))for j in l if j in'\\/-')105 바이트로 시간을 보냅니다. 주요 차이점은 번역 대신 튜플 조건을 사용하는 것입니다.
wnnmaw

감사합니다 @wnnmaw! 나는 그것을 더 아래로 골프 수 있다고 생각합니다!
Sherlock9

전면의 조건부에서 멋진 골프, 그것은 매우 영리합니다!
wnnmaw

아 sh. 팁 @wnnmaw
Sherlock9에

3

루비, 87 바이트

모든 줄의 길이가 동일하도록 입력에 후행 공백이 필요합니다.

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

4
확실히 이것은 포함 된 악성 코드 >:D입니다.
Alex A.

3

apt, 38 바이트 40 41 45 46 48

@ETHproductions 덕분에 2 바이트 절약

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

트림 명령이있는 경우 이는 38 바이트입니다.;-; 골프를 마치면 설명이 추가됩니다. 이 :P프로그램은 웃기려고하는 프로그램이 아니라 실제로 중요하지 않은 문자를 무시하는 프로그램입니다.

온라인으로 사용해보십시오


실제로 배열 전치가 필요한 문제가 있고 Doᴡɴɢᴏᴀᴛ가 이에 응답 한 것을 보았을 때, 그것이 Japt이어야한다는 것을 알았습니다.
ETHproductions

BTW, 나는에서 트림 기능에 추가 할 것입니다 x에서와 트랜스와 회전 기능 yz(분할 줄 바꿈에, 배열 함수를 사용하여 줄 바꿈으로 가입)
ETHproductions

다음과 같이 2 바이트를 절약 할 수 있습니다.Yu ?"RUD"g1+(XrS c -47 g):P
ETHproductions

@ETHproductions는 40 바이트 미만으로 감사합니다!
Downgoat

3

하스켈, 89 바이트

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

사용 예 :

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

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

입력을 바꾸고 // -/ 문자 \를 단일 문자열 "U"/ "R"/ 로 바꿉니다 "D". 다른 모든 문자는 빈 문자열로 대체되며 ""나중에 모든 것을 연결하여 사라집니다. 마지막으로 별표 앞에 추가하십시오 *.


2

수학, 103 바이트

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

이것이 문자열 처리 문제라는 점을 고려하면 상당히 짧습니다.


2

자바 스크립트 (ES6) 90

익명의 기능. 현재 행의 위치를 ​​고려하여 char로 입력 문자열 char을 스캔합니다. 이 하는 subsituting 출력 배열 구축 U D R을 위해 / \ -적절한 장소를

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

2

Matlab, 62 바이트

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

이를 위해서는 입력이 사각형이어야합니다 (각 행의 동일한 문자 수). 예 :

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

설명

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.