ยกเลิกการเข้ารหัสรหัสพาร์สัน


22

บทนำ

รหัสพาร์สันส์เป็นเพียงวิธีง่ายๆในการอธิบายการเปลี่ยนแปลงสนามในชิ้นส่วนของเพลงไม่ว่าจะเป็นบันทึกที่สูงกว่าหรือต่ำกว่าก่อนหน้านี้หนึ่ง

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


ลักษณะ

แต่ละรูปแบบจะถูกแทนด้วยอักขระเดียวซึ่งเป็นหนึ่งในสิ่งต่อไปนี้:

  • Rถ้าโน้ตเหมือนกันกับโน้ตก่อนหน้า (หมายถึง" R epeat" )
  • Uถ้าบันทึกสูงกว่าโน้ตก่อนหน้า (หมายถึง" U p" )
  • Dถ้าโน้ตต่ำกว่าโน้ตก่อนหน้า (หมายถึง" D own" )

*หมายเหตุเริ่มต้นเขียนเป็น


ตัวอย่าง

นี่คือตัวอย่างของรหัส Parsons (จุดเริ่มต้นของ"Ode to Joy" ):

*RUURDDDDRUURDR

คุณสามารถเห็นภาพได้จริงเช่นนี้:

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

เราจะเรียกว่ารูปร่างจากนี้

กฎสำหรับการวาดภาพเคานต์เตสนั้นได้รับการพิจารณาด้วยตนเองโดยตัวอย่างข้างต้น



ท้าทาย

ตอนนี้ความท้าทายที่แท้จริงมา

เขียนโปรแกรมที่ให้รูปร่างเป็นอินพุตเอาต์พุตรหัสพาร์สันที่สอดคล้องกัน

คุณไม่ได้ถูกขอให้วาดเส้นโครงร่าง แต่ตรงกันข้ามกับที่จริง
จาก contour ให้ค้นหารหัส Parsons ดั้งเดิม


กฎระเบียบ

  • ใช้กฎปกติสำหรับการเล่นกอล์ฟรหัส
  • โปรแกรมที่สั้นที่สุดในจำนวนไบต์ชนะ
  • อินพุตเป็นรูปร่างและผลลัพธ์จะเป็นรหัสพาร์สันที่ถูกต้อง
  • รายละเอียดเกี่ยวกับพื้นที่ว่างพิเศษสำหรับอินพุตไม่เกี่ยวข้องทำในสิ่งที่ดีที่สุดสำหรับคุณ
  • คุณไม่ได้รับอนุญาตให้ใช้ฮาร์โค้ดไม่ทางใดทางหนึ่งส่วนของเอาท์พุทและ / หรือโปรแกรมที่ใช้ช่องว่างพิเศษเนื่องจากกฎก่อนหน้า

หมายเหตุ


1
ที่เกี่ยวข้อง: codegolf.stackexchange.com/q/58759/3808
Doorknob

ดังนั้นจะต้องเริ่มจาก*สิ่งที่ไม่ทำอะไรเลยเหรอ?
nicael

คุณหมายถึงอะไร เมื่ออินพุตเป็นเพียง*? Nope มันควรจะพิมพ์*ฉันคิดว่า ฉันจะเพิ่มกรณีมุมนี้
Helge von Koch

1
@nicael ใช่มันต้อง*เริ่มต้นด้วย เสมอ.
Helge von Koch

2
ที่เกี่ยวข้อง: codegolf.stackexchange.com/q/55593/42545
ETHproductions

คำตอบ:


4

Pyth - 28 25 27 25 ไบต์

บันทึก 2 ไบต์ขอบคุณ @Jakube

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

ลองมันออนไลน์ได้ที่นี่


1
มันไม่ทำงาน*เป็นอินพุต เอาท์พุทคือในขณะที่มันควรจะเป็นเพียงแค่*0 *มีศูนย์ต่อท้ายชั่วร้ายปรากฏขึ้น
Helge von Koch

@HelgevonKoch ได้รับการแก้ไข
Maltysen

@Jakube ขอบคุณ!
Maltysen

คุณได้เปลี่ยนUและDโดยวิธีการ มิฉะนั้นทำได้ดี
Helge von Koch

@HelgevonKoch อุ้ย
Maltysen

24

CJam, 21 ไบต์

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

พับสาย ( :) โดย vectorizing ( .) e>การดำเนินงานสูงสุดของตัวละครที่ชาญฉลาด เนื่องจากมีอักขระที่ไม่ใช่ช่องว่างเพียงตัวเดียวในแต่ละคอลัมน์คอลัมน์นี้จะเป็นผลลัพธ์เนื่องจากช่องว่างมีรหัส ASCII ที่เล็กกว่าอักขระที่ไม่ใช่ช่องว่างที่พิมพ์ได้ทั้งหมด

Unshift และพิมพ์เครื่องหมายดอกจันแรก(oจากนั้นจับคู่2%อักขระอื่น ๆที่เหลืออยู่เพื่อUDRใช้การจัดทำดัชนีแบบแยกส่วน

โซลูชันเก่า (29 ไบต์)

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

qN/รับบรรทัดอินพุต zสลับเมทริกซ์อักขระนี้ 2%ลดลงทุกแถวคี่ '*f#ค้นหาดัชนีของเครื่องหมายดอกจันในแต่ละแถว 0+2ew);รับดัชนีคู่ต่อเนื่องทั้งหมด ::-คำนวณความแตกต่างของพวกเขาและ"RDU"f=แผนที่พวกเขาไปยังตัวอักษร (ผ่านการจัดทำดัชนี modular: 0 → R, 2 → U, -2 ≡ 1 → D) ชั้นนำ'*prepends เครื่องหมายดอกจัน

แก้ไข : ฉันเปลี่ยน2ewไป0+2ew);ทำงานกับ CJam ที่ไม่จัดการew(ชิ้นต่อเนื่อง) ในรายการที่สั้นเกินไป *นี้จะทำให้การทำงานรหัสสำหรับสายป้อน

ลองที่นี่หรือดูการทำงาน:

              

7
นี่มันช่างยอดเยี่ยมจริงๆ
Jeel Shah

2
ฉันเห็นด้วย! +1 สำหรับโค้ดหวังว่าฉันจะสามารถ +10 สำหรับ GIF ได้
ETHproductions

BTW ฉันชอบยิ้มที่ความยาวรหัส 17:-p
ETHproductions

1
ฉันเห็นด้วยว่ามันเยี่ยมยอดมากที่ได้ดู มันไม่ทำงาน*เหมือนอินพุต ฉันเป็นคนดีRuntimeExceptionแทน
Helge von Koch

อืมฉันคิดว่าข้อผิดพลาดของ CJam: [X]2ewควรกลับมา[]แทนที่ข้อผิดพลาด ฉันจะเพิ่มวิธีแก้ปัญหา
ลินน์

4

Python 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'-/\\')

อินพุตต้องเป็นอาร์เรย์ของสตริง สำหรับตัวอย่างข้างต้นสิ่งนี้ดูเหมือนว่า:

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

Ungolfed:

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 ไบต์ ความแตกต่างที่สำคัญคือการใช้ tuple แบบมีเงื่อนไขแทนการแปล
wnnmaw

ขอบคุณ @wnnmaw! ฉันคิดว่าฉันสามารถตีกอล์ฟลงได้อีก!
Sherlock9

การเล่นกอล์ฟที่ดีบนเงื่อนไขที่ด้านหน้านั่นคือความฉลาดหลักแหลม!
wnnmaw

อ้า ขอบคุณสำหรับเคล็ดลับ @wnnmaw
Sherlock9

3

ทับทิม 87 ไบต์

ต้องใช้ช่องว่างต่อท้ายในอินพุตเพื่อให้ทุกบรรทัดมีความยาวเท่ากัน

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

4
>:Dแน่นอนนี้เป็นรหัสที่เป็นอันตรายเนื่องจากมี
Alex A.

3

Japt, 38 ไบต์40 41 45 46 48

บันทึก 2 ไบต์ด้วย @ETHproductions

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

หากมีคำสั่งตัดนี้จะเป็นเพียง 38 ไบต์ -; จะเพิ่มคำอธิบายเมื่อฉันเล่นกอล์ฟเสร็จแล้ว :Pไม่ได้โปรแกรมพยายามที่จะเป็นตลกก็จริงโปรแกรมไม่สนใจตัวละครที่ไม่สำคัญ

ลองออนไลน์


เมื่อฉันเห็นว่ามีความท้าทายในทางปฏิบัติที่ต้องการการเปลี่ยนแถวและDoᴡɴɢᴏᴀᴛตอบมันฉันรู้ว่ามันต้องเป็น Japtize
ETHproductions

BTW ฉันจะเพิ่มฟังก์ชั่นการตัดแต่งที่xและย้ายและหมุนฟังก์ชั่นที่yและz(แยกที่ newlines ใช้ฟังก์ชันอาร์เรย์เข้าร่วมกับการขึ้นบรรทัดใหม่)
ETHproductions

คุณสามารถบันทึกสองไบต์ดังนี้:Yu ?"RUD"g1+(XrS c -47 g):P
ETHproductions

@ETHproductions ขอบคุณลงต่ำกว่า 40 ไบต์!
Downgoat

3

Haskell, 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

Mathematica, 103 ไบต์

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

ค่อนข้างสั้นพิจารณาว่านี่เป็นความท้าทายในการประมวลผลสตริง


2

JavaScript (ES6) 90

ฟังก์ชั่นที่ไม่ระบุชื่อ มันจะสแกนอักขระสตริงอินพุตด้วยอักขระถ่านโดยคำนึงถึงตำแหน่งในบรรทัดปัจจุบัน การทำเช่นนี้มันสร้างอาร์เรย์เอาท์พุท 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.