ทำกล่องดนตรี


23

งานของคุณคือการใช้ลำดับของตัวละคร (เพลง) เป็นอินพุต (ในฟังก์ชั่นหรือโปรแกรม) และพิมพ์ (หรือส่งคืน) เพลงตามที่ดูเหมือนในกล่องดนตรี

คุณจะได้รับเฉพาะอักขระABCDEFG.()เป็นอินพุตและอินพุตจะไม่ว่างเปล่า คุณอาจได้รับจดหมายเป็นตัวพิมพ์เล็กหากคุณต้องการ

นี่คือกล่องดนตรีเปล่าที่มีความยาว 3:

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

อย่างที่คุณเห็นบรรทัดนั้นมีความยาว 7 ตัวอักษรและเนื่องจากความยาวของกล่องดนตรีคือ 3 เราจึงมี 3 บรรทัด มีเพียง.ที่นี่เนื่องจากกล่องดนตรีว่างเปล่า มาฟังเพลงกัน!

อันดับแรกเราสร้างกล่องดนตรี CDAG.DAGในตัวอย่างนี้การป้อนข้อมูลที่จะเป็น

ความยาวเท่ากับCDAG.DAG8 ดังนั้นเราต้องมีกล่องดนตรีที่มีความยาว 8:

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

จากนั้นเราอ่านอินพุตหนึ่งตัวอักษรในแต่ละครั้งและวางOตำแหน่งที่เกี่ยวข้อง

ตัวอักษรตัวแรกคือCและตำแหน่งของแต่ละโน้ตนั้นเทียบเท่ากับสิ่งนี้ (ฉันได้เพิ่มช่องว่างเพื่อความชัดเจน):

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

หากอักขระอินพุตเป็น a .เราจะพิมพ์บรรทัดว่าง.......

ดังนั้นCตัวละครที่สามจะเป็นไปตาม ลองใส่ในกล่องดนตรีของเราที่ด้านบน:

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

เราจะทำขั้นตอนนี้ซ้ำสำหรับตัวละครอื่น ๆ ทั้งหมด (ข้อความในวงเล็บเป็นเพียงการแสดงบันทึกย่อให้คุณทราบเท่านั้นคุณไม่ควรส่งออก)

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

เนื่องจากวิธีการที่เพลงกล่องทำงานถ้าเราใช้ตัวละครอื่น ๆ กว่าO, .และ<insert newline here>เช่นพื้นที่ในการส่งออกของเราแล้วมันจะไม่เล่นเพลงที่ถูกต้อง!

นี่คือคอร์ด:

(ACE)

คอร์ดนี้จะสอนให้เราเล่นโน้ตA, CและEในเวลาเดียวกัน จะไม่มีการหยุดชั่วคราว (เช่น.) ในคอร์ด

นี่คือวิธีการเขียน:

O.O.O...

และนี่คือลักษณะที่ปรากฏในเพลง: B(ACE)D

คุณจะไม่ได้รับเสียงประสานในคอร์ดนั่นคือสิ่งนี้จะไม่ถูกต้อง: (AB(CD)EF)หรือสิ่งนี้: 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

เอาต์พุตสามารถเป็นรายการ / อาร์เรย์ของอักขระได้หรือไม่?
ร็อด

@ แน่ใจว่าเป็นไปตามมาตรฐาน
PPCG

เรารับประกันว่าจะไม่ได้รับโน้ตสองอันในคอร์ดเดียวกันหรือไม่?
ธุรกิจ Cat

คำตอบ:


0

Pip , 29 ไบต์

โค้ดขนาด 28 ไบต์ +1 สำหรับการ-lตั้งค่าสถานะ

'.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

Python 2 , 95 94 ไบต์

-1 ไบต์ด้วย Value Ink

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

ลองออนไลน์! หรือลองกรณีทดสอบทั้งหมด

คำอธิบาย

'@'<iคือการตรวจสอบว่าiเป็นตัวอักษรแทนที่.โดยOในตำแหน่งที่เหมาะสม
'*'>iคือการตรวจสอบว่าiเป็นวงเล็บถ้ามันx=i>'('จะใส่0ในxการป้องกันไม่ให้การพิมพ์ / การทำความสะอาดoเมื่อi==')'มันจะใส่1ในxการเปิดใช้งานการพิมพ์ / oการทำความสะอาด
เมื่อi=='.'ไม่มีอะไรจะเปลี่ยนแปลงและ'.......'จะถูกพิมพ์
คำสั่ง charater จะได้รับจากรหัส ASCII ของพวกเขาที่'('<')'<'*'<'.'<'@'<'A'


โอ้ฉันคิดถึงความคิดเห็นนั้น NVM
quintopia

['.']*7คลองจุลภาค: บางทีมันอาจเป็นสิ่งที่หลงเหลือมาจากเมื่อคุณใช้ tuple ซึ่งจะต้องใช้เครื่องหมายจุลภาค นอกจากนี้ฉันอาจผิด แต่ดูเหมือนว่าจะส่งออกอาร์เรย์['O', '.', '.', '.', '.', '.', '.']ต่อบรรทัดและฉันไม่แน่ใจว่าได้รับอนุญาตหรือไม่
มูลค่าหมึก


คุณพูดถึงการเปลี่ยนแปลงไบต์และเปลี่ยนการเชื่อมโยง 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

Röda , 97 78 76 bytes

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

ลองออนไลน์!

มันเป็นฟังก์ชั่นนิรนามที่อ่านอินพุตจากสตรีม ใช้มันแบบนี้: main { f={...}; push("ABCD") | f() }. มันใช้ regex จากคำตอบของ ETHproductions

Ungolfed:

{
    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

JavaScript (ES6), 86 85 76 ไบต์

บันทึกแล้ว 9 ไบต์ขอบคุณ @Neil

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>

คำอธิบาย

อันดับแรกเราจับคู่สิ่งที่จะสร้างแต่ละบรรทัดของเอาต์พุต: chords และ chars ที่ไม่ได้เป็นส่วนหนึ่งของ chord จากนั้นสำหรับแต่ละบรรทัดเราจะใช้สตริงABCDEFG\nและแทนที่อักขระที่ไม่ใช่บรรทัดใหม่แต่ละรายการด้วยสตริงOถ้ามีในบรรทัดและอักขระ.อื่น


หากมีการขึ้นบรรทัดใหม่เป็นที่ยอมรับคุณสามารถบันทึก 8 s=>s.replace(r=/\(\w+\)|./g,x=>`ABCDEFG\n`.replace(r,c=>x.match(c)?"O":"."))ไบต์ใช้
Neil

@ Neil Wow นั่นเป็นเรื่องที่น่าอัศจรรย์ :-)
ETHproductions

Huh ตอนนี้ที่ฉันวัดมันอีกครั้งควรจะประหยัด 10 byte ...
Neil

สามารถ\)เป็น.?
l4m2

2

JavaScript (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

Ruby, 78 75 71 ไบต์

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

ส่งคืนอาร์เรย์ของสตริง

คำอธิบาย Ungolfed +

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+$/}(สลับscanกับgsub, ลบmap, และข้ามอันแรก|x|เนื่องจากคุณสามารถใช้$&เพื่อเข้าถึงการจับคู่ regex ครั้งล่าสุด) เพื่อบันทึก 3 ไบต์และส่งกลับสตริงหลายบรรทัดแทน ( $/แผนที่จะขึ้นบรรทัดใหม่ตามค่าเริ่มต้นด้วย)
มูลค่าหมึก

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>`.

ฉันแน่ใจว่ามีห้องสำหรับเล่นกอล์ฟ แต่ตอนนี้ใช้งานได้ดังนั้นฉันจะลองเล่นกอล์ฟอีกครั้งในภายหลัง

ลองออนไลน์!

มันทำงานอย่างไร

โดยทั่วไปโปรแกรมทำงานโดยการเปลี่ยนอักขระแต่ละตัวเป็นตัวเลขจากนั้นกำหนด a Oให้กับตำแหน่งนั้นในบรรทัด มันแผนที่จะABCDEFG.01234569

ในการสร้างบรรทัดบันทึกย่อเดียวสิ่งที่ต้องทำทั้งหมดคือการใส่Oจำนวนที่สอดคล้องกันหลังจาก.นั้นจึงลากเส้นบรรทัดที่มีความยาว 7 ตัวอักษร

อย่างไรก็ตามคอร์ดนั้นค่อนข้างยากที่จะทำ มีการใช้กระบวนการที่คล้ายกัน แต่จะต้องมีการแปลตัวเลขเป็นเพิ่มเช่นข้อความแรกในคอร์ดคือ (อะไรก็ตาม) ที่สองคือตำแหน่ง X หลังจากที่หนึ่งครั้งที่สามที่สามคือตำแหน่ง Y หลังจากนั้นเป็นต้น

รหัส

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

เริ่มต้นด้วยการจัดเรียงอักขระทั้งหมดภายในคอร์ด

T`L.`d

ดำเนินการทับศัพท์ (การแมป) จากตัวอักษรเป็นตัวเลข

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

แทนที่ตัวเลขทั้งหมดภายในวงเล็บด้วยการเป็นตัวแทนเอก (ใช้xs) ตามด้วยเว้นวรรค

\)
m¶

แทนที่วงเล็บปิดทั้งหมดด้วยmบรรทัดใหม่ mจะถูกใช้เป็นเครื่องหมายของแปลกสำหรับวงมา:

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

นี่คือขั้นตอนการแทนที่ที่วนซ้ำจนกว่าจะไม่สามารถแทนที่ได้อีกต่อไป มันใช้สองลำดับสุดท้ายของxs ก่อนหน้าmและลบส่วนที่หนึ่งออกจากวินาทีแล้วเคลื่อนย้ายmด้านหลัง mจำเป็นต้องมีตัวทำเครื่องหมายเพราะต้องดำเนินการนี้จากขวาไปซ้าย

 m?x

ลบอันแรกxในแต่ละลำดับยกเว้นอันแรก

T`x m(`.\O_

Transliterate โดยการแทนที่xด้วย.พื้นที่ที่มีOและการลบและm(

เมื่อมาถึงจุดนี้ทุกสายสำหรับคอร์ดได้ถูกสร้างขึ้น ตอนนี้จะต้องสร้างบรรทัดบันทึกย่อเดียว

\d
$*.O¶

แทนที่ตัวเลขแต่ละตัวด้วยจำนวนมาก.นั้นตามด้วยOและขึ้นบรรทัดใหม่

¶
6$*.¶
%7>`.

วางแต่ละบรรทัดเป็นความยาว 7 โดยเพิ่ม.s ไปทางขวา วิธีนี้ใช้งานได้โดยเพิ่ม 6 .วินาทีไปยังจุดสิ้นสุดของแต่ละบรรทัด (แต่ละบรรทัดจะมีอักขระอื่นอย่างน้อย 1 ตัว) จากนั้นแทนที่อักขระทุกตัวหลังจาก 7 ตัวแรกในแต่ละบรรทัดโดยไม่มีอะไร (ตั้งแต่.แผนที่ถึง 9 Oจะถูกตัดออกบนเส้นเหล่านั้น)



0

Perl 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 อัพเดท bytecount ของฉัน ไม่แน่ใจว่ามันเข้ามามันยังค่อนข้างใหม่ที่นี่ :)
CraigR8806

0

ทับทิม 68 ไบต์

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

ความคิดคือการปรับเปลี่ยนสตริง.......ทุกครั้งที่เราพบจดหมายจากนั้นส่งออกและรีเซ็ตมัน แต่เมื่อเราอยู่นอกวงเล็บ (ปิดสวิทช์เอาท์พุท)และ.ทั้งสองสลับ / เปิดเอาต์พุต แต่สิ่งหลังไม่สำคัญเนื่องจากจะไม่พบในวงเล็บ

Ungolfed ในโปรแกรมทดสอบ

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

Python 3, 94 ไบต์

ฟังก์ชั่นที่ไม่ระบุชื่อ

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

0

Haskell , 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"ที่แทนตัวอักษรทั้งหมดที่ไม่ได้อยู่ในสตริงปัจจุบันของบันทึกด้วย# '.'ส่งผลให้สายกล่องดนตรีจะใช้ได้กับสาย recursive ของในรายการที่เหลือpr


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.