오르골 만들기


23

당신의 임무는 입력 (기능 또는 프로그램에서)으로 문자 (음악)의 순서를 취하고, 음악 상자에서와 같이 음악을 인쇄 (또는 리턴)하는 것입니다.

문자 ABCDEFG.()는 입력으로 만 수신되며 입력은 비워지지 않습니다. 원하는 경우 소문자로 편지를받을 수도 있습니다.

길이가 3 인 빈 뮤직 박스입니다.

.......
.......
.......

보시다시피 줄의 길이는 7 자이며 오르골의 길이는 3이므로 3 줄입니다. .뮤직 박스가 비어 있기 때문에 여기에 s 만 있습니다 . 음악을 넣어 보자!

먼저 뮤직 박스를 만듭니다. 이 예에서 입력은입니다 CDAG.DAG.

길이 CDAG.DAG는 8이므로 길이 가 8 인 오르골이 필요합니다.

.......
.......
.......
.......
.......
.......
.......
.......

그런 다음 한 번에 한 문자 씩 입력을 읽고 O해당 위치에를 배치합니다.

첫 번째 문자는 C입니다. 각 노트의 위치는 다음과 같습니다 (명확하게하기 위해 공백을 추가했습니다).

 A B C D E F G
 . . . . . . .
 . . . . . . .
 (and so on)

입력 문자가 인 .경우 빈 줄을 인쇄합니다........

따라서 C3 번째 캐릭터가됩니다. 상단의 뮤직 박스에 넣으십시오.

..O....
.......
.......
.......
.......
.......
.......
.......

우리는 다른 모든 문자에 대해이 과정을 반복합니다 (괄호 안의 텍스트는 메모를 표시하기 위해 출력하므로 안됩니다).

..O.... (C)
...O... (D)
O...... (A)
......O (G)
....... (.)
...O... (D)
O...... (A)
......O (G)

음악 상자가 작동하는 방식으로 인해 출력에서 O, .및 이외의 문자를 <insert newline here>출력에 사용하면 올바른 음악이 재생되지 않습니다!

이것은 화음입니다.

(ACE)

이 코드는 음을 연주하기 위해 우리를 지시한다 A, C그리고 E같은 시간에. .코드에 일시 정지 (예 : a ) 가 없습니다 .

이것이 어떻게 쓰여지 는가 :

O.O.O...

그리고 이것이 음악에 나타날 수있는 방법입니다 : B(ACE)D

코드로 코드를받지 못할 것입니다. 즉, 유효하지 않습니다 : (AB(CD)EF)또는 this : A(B()), 코드가 비어 있지 않습니다. 즉, 유효하지 않습니다 :A()B

잘못된 입력을받지 못할 것입니다.

예 :

B(ACE)D

.O.....
O.O.O..
...O...

B

.O.....

GGABC

......O
......O
O......
.O.....
..O....

...

.......
.......
.......

A..F.C(DA).

O......
.......
.......
.....O.
.......
..O....
O..O...
.......

.(ABCDEF)

.......
OOOOOO.

출력에서 후행 / 앞 공백이 허용됩니다.

이것이 이므로 가장 짧은 코드가 승리합니다!


음악 문자열에 ()두 번 포함될 수 있습니까 (예 AB(CD)E(FG):) ??
Mr. Xcoder

@ Mr.Xcoder 네, 가능합니다.
Okx

출력이 문자 목록 / 배열 일 수 있습니까?
Rod

PPCG 표준에 따라 @Rod 확실한
Okx

우리는 같은 화음에 같은 음표 두 개를 얻지 못할 것입니까?
비즈니스 고양이

답변:


0

, 29 바이트

28 바이트의 코드, -l플래그의 경우 +1

'.X7RA_'OMz@?a@`\(\w+.|.`@XL

명령 줄 인수로 소문자로 입력을받습니다. 온라인으로 사용해보십시오!

설명

                              a is 1st cmdline arg; XL is `[a-z]`; z is lowercase alphabet
             a@`\(\w+.|.`     List of all matches in a of this regex:
                               Either a ( followed by letters followed by another
                               character (i.e. the closing paren), or any one character
                         @XL  For each of those matches, a list of all matches of this
                               regex (effectively, split the match into a list of
                               characters and keep only the lowercase letters)
          z@?                 Find index of each letter in the lowercase alphabet
         M                    To that list of lists of indices, map this function:
'.X7                           Take a string of 7 periods
    RA_                        and replace the characters at all indices in the argument
       'O                      with O
                              Finally, autoprint the resulting list, with each item on
                              its own line (-l flag)

다음은 입력이 변환되는 방법에 대한 샘플입니다.

"b.(ceg)"
["b" "." "(ceg)"]
[["b"] [] ["c" "e" "g"]]
[[1] [] [2 4 6]]
[".O....." "......." "..O.O.O"]

6

파이썬 2 , 95 94 바이트

Value Ink 덕분에 -1 바이트

x=1
for i in input():
 if x:o=['.']*7
 if'@'<i:o[ord(i)-65]='O'
 if'*'>i:x=i>'('
 if x:print o

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 시도하십시오

설명

'@'<ii문자 인지 확인 하고 올바른 위치 에서 .by O를 바꿉니다 .
'*'>i있는지 확인하는 i것이있는 경우, 괄호이다 x=i>'('넣어 0에서 x의 인쇄 / 소거 방지 할 o때, i==')'그것은 넣어, 1x재 활성화의 인쇄 / 지우기 o.
i=='.'아무것도 변경되지 않으며, '.......'인쇄됩니다.
캐릭터 순서는 ASCII 코드로 제공되며 여기서'('<')'<'*'<'.'<'@'<'A'


오, 그 의견을 놓쳤다. nvm.
quintopia

쉼표를 버립니다 : ['.']*7. 아마도 튜플을 사용할 때 쉼표가 필요할 수 있습니다. 또한, 내가 틀렸을 수도 있지만, 이것은 ['O', '.', '.', '.', '.', '.', '.']줄 당 배열을 출력하는 것 같 으며 그것이 허용되는지 확실하지 않습니까?
Value Ink

@ValueInk yep, OP 허용
Rod

바이트 변경을 언급하고 TIO 링크를 변경했지만 게시물에 나열된 코드는 여전히 동일합니다 .V
Value Ink

1
@ValueInk ¯ \ _ (ツ) _ / ¯
Rod

4

배치, 209 바이트

@set s=%1
@set p=)
@for %%n in (a b c d e f g)do @set %%n=.
:g
@if %s:~,1% lss @ (set "p=%s:~,1%")else set %s:~,1%=O
@set s=%s:~1%
@if %p%==( goto g
@echo %a%%b%%c%%d%%e%%f%%g%
@if not "%s%"=="" %0 %s%

마지막으로 본 기호가 아닌 경우 문자를 누적하고 줄을 출력하여 작동합니다 (.


4

로다 , 97 78 76 바이트

{search`\(\w+\)|.`|{|c|seq 65,71|{|l|["O"]if[chr(l)in c]else["."]}_;["
"]}_}

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

스트림에서 입력을 읽는 익명 함수입니다. 다음과 같이 사용하십시오 main { f={...}; push("ABCD") | f() }. ETHproductions의 답변에서 정규식을 사용합니다.

언 골프 드 :

{
    search(`\(\w+\)|.`) | for chord do
        seq(ord("A"), ord("G")) | for note do
            if [ chr(note) in chord ] do
                push("O")
            else
                push(".")
            done
        done
        push("\n")
    done
}

이전 답변 :

f s{(s/"(?=([^()]*(\\([^()]*\\))?)*$)")|{|c|seq 65,71|{|l|["O"]if[chr(l)in c]else["."]}_;["
"]}_}

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

다음 문자열이 일치하는 괄호 만 포함하는 곳에서 주어진 문자열을 분할하여 작동합니다. 그런 다음 각 코드에 대해 가능한 노트를 반복 O하고 노트가 코드의 멤버 인 경우 인쇄 합니다 ..


4

자바 스크립트 (ES6), 86 85 76 바이트

@Neil 덕분에 9 바이트 절약

let f =
s=>s.replace(r=/\(\w+\)|./g,x=>`ABCDEFG
`.replace(r,c=>x.match(c)?"O":"."))
<input oninput="if(/^([A-G.]|\([A-G]+\))+$/.test(value))O.textContent=f(value)"><br>
<pre id=O></pre>

설명

먼저, 출력의 각 줄을 구성하는 코드, 코드 및 코드의 일부가 아닌 문자를 일치시킵니다. 그런 다음 각 줄에 대해 문자열을 가져 와서 ABCDEFG\n줄 바꿈이 아닌 각 문자를 O줄에 포함 된 경우와 .그렇지 않은 경우로 바꿉니다.


후행 줄 바꿈이 허용되는 경우을 사용하여 8 바이트를 절약 할 수 있습니다 s=>s.replace(r=/\(\w+\)|./g,x=>`ABCDEFG\n`.replace(r,c=>x.match(c)?"O":".")).
Neil

@ 닐 와우, 그거 대단해 :-)
ETHproductions

허, 이제 다시 측정
Neil

\).있습니까?
l4m2

2

자바 스크립트 (ES6) 118 116 114 바이트

f=([c,...t],s)=>c?((s?0:x=[...'.......'],c='ABCDEFG)('.indexOf(c))>6?c-7:(x[c]='O',s))?f(t,1):x.join``+`
`+f(t):''

테스트 사례


2

루비, 78 75 71 바이트

->x{x.scan(/\(\w+\)|./).map{|x|l=?.*7
x.bytes{|x|x>47?l[x-65]=?O:1};l}}

문자열 배열을 반환합니다.

언 골프 + 설명

def boxes string
  string.scan(/\(\w+\)|./)    # Split the string into an array of chords.
  .map do |chord|             # Replace each chord with...
    line = '.' * 7            # a line, where by default each character is a '.',
    chord.bytes do |note|     # but for each note in the chord...
      if note > '.'.ord       # (if it is in fact a note and not a dot or paren)
        line[note-65] = 'O'   # replace the corresponding dot with an 'O'.
      end
    end
    line               
  end
end

시도 x.gsub(...){l=?.*7;$&.bytes{...};l+$/}(스왑 scangsub제거를 map, 첫 번째를 건너 |x|사용할 수 있기 때문에 $&마지막 정규식 일치에 액세스 할 수) 3 바이트를 저장하고 대신 여러 줄 문자열을 반환 할 수 있습니다. (또한 $/기본적으로 줄 바꿈에 매핑됩니다.)
Value Ink

1

PHP, 171 바이트

preg_match_all('#[A-G\.]|\([A-G]+\)#',$argv[1],$m);foreach($m[0]as$l){if($l=='.')echo".......";else foreach([A,B,C,D,E,F,G]as$a)echo strpos($l,$a)!==false?O:'.';echo"\n";}

고장 :

preg_match_all('#[A-G\.]|\([A-G]+\)#',$argv[1],$m); // Matches either one character in the range [A-G.] OR multiple [A-G] characters between parentheses
foreach($m[0]as$l)                                  // For each match :
    if($l=='.')                                     //   If no note is played
        echo".......";                              //     Echo empty music line
    else                                            //   Else
        foreach([A,B,C,D,E,F,G]as$a)                //     For each note in the [A-G] range
            echo strpos($l,$a)!==false?O:'.';       //       Echo O i the note is played, . if not
    echo"\n";                                       //  Echo new line
}

여기 사용해보십시오!


1

레티 나 , 120 바이트

O`(?<=\([^)]*)[^)]
T`L.`d
(?<=\([^)]*)\d
$*x 
\)
m¶
+`\b(x+) \1(x+) m
$1 m$2 
 m?x

T`x m(`.\O_
\d
$*.O¶
¶
6$*.¶
%7>`.

골프를 할 여지가 있다고 확신하지만 지금은 작동하므로 나중에 골프를 칠 것입니다.

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

작동 원리

기본적으로 프로그램은 각 문자를 숫자로 변경 한 다음 O줄의 해당 위치에 a 를 할당하여 작동 합니다. 에 매핑 ABCDEFG.됩니다 01234569.

단일 음표 줄을 생성하려면 s O뒤에 해당 숫자를 .넣은 다음 7 자 길이로 줄을 채우면됩니다.

그러나 코드는 조금 까다 롭습니다. 비슷한 프로세스가 사용되지만 숫자는 증분으로 변환되어야합니다. 즉, 코드의 첫 번째 음은 (무엇이든), 두 번째는 첫 번째 후 X 위치이고, 세 번째는 그 이후 Y 위치입니다.

암호

O`(?<=\([^)]*)[^)]

코드 내의 모든 문자를 정렬하여 시작하십시오.

T`L.`d

문자에서 숫자로 음역 (매핑)을 수행하십시오.

(?<=\([^)]*)\d
$*x 

대괄호 안의 모든 숫자는 단항 표시 ( xs 사용 )와 공백으로 대체하십시오 .

\)
m¶

모든 닫는 괄호를 m새 줄로 바꿉니다 . 는 m오는 루프 종류의 마커로 사용됩니다 :

+`\b(x+) \1(x+) m
$1 m$2 

더 이상 교체 할 수 없을 때까지 반복되는 교체 단계입니다. 는 x앞에 s 의 마지막 두 시퀀스를 취하고 두 m번째에서 첫 번째를 빼서 m뒤로 이동합니다 . m이 작업은 오른쪽에서 왼쪽으로 수행해야하므로 마커 가 필요합니다.

 m?x

첫 번째 x를 제외한 각 시퀀스 에서 첫 번째 를 제거하십시오 .

T`x m(`.\O_

T대체하여 ransliterate x.함께 공간 O및 삭제 m(.

이 시점에서 코드의 모든 선이 생성되었습니다. 이제 단일 노트 라인을 만들어야합니다.

\d
$*.O¶

각 숫자를 그 숫자로 바꾸고 .그 뒤에 O줄 바꾸기를 입력하십시오.

¶
6$*.¶
%7>`.

.오른쪽에 s를 추가하여 각 줄을 길이 7 로 채 웁니다. 이것은 .각 줄의 끝에 6 s를 추가 하고 (각 줄은 적어도 하나의 다른 문자를 갖습니다) 각 줄의 처음 7 이후의 모든 문자를 아무 것도 바꾸지 않습니다. ( .9에 매핑 되므로 O해당 라인에서 잘립니다)



0

펄 5-78 + 1 (플래그) + 2 (입력 따옴표) = 81 바이트

for(;/(\([a-g]+\)|[a-g\.])/g;){$i=$1;print$i=~/$_/?'o':'.'for(a..g);print"\n"}

다음과 같이 실행할 수 있습니다.

perl -n <name of file holding script> <<< <input in quotations>

따옴표로 묶은 입력이 2 바이트를 더한다고 생각하지 않습니까? 그렇지 않으면이 진술에 대한 메타 합의가있을 수 있기 때문에 나는 틀릴 수 있습니다.
Okx

@Okx가 바이트 수를 업데이트했습니다. 그것이 추가되었는지 확실하지 않았지만, 여기에 여전히 새로운 것이 있습니다 :)
CraigR8806

0

루비, 68 바이트

->s{w=?.*m=7
s.bytes{|i|i>64?w[i-65]=?O:m=i!=40;m&&(puts w;w=?.*7)}}

아이디어는 .......문자를 찾을 때마다 문자열을 수정 한 다음 출력하고 재설정하지만 대괄호 밖에있는 경우에만 재설정하는 것입니다. (출력을 끕니다. ). 두 스위치는 /의 출력을두고 있지만,이 브라켓 내부에 발견되지 않을 것 같은 후자는 하찮은이다.

테스트 프로그램에서 언 골프

f=->s{w=?.*m=7              #set m to a truthy value (7) and w to seven .'s
  s.bytes{|i|               #for each byte in the string
    i>64?w[i-65]=?O:m=i!=40 #if a letter, modify the appropriate character of w ELSE set m to false if inside brackets, true otherwise.
    m&&(puts w;w=?.*7)      #if m is true, output the contents of w and reset to seven .'s
  }
}

p 1
f["B(ACE)D"]
p 2
f["B"]
p 3
f["GGABC"]
p 4
f["A..F.C(DA)."]
p 5
f[".(ABCDEF)"]

0

파이썬 3, 94 바이트

익명의 기능

import re
lambda s:[''.join('.O'[c in x]for c in'ABCDEFG')for x in re.findall(r'\(\w+\)|.',s)]

0

하스켈 , 101 바이트

c#s|elem c s=c|1<3='.'
s?r=map(#s)"ABCDEFG":p r
p('(':r)|(x,_:t)<-span(')'<)r=x?t
p(x:r)=[x]?r
p e=[]

온라인으로 사용해보십시오! 용법:p "AB.(CA)D" . 문자열 목록을 반환합니다.

설명:

함수 p는 문자열을 통해 반복됩니다. 여는 괄호 '('를 찾으면 닫는 괄호가 나타나기 전에 (x,_:t)<-span(')'<)r나머지 문자열 r을 문자열 로 분할 하고x')'t 그 이후에한다. 그렇지 않으면 현재 문자 x가 문자열로 바뀝니다 [x]. 두 경우 모두 함수 ?는 현재 메모 문자열과 나머지 문자열로 호출됩니다. 문자열 위에 ?함수 #를 매핑합니다 "ABCDEFG". 여기서 #현재 메모 문자열에없는 모든 문자를 로 바꿉니다 '.'. 결과 음악 상자 행은 p나머지 목록 의 재귀 호출 앞에 추가됩니다 r.


0

레티 나 0.8.2 , 52 바이트

\(\w+\)|.
abcdefg$&¶
+`([a-g])(.*)\1
O$2
T`().l`___.

온라인으로 사용해보십시오! 소문자로 입력합니다. 설명:

\(\w+\)|.
abcdefg$&¶

음악을 코드 또는 음표로 분리하고 음표 목록을 추가하여 출력을 만들기 시작합니다.

+`([a-g])(.*)\1
O$2

각 화음의 각 음에 대해 출력을로 변경하고 화음 O에서 음을 삭제합니다.

T`().l`___.

현재 불필요한 음악을 모두 삭제하고 일치하지 않는 모든 메모를 비워 두십시오.


0

PHP, 93 바이트

for($s=$t="
.......";$c=ord($argn[$i++]);$d||$s=$t.!print$s)$c<65?$c-46&&$d=~$c&1:$s[$c&7]=O;

-nR또는 로 파이프로 실행 온라인으로 시도 .

고장

for($s=$t="\n.......";      // init
    $c=ord($argn[$i++]);    // loop through characters
    $d||                        // 2. if chord flag is unset
        $s=$t.!print$s)             // then print and reset chord
    $c<65                       // 1. if not note
        ?$c-46                      // and not dot
            &&$d=~$c&1              // then set or clear chord flag
        :$s[$c&7]=O             // else set note in chord
    ;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.