Code Golf: ผสมถั่วเพื่อที่จะไม่ได้สัมผัสชนิดเดียวกัน


16

การป้อนข้อมูล:

อินพุตคืออาร์เรย์ของถั่วแบบสุ่ม (ในภาษาของคุณ) ถั่วที่เป็นไปได้มีดังนี้ โปรแกรมของคุณต้องมีวิธีในการเป็นตัวแทนของถั่วแต่ละชนิดเช่นรหัสจำนวนเต็ม โปรแกรมจะต้องสามารถจัดการขนาดอาร์เรย์ของการกำหนดค่าของถั่วใด ๆ

ถั่วที่เป็นไปได้:

Kola nut
Macadamia
Mamoncillo
Maya nut
Mongongo
Oak acorns
Ogbono nut
Paradise nut
Pili nut
Pistachio
Walnut

เอาท์พุท:

เอาต์พุตจะต้องเป็นอาเรย์ที่เรียงลำดับตามแบบที่ไม่มีถั่วชนิดเดียวกัน หากเป็นไปไม่ได้ผลลัพธ์ควรเป็นอาเรย์ที่ว่างเปล่า

ตัวอย่างอินพุท (ประยุกต์):

["walnut", "walnut", "pistachio"]

ตัวอย่างผลลัพธ์:

["walnut", "pistachio", "walnut"]

การแก้ปัญหาอาจไม่เพียงแค่สับเปลี่ยนอาเรย์จนกว่าจะมีความเป็นเอกลักษณ์โดยบังเอิญ ประเภทการจ้างงานจะต้องกำหนดขึ้น

ถั่วผสม?  ฉันเห็นอัลมอนด์สองอันแตะต้อง!


4
"โปรแกรมของคุณต้องมีวิธีในการเป็นตัวแทนของถั่วแต่ละชนิดเช่นรหัสจำนวนเต็ม" ทำไมถึงเป็นเช่นนั้น - "อาจไม่เพียงแค่สับเปลี่ยนอาร์เรย์จนกว่าจะกลายเป็นเอกลักษณ์โดยบังเอิญการเรียงลำดับที่ใช้ต้องเป็นแบบกำหนดขึ้นหนึ่ง" การสลับแบบยังสามารถกำหนดได้ คุณหมายถึงการจำกัดความซับซ้อนของเวลาของโปรแกรมหรือไม่?
หยุดที่จะเปลี่ยนรหัสลับเมื่อ

1
ฉันต้องเห็นด้วยกับ @leftaroundabout เกี่ยวกับอัลกอริทึมเฉพาะที่โง่โดยไม่มีเหตุผลที่ดีมาก หนึ่งในสิ่งที่คุ้มค่ามากที่สุดเกี่ยวกับเกมโค้ดเช่นนี้คือความหลากหลายของวิธีการที่ใช้
dmckee --- ผู้ดูแลอดีตแมว

@dmckee ฉันคิดว่าข้อกำหนดที่ว่าอัลกอริทึมนั้นถูกต้องเหมาะสม - ถ้า RNG ผิดพลาดหรืออินพุตค่อนข้างนานโซลูชัน nondeterministic อาจล้มเหลวในการยุติ
บูธโดย

@boothby Meh ฉันเป็นนักฟิสิกส์อนุภาค Monte Carlo เป็นเครื่องมือสำคัญในสิทธิของตนเอง ยิ่งกว่านั้นถ้าฉันเลือก PRNG คงที่และเมล็ดคงที่มันจะถูกกำหนดไว้
dmckee --- ผู้ดูแลอดีตแมว

1
ฉันคิดว่าฉันพบตัวอย่างที่มีวิธีแก้ปัญหาหลายอย่าง แต่อาจทำให้บางคำตอบไม่สามารถหาคำตอบได้ ฉันสามารถเพิ่มมันได้หรือไม่ (5,4,4,3,3,2) perl6 -e 'my @a="aaaaabbbbccccdddee".comb;my @b = @a.pick(*) while @b.squish !== @a;say [~] @b' baedcbdacdecbabaca(3,3,2) อาจทำให้พวกเขาล้มเหลวด้วย
แบรดกิลเบิร์ต b2gills

คำตอบ:


8

GolfScript, 42 41 37 38 ตัวอักษร

~.`{\`{=}+%1-,}+$.,)2//zip[]*.2<..&=*p

รหัสคาดว่าอินพุตใน STDIN และพิมพ์ผลลัพธ์ไปที่ STDOUT เช่น:

> ["walnut" "walnut" "walnut" "macadamia" "pistachio"]
["walnut" "macadamia" "walnut" "pistachio" "walnut"]

> ["walnut" "walnut" "walnut" "macadamia" "walnut"]
[]

สคริปต์ยาวเกินกว่าที่คาดการณ์ไว้ แต่ฉันคิดว่ามีที่ว่างสำหรับการปรับปรุง

แก้ไข: กรณีของรายการที่มีรายการเดียวมีค่าใช้จ่ายฉัน 1 ตัวอักษร (การเปรียบเทียบที่ดีที่สุดที่ฉันสามารถเกิดขึ้นได้นั้นเหมือนกับของปีเตอร์)


1
ฉันยังไม่ได้นั่งที่จะใช้สิ่งนี้ แต่$.,)2//zipเป็นสิ่งที่ฉันมีอยู่ในใจ การตีความสเป็คของฉันคือมันสามารถรับอินพุตบนสแต็กและวางไว้บนสแต็กดังนั้นบางทีเราควรผลักดันเพื่อความกระจ่าง
Peter Taylor

@PeterTaylor เจ๋งมาก ได้ผลสำหรับฉัน
บูธโดย

สิ่งนี้ขัดข้องกับอินพุต["walnut"]ในส่วนการเปรียบเทียบสองส่วนแรก
Peter Taylor

@PeterTaylor คุณพูดถูก ฉันจะต้องทำงานในกรณีมุมนั้น
Howard

6

GolfScript, 32 ตัวอักษร

~:x{]x\-,}$.,)2//zip[]*.2<..&=*`

รูปแบบอินพุตและเอาต์พุตเดียวกันกับโซลูชันของ Howard


ฉันมีความคิดแบบเดียวกันในส่วนของการเรียงลำดับ แต่ยังไม่ได้เขียนโค้ดขึ้นมา :-) ทำได้ดีมาก!
Howard

6

Brachylog v2, 10 ไบต์

p.¬{s₂=}∨Ė

ลองออนไลน์!

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

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

คำอธิบาย

p.¬{s₂=}∨Ė
p            Find a permutation of {the input}
  ¬{   }     which does not have the following property:
    s₂         it contains a pair of adjacent elements
      =        that are equal
        ∨    {no constraint on what value the equal elements can have}
 .           If you find such a permutation, output it.
        ∨    If no permutation is found, ignore the input and
         Ė     {output} an empty list

1

J, 80 ตัวอักษร

]`_:@.(0<2&([:+/=/\))({.~-:@#),((],.|.)~>.@-:@#)<"1;(\:#&.>)(</.])[;.1' ',1!:1[1

ไม่ได้อยู่ในลีกเดียวกันกับ Golfscript ในเกมนี้ ฉันสงสัยว่าจะมีการทำกำไร แต่ตัวละคร 14 ตัวที่จำเป็นเพียงเพื่อให้ได้รายชื่อเข้าร่วมในโปรแกรม[;.1' ',1!:1[1เป็นอุปสรรคสำคัญ

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

ตัวอย่าง:

macadamia walnut walnut pistachio walnut

กลุ่ม(</.]):

macadamia walnut walnut walnut pistachio

จัดเรียง(\:#&.>):

walnut walnut walnut macadamia pistachio

ravel ((],.|.)~>.@-:@#):

walnut macadamia walnut pistachio walnut


0

Stax , 10 ไบต์

│éÿ∞å[zàL⌂

เรียกใช้และแก้ไขข้อบกพร่อง

ต่อไปนี้เป็นโปรแกรมเดียวกันที่คลายแพ็ก ungolfed และแสดงความคิดเห็น

|T      get all permutations
{       block to filter by
  :g_=  after dropping repeated elements, it's still equal
f       execute filter
|c      terminate and pop if falsy (no match)
hJ      take the first permutation, and join with spaces

เรียกใช้อันนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.