มาเล่น Rummikub กันเถอะ!


11

หมายเหตุ: สิ่งนี้เกี่ยวข้องกับการเปลี่ยนแปลงของเกมRummikub


พื้นหลังและกฎ

Rummikubเป็นเกมแบบเรียงต่อกัน มีสี่สีคือแดงส้มน้ำเงินและดำ สำหรับแต่ละสีนั้นจะมีไพ่ 13 ใบ (ที่มีป้ายกำกับตั้งแต่ 1 ถึง 13) และยังมีโจ๊กเกอร์ 2 ชิ้นที่ไม่ขึ้นกับสีจึงมีทั้งหมด 54 ชิ้น ในรูปแบบของ Rummikub นี้ผู้เล่นแต่ละคนจะได้รับไพ่ 14 ใบและจะต้องได้ไพ่เพิ่มอีกหนึ่งแผ่นและวางไพ่อีกหนึ่งใบในแต่ละรอบ ผู้เล่นไม่เห็นไพ่ของกันและกัน เป้าหมายคือการจัดกลุ่มกระเบื้องเพื่อให้ทุกชิ้นเป็นของกลุ่มอย่างน้อยหนึ่งกลุ่ม (ดูด้านล่าง) เมื่อผู้เล่นมีการจัดกลุ่มชิ้นส่วนทั้งหมดพวกเขาจะวางกระดานไทล์และเปิดเผยชิ้นส่วน จากนั้นคนอื่น ๆ ตรวจสอบว่าชุดค่าผสมทั้งหมดถูกต้องหรือไม่และถ้าเป็นเช่นนั้นผู้เล่นชนะรอบนั้นหรือไม่

กระเบื้องสามารถจัดกลุ่มได้อย่างไร?

มีกลุ่มสองประเภทเท่านั้น:

  • กลุ่มหลายสี :

    • ประกอบด้วย 3 หรือ 4 แผ่น
    • พวกเขามีเพียงกระเบื้องที่มีหมายเลขเดียวกันกับพวกเขา
    • กระเบื้องทั้งหมดมีสีแตกต่างกัน
    • ตัวอย่าง: RED 9, BLUE 9, BLACK 9.
  • กลุ่มสีโมโน :

    • พวกเขาประกอบด้วยอย่างน้อย 3 แผ่น
    • พวกเขาไม่สามารถมีมากกว่า 13 แผ่น
    • พวกเขามีเพียงกระเบื้องที่มีหมายเลขแตกต่างกันติดต่อกันในลำดับเรียง
    • กระเบื้องทั้งหมดมีสีเดียวกัน
    • กระเบื้องที่มีป้ายกำกับ1 อาจจะไม่ได้13เป็นสถานที่หลังจากกระเบื้องที่มีป้ายกำกับ
    • ตัวอย่าง: RED 5, RED 6, RED 7.

รอสิ่งที่นักเลงทำอะไร?

โจ๊กเกอร์สามารถทดแทนชิ้นส่วนใดก็ได้ในเกม ตัวอย่างเช่นตัวอย่างแรกของเราจะกลายเป็น JOKER, BLUE 9, BLACK 9, หรือRED 9, JOKER, BLACK 9 RED 9, BLUE 9, JOKERเช่นเดียวกับตัวอย่างอื่น ๆ ของเรา อย่างไรก็ตามหนึ่งอาจไม่ได้วาง Jokers สองคนในกลุ่มเดียวกันดังนั้นสิ่งต่าง ๆ ที่JOKER, ORANGE 8, JOKERเป็นสิ่งต้องห้าม


งาน

ให้กลุ่มกระเบื้อง Rummikub พิจารณาว่าถูกต้องหรือไม่ คุณรับประกันได้ว่าจะไม่มีการเรียงต่อกันที่ซ้ำกันยกเว้นสำหรับนักต้มตุ๋น 2 คนและการเรียงต่อที่คุณได้รับจากการป้อนข้อมูลนั้นถูกต้อง (เช่นสิ่งต่างๆ60จะไม่ปรากฏขึ้น)

อินพุต / เอาต์พุต

คุณสามารถรับอินพุตและให้ผลลัพธ์ด้วยวิธีมาตรฐานใด ๆ

รูปแบบอินพุตที่ถูกต้องบางรายการ: รายการสตริง, รายการของ tuples, รายการซ้อน, สตริงหรือสิ่งอื่นที่คุณเห็นว่าเหมาะสม สีสามารถใช้เป็น Strings (เช่น:) "Blue","Red", etc., เป็นตัวย่อของสตริง (โปรดสร้างความแตกต่างของสีน้ำเงินและสีดำ) หรือเป็นจำนวนเต็มที่สอดคล้องกับสี เมื่อพูดถึง Jokers คุณควรพูดถึงวิธีที่โปรแกรมของคุณรับพวกเขาเป็นอินพุท หากคุณเลือก Strings คุณอาจมีสิ่งที่ชอบRED 9, JOKER, ...ถ้าคุณเลือกสิ่งอันดับคุณสามารถมี(9,"RED"), ("JOKER")หรืออะไรก็ได้ที่เทียบเท่า ถ้ามันช่วยได้คุณอาจได้รับสีสำหรับตัวโจ๊กเกอร์นั้น (ซึ่งไม่ควรส่งผลกระทบต่อผลลัพธ์ของโปรแกรมของคุณ) ตัวอย่างเช่นคุณอาจมี("JOKER","RED")หรือ("JOKER","BLUE")แต่ไม่ควรมีอิทธิพลต่อผลลัพธ์ในทางใดทางหนึ่ง

เกี่ยวกับการส่งออกกฎระเบียบมาตรฐานสำหรับใช้

ตัวอย่างการทำงาน

ลองยกตัวอย่างหวังว่าจะทำให้เข้าใจง่ายขึ้น รับกลุ่มดังต่อไปนี้ที่แต่ละ tuple แสดงถึงไทล์:

[(9, "RED"), (9, "ORANGE"), ("JOKER"), (9, "BLACK")]

สิ่งนี้ควรส่งคืนค่าความจริงเนื่องจากอินพุตถูกต้อง ในกรณีนี้ Joker ใช้ทดแทน(9, "BLUE")และพวกมันจะรวมกลุ่มหลายสี

หากคุณจะได้รับกลุ่มต่อไปนี้:

[(9, "BLUE"), (9, "ORANGE"), (9, "RED"), (9, "BLACK"), ("JOKER")]

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

กรณีทดสอบเพิ่มเติม

สิ่งเหล่านี้มีไว้สำหรับชุดทดสอบเพิ่มเติมที่ครอบคลุมสถานการณ์เกือบทั้งหมดที่เป็นไปได้:

อินพุต -> เอาท์พุท 

[(1, "BLUE"), (2, "BLUE"), (3, "BLUE"), (4, "BLUE"), (5, "BLUE"), (6, "BLUE")] - > ความจริง

[(6, "BLUE"), (6, "RED"), (6, "BLACK)] -> ความจริง

[(5, "สีดำ"), (6 "สีดำ") (7 "สีดำ") (8 "สีดำ") (9, "สีดำ"), (10 "สีดำ"), ( "JOKER"), (12, "BLACK")] -> ความจริง 

[("JOKER"), (3, "BLUE"), (3, "RED")] -> ความจริง

[(8, "BLACK"), (2, "RED"), (13, "BLUE")] -> เท็จ

[(4, "RED"), (3, "RED"), (5, "RED")] -> เท็จ

[(5, "BLACK"), (6, "BLACK)] -> เท็จ

[("JOKER"), (5, "RED"), ("JOKER")] -> เท็จ

[(4, "RED"), (5, "RED"), (6, BLUE ")] -> เท็จ

[(4, "RED"), ("JOKER"), (5, "RED")] -> เท็จ

[(12, "BLACK"), (13, "BLACK), (1," BLACK ")] -> เท็จ

นี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์ในทุกภาษาชนะ!



การขโมยเป็นส่วนที่ดีที่สุดของ rummikub แม้จะไม่มีสิ่งนี้ก็ดูเหมือนว่าจะเป็นการท้าทายที่สนุก
โยสิยาห์

[] เป็นอินพุตที่ถูกต้องหรือไม่
V. Courtois

@ V. แน่นอนแน่นอน
Mr. Xcoder

1
@ V. หนึ่งในนั้นอาจไม่ได้วาง Jokers สองคนในกลุ่มเดียวกันดังนั้นสองอินพุตที่มี 2 Jokers นั้นเป็นเท็จ
Mr. Xcoder

คำตอบ:


6

APL (Dyalog) , 58 ไบต์

ใช้รายการสี (1-4) เป็นอาร์กิวเมนต์ที่ถูกต้องและรายการตัวเลขเป็นอาร์กิวเมนต์ซ้าย หมายเลขของโจ๊กเกอร์ถูกแสดง(⍳4)ซึ่งเทียบเท่ากับ(1 2 3 4)เพื่อระบุว่าอาจเป็นหมายเลขใด ๆ ในทำนองเดียวกันสีของมันจะถูกระบุ(⍳13)เพื่อแสดงว่ามันอาจเป็นตัวเลขใด ๆ จาก 1 ถึง 13

{(3≤≢⍺)∧((s⍵)∧⍺≡∪⍺)∨((s←{1∊≢∘∪¨⊃,¨/⍵})⍺)∧∨/∊(⊃,¨/⍵)⍷¨⊂⍳13}

ลองออนไลน์!

ขั้นตอนวิธี

มีสามเงื่อนไขซึ่งทั้งสองมีสองเงื่อนไขแต่ละ:

  1. การวิ่งต้องมีความยาวมากกว่าหรือเท่ากับ 3

และทั้งสอง

    1. หมายเลขเดียวและ

    2. สีที่เป็นเอกลักษณ์

หรือ

    1. สีเดียวและ
    2. ตัวเลขตามลำดับ

เพื่อให้การวิ่งนั้นถูกต้อง

กำลังอ่านคำสั่ง

3≤3 น้อยกว่าหรือเท่ากับ≢⍺จำนวนแผ่น

และ

   s⍵ ตัวเลขทั้งหมดเหมือนกัน

   และ

   ⍺≡∪⍺ สีเป็นเอกลักษณ์

หรือ

   1∊1 เป็นหนึ่ง≢∘∪¨ในจำนวนของ สีที่⊃,¨/ขยายที่ไม่ซ้ำกัน

   และ

   ∨/มีอย่างน้อยหนึ่งใน⊃,¨/⍵จำนวนที่ขยายทั้งหมดทำงาน⍷¨⊂หนึ่งซึ่งพบใน⍳13 1 ถึง 13

คำอธิบายรหัสแบบเต็ม

{} ฟังก์ชั่นที่ไม่ระบุตัวตนซึ่งเป็นอาร์กิวเมนต์ที่เหลือและเป็นอาร์กิวเมนต์ที่ถูกต้อง

3.2

⍳13 ตัวเลข 1 ถึง 13

(... )⍷¨ค้นหาตำแหน่งเริ่มต้นของแต่ละการวิ่งต่อไปนี้:

  ,¨/⍵ เข้าร่วมแต่ละองค์ประกอบของตัวเลข (สร้างการเรียกใช้สำหรับแต่ละค่าโจ๊กเกอร์)

   เปิดเผย (เพราะ/ลดอันดับ)

  ε nlist (เรียบ)

∨/ หรือการลดลง (เช่นมีความจริงใด ๆ

()∧ และ:

3.1

  (... )⍺ ผลลัพธ์ของการใช้ฟังก์ชั่นต่อไปนี้ในรายการสี:

   s←{... }s (สำหรับs AME) ซึ่งเป็นฟังก์ชั่นที่ไม่ระบุชื่อต่อไปนี้ ( เป็นของอาร์กิวเมนต์):

    ,¨/⍵ เข้าร่วมแต่ละองค์ประกอบทั่ว (สร้างวิ่งสำหรับแต่ละค่าโจ๊กเกอร์)

     เปิดเผย (เพราะ/ลดอันดับ)

    ≢∘∪¨ จำนวนองค์ประกอบที่ไม่ซ้ำกันในแต่ละรายการ

    1∊ เป็นสมาชิกหรือไม่ (เช่นมีรายการที่เหมือนกันทั้งหมดหรือไม่)

()∨หรือ:

2.2

  ∪⍺ สีที่เป็นเอกลักษณ์

  ⍺≡ เหมือนกันกับสี (เช่นพวกเขาจะไม่ซ้ำกัน)

  ()∧ และ:

2.1

   s⍵ ตัวเลขเหมือนกันหมด

  ()∧และ

1

   ≢⍺ จำนวนสี (เช่นจำนวนกระเบื้อง)

   3≤ สามน้อยกว่าหรือเท่ากับนั้น


1
ว้าวดูเหมือนว่า APL เป็นเครื่องมือที่ยอดเยี่ยมสำหรับความท้าทายนี้
Mr. Xcoder

3

เจลลี่ , 41 40 38 36 ไบต์

EȧI=1ȦȯE
0,W€yµZç/ɓQ⁼⁸ȧ
L>2ȧ4p13ðç€Ṁ

ลองออนไลน์! (มาพร้อมกับส่วนท้ายของชุดทดสอบ)

รับอินพุตเป็นอาร์เรย์ของ(color, value)สำหรับไทล์ปกติและ0สำหรับโจ๊กเกอร์ สีจะแสดงเป็นจำนวนเต็ม (แม้ว่าฉันไม่แน่ใจว่าแม้เรื่องสำหรับรหัสปัจจุบัน)

เอาท์พุท1(ความจริง) หรือ0(เท็จ)

คำอธิบาย

L>2ȧ4p13ðç€Ṁ    Main link, checks if a sequence is valid. Args: sequence
L                 Get the length of the sequence.
 >2               Check if it's at least 3 tiles.
   ȧ4             And: yield 4 if it is, 0 otherwise.
     p13          Cartesian product: yield all possible tiles if
                  result was 4, empty array otherwise.
        ð         Begin a new dyadic chain with args (tiles, sequence).
         ç€       Call the first helper link for each tile with args (tile, sequence).

0,W€yµZç/ɓQ⁼⁸ȧ    First helper link, checks if a sequence is valid if jokers
                  are substituted for the given tile. Args: tile, sequence
0,                  Make a pair [0, tile].
  W€                Turn that into [[0], [tile]].
    y               Map all 0's (jokers) into tile in the sequence.
     µ              Begin a new monadic chain with args (sequence).
      Z             Transpose to get list [colors, values].
       ç/           Call the second helper link with args (colors, values).
         ɓ          Begin a new dyadic chain with args (sequence, valid).
          Q         Remove duplicate tiles from the sequence.
           ⁼⁸       Check if the sequence is unchanged (i.e. there were no duplicates).
             ȧ      And with the output of the second helper.

EȧI=1ȦȯE    Second helper link, checks if a sequence is valid assuming no duplicates.
            Args: colors, values
E             Check if all the colors are the same.
 ȧ            Logical and with the values array.
              Yields the values if they were, 0 if not.
  I           Find the differences between each value.
              Yields [] if the colors differed.
   =1         See if each difference is equal to 1.
              Yields [] if the colors differed.
     Ȧ        Check if the list was nonempty and all values were truthy.
              Yields 1 for valid mono-colors, 0 otherwise.
      ȯ       Logical or with the values array.
              Yields 1 for valid mono-colors, the values otherwise.
       E      Check if all the values are the same. For valid mono-colors
              this tests if all items of [1] are equal (obviously true).
              Yields 1 for valid sequences, 0 otherwise.

ฉันคิดว่าคุณต้องแสดงความจริง / เท็จที่สอดคล้องกัน
อดัม

@ Adámแก้ไขแล้วโชคดีที่ไม่ส่งผลกระทบต่อจำนวนไบต์
PurkkaKoodari

2

Python 2 , 371 370 362 341 329 325 ไบต์

  • @ Mr.Xcoder บันทึก 1 ไบต์: str.split()แทนlist literal
  • บันทึก 8 ไบต์: จดชวเลข len(x)-1
  • บันทึก 19 ไบต์: J O BK B RสำหรับJoker, Orange, Black, Blue, Redตัวอักษร
  • @ Mr.Xcoder บันทึกอีก 12 ไบต์ขอบคุณ !!
  • อีก 4 ไบต์ต้องขอบคุณ @ Mr.Xcoder
def f(x):
 j=sum("J"in i for i in x);z=len(x)-1
 if j>1or z<2:return False
 if j<1:return(all(i[0]==x[0][0]for i in x)and sum(i[1]==x[0][1]for i in x)<2)or(all(i[1]==x[0][1]for i in x)and sum(int(x[m+1][0])==int(x[m][0])+1for m in range(z))==z)
 return any(f([[k,(i+1,j)]["J"in k]for k in x])for j in'RBbO'for i in range(13))

ลองออนไลน์!




1
นี้จริงจะช่วยประหยัดมากขึ้นไบต์กว่าที่ฉันคิด: 329
Mr. Xcoder

1
325 ไบต์ ขออภัยในความล่าช้าในการปรับปรุง
Mr. Xcoder

1

Javascript (ES6), 286 ไบต์

var testcases = [[{n:1,c:"BLUE"},{n:2,c:"BLUE"},{n:3,c:"BLUE"},{n:4,c:"BLUE"},{n:5,c:"BLUE"}, {n:6,c:"BLUE"}],[{n:6,c:"BLUE"},{n:6,c:"RED"},{n:6,c:"BLACK"}],[{n:5,c:"BLACK"},{n:6,c:"BLACK"},{n:7,c:"BLACK"},{n:8,c:"BLACK"},{n:9,c:"BLACK"},{n:10,c:"BLACK"},{n:0,c:"JOKER"},{n:12,c:"BLACK"}],[{n:0,c:"JOKER"},{n:3,c:"BLUE"},{n:3,c:"RED"}],[{n:8,c:"BLACK"},{n:2,c:"RED"},{n:13,c:"BLUE"}],[{n:4,c:"RED"}, {n:3,c:"RED"}, {n:5,c:"RED"}],[{n:5,c:"BLACK"}, {n:6,c:"BLACK"}],[{n:0,c:"JOKER"},{n:5,c:"RED"},{n:0,c:"JOKER"}],[{n:4,c:"RED"},{n:5,c:"RED"},{n:6,c:"BLUE"}],[{n:4,c:"RED"},{n:0,c:"JOKER"},{n:5,c:"RED"}],[{n:12,c:"BLACK"},{n:13,c:"BLACK"},{n:1,c:"BLACK"}],[{n:11,c:"BLACK"},{n:12,c:"BLACK"},{n:0,c:"JOKER"}],[{n:1,c:"BLACK"},{n:2,c:"BLACK"},{n:3,c:"BLACK"},{n:1,c:"BLUE"},{n:2,c:"BLUE"},{n:3,c:"BLUE"}]];

g=a=>a.length
j=a=>a.n==0
l=(x,y)=>x.c==y.c||j(x)||j(y)
a=s=>g(s)>2&&([q=[0],x=s[0],s.map(y=>q[0]+=x==y||((l(x,y)||x.n==y.n)&&!(j(x)&&j(y)))&&(([n=s.indexOf(y),n<1||([x=s[n-1],!l(x,y)||y.n>0&&x.n<y.n])[1]||(n<g(s)-1&&x.n+1<s[n+1].n)||(n==g(s)-1&&y.n==0&&x.n<13)])[1])?1:0)])[0][0]==g(s)

testcases.forEach(H=>console.log(a(H)));

(โปรดทราบว่ากรณีทดสอบด้านบนมี 2 กรณีทดสอบเพิ่มเติมที่ไม่ได้อยู่ในคำถาม: เป็นจริงและเท็จตามลำดับ: ดูรุ่นที่ไม่ได้อ่านเพื่อความสะดวกในการอ่าน)

กระบวนการหยาบ:

 Using first tile x:
   For each tile y:
     count for x: can group with y
 return: x matches n tiles, where n is the number of tiles

Jokers จะถูกระบุโดยมีค่า0เป็นตัวเลขของพวกเขา (จำนวนลบจะทำงานเกินไป); สิ่งนี้ทำให้โครงสร้างอินพุตสอดคล้องกัน (มีทั้งสีและค่า) และไม่ต้องพึ่งพาการตรวจสอบว่าc=="JOKER"ประหยัด 7 ไบต์หรือไม่

เป็นไปได้ว่าอาจมีการลบวงเล็บบางอันออกไปมันอาจเป็นไปไม่ได้ที่จะใส่กล่องqเป็นอาร์เรย์ (ฉันลองแล้วค่าจะอยู่ 0 หรือทำให้เกิดปีศาจจมูก )

Ungolfed:

var testcases = [
[{n:1,c:"BLUE"},{n:2,c:"BLUE"},{n:3,c:"BLUE"},{n:4,c:"BLUE"},{n:5,c:"BLUE"}, {n:6,c:"BLUE"}],//true
[{n:6,c:"BLUE"},{n:6,c:"RED"},{n:6,c:"BLACK"}],//true
[{n:5,c:"BLACK"},{n:6,c:"BLACK"},{n:7,c:"BLACK"},{n:8,c:"BLACK"},{n:9,c:"BLACK"},{n:10,c:"BLACK"},{n:0,c:"JOKER"},{n:12,c:"BLACK"}],//true
[{n:0,c:"JOKER"},{n:3,c:"BLUE"},{n:3,c:"RED"}],//true
[{n:8,c:"BLACK"},{n:2,c:"RED"},{n:13,c:"BLUE"}],//false
[{n:4,c:"RED"}, {n:3,c:"RED"}, {n:5,c:"RED"}],//false
[{n:5,c:"BLACK"}, {n:6,c:"BLACK"}],//false
[{n:0,c:"JOKER"},{n:5,c:"RED"},{n:0,c:"JOKER"}],//false
[{n:4,c:"RED"},{n:5,c:"RED"},{n:6,c:"BLUE"}],//false
[{n:4,c:"RED"},{n:0,c:"JOKER"},{n:5,c:"RED"}],//false
[{n:12,c:"BLACK"},{n:13,c:"BLACK"},{n:1,c:"BLACK"}],//false
[{n:11,c:"BLACK"},{n:12,c:"BLACK"},{n:0,c:"JOKER"}],//true
[{n:1,c:"BLACK"},{n:2,c:"BLACK"},{n:3,c:"BLACK"},{n:1,c:"BLUE"},{n:2,c:"BLUE"},{n:3,c:"BLUE"}]
];

g=a=>a.length
i=(a,v)=>a.indexOf(v)
j=x=>x.n==0
m=(x,y)=>
       (l(x,y)||x.n==y.n)
    &&!(j(x)&&j(y))
l=(x,y)=>x.c==y.c||j(x)||j(y)
c=(a,v)=>([n=i(a,v),
      n<1
    ||([x=a[n-1],!l(x,v)||v.n>0&&x.n<v.n])[1]
    ||(n<g(a)-1&&x.n+1<a[n+1].n)
    ||(n==g(a)-1&&v.n==0&&x.n<13)])[1]
a=s=>g(s)>2&&([q=[0],x=s[0],s.map(y=>q[0]+=x==y||m(x,y)&&c(s,y)?1:0)])[0][0]==g(s)

testcases.forEach(H=>console.log(a(H)));

เวอร์ชันที่ฉันทำงานเพื่อแก้ไขตรรกะให้ถูกต้อง lambdas แบบใช้ครั้งเดียวได้รับการเรียง นี่คือหน้าที่ที่เกี่ยวข้อง:

g() -> string.length
i() -> indexof
j() -> isJoker
m() -> do tiles match
l() -> do colors match
c() -> same-color isConsecutiveOrder
a() -> main lambda

1

C # (. NET Core) , 198 ไบต์

using System.Linq;(C,N)=>{int l=C.Length,j=C.Count(x=>x<1),c=C.Distinct().Count(),n=N.Distinct().Count(),u=N.Min();foreach(var x in N)u*=0<(u&x)?2:0;return l>2&((u>0&n==l&c<2+j)|(n<2+j&c==l&l<5));};

ใช้สีของไพ่และตัวเลขในรายการเป็นจำนวนเต็มแยกกัน ลักษณะเฉพาะของการจับคู่นั้นไม่สำคัญตราบใดที่แต่ละสีมีจำนวนเต็มแตกต่างกันและ Jokers จะแสดงเป็น 0

รูปแบบการใส่ตัวเลขนั้นค่อนข้างพิเศษ จำนวนที่ต้องป้อนสำหรับตัวเลขnแทน 2 ^ n ในขณะที่หมายเลขที่ใช้แสดงถึงตัวโจ๊กเกอร์ควรเป็น (2 ^ 14) -1 สิ่งนี้ช่วยให้ bitwise และu&xประเมินค่า u หาก tile x มีค่าเท่ากับ u หรือเป็นโจ๊กเกอร์

C # (. NET Core) 200 ไบต์

using System.Linq;(C,N)=>{int l=C.Length,j=N.Count(x=>x<1),c=C.Distinct().Count(),n=N.Distinct().Count(),u=N.Min();foreach(var x in N)u=u==x|x<1?u+1:0;return l>2&((u>0&n==l&c<2+j)|(n<2+j&c==l&l<5));};

โซลูชัน 2 ไบต์ที่ยาวขึ้นซึ่งไม่ได้เลือกสรรเกี่ยวกับอินพุต ปรากฎว่าเพียงแค่ใช้กรณีพิเศษสำหรับนักเลงในที่เดียวที่พวกเขาจัดการได้ไม่นานกว่าการดำเนินงานระดับบิตที่ชาญฉลาดที่ฉันภูมิใจมาก ที่นี่ Jokers คือ (0,0) ตัวเลขอื่น ๆ เป็นไปตามที่คาดไว้และสีจะแสดงค่า 4 ค่าใด ๆ ซึ่งแตกต่างจากกันโดยการเปรียบเทียบค่าเริ่มต้นของ C # (โดยเฉพาะ LinqDistinct()ดำเนินการต้องพิจารณาค่าสำหรับสีเดียวกันกับ 'ไม่ชัดเจน' และค่าสำหรับสีที่ต่างกันว่า 'ชัดเจน')

สิ่งที่อาจใช้กับภาษาอื่นu*=!u++^x*xอาจเทียบเท่าu=u==x|x<1?u+1:0ในบางภาษา u ^ x คือ 0 iff u == x, และ 0 คูณ int คือ 0 ดังนั้น u ^ x * x จะเป็น 0 สำหรับ u == x หรือ x == 0 ถ้า C # ไม่ได้ทำการดำเนินการระดับบิตที่ต่ำกว่า คณิตศาสตร์ C # ยังไม่สามารถตีความ ints เป็น bools โดยไม่ต้องทำการแคสต์อย่างชัดเจน ภาษาที่พยายามทำให้งานประเภทนั้นยากขึ้นอาจแปลงค่า0และnot 0ไปเป็นfalseและtrueก่อนที่จะประยุกต์ใช้!กับพวกเขาแม้ว่าจากนั้นเมื่อกลับไปที่การตีความแบบ int !falseเป็น 1 และ!trueเป็น 0 ทั้งหมดที่กล่าวมาฉันไม่สามารถรับประกันภาษาอื่นได้จริง ได้รับประโยชน์จากอัลกอริทึมที่เหลือดังนั้นจึงอาจไม่เกิดขึ้น


1

สกาลา, 491 477 ตัวอักษร, 491 477 ไบต์

ความท้าทายนี้สนุกมาก ขอบคุณ

var c=Seq("O","B","b","R")
t match{case _ if t.length<3=>false
case _ if t.exists(x=>x._1==0)=>{var b=false
if(t.filter(q=>q._1!=0).exists(q=>q._1==0))b else{for(y<-1 to 13)for(u<-c)b=b|f(t.takeWhile(q=>q._1!=0)++:(y,u)+:t.reverse.takeWhile(q=>q._1!=0).reverse)
b}}
case _::(x,_)::_ if t.forall(_._1==x)=>true
case _ if t.forall(_._2==c(0))|t.forall(_._2==c(1))|t.forall(_._2==c(2))|t.forall(_._2==c(3))=>(t(0)._1 to t(0)._1+t.length-1).toList equals t.map(_._1)
case _=>false}

ดังนั้นfที่บรรทัดที่ 4 เป็นการเรียกซ้ำที่ฉันลองแทนที่ "JOKER" ด้วยไทล์อื่น ดูที่tioเพื่อดูรหัสที่ชัดเจนยิ่งขึ้น ฉันเลือกที่จะใส่ลำดับของ 2-tuples (Int, String) - เรียกว่าtในรหัสของฉันดูtio - ดังนั้น "JOKER" จึงถูกแทนด้วย 2-tuple (0, "JOKER")

แก้ไข: 14 ไบต์บันทึกไว้ขอบคุณความคิดเห็นฉันใช้ OB b R สำหรับ ORANGE BLACK BLUE RED RED

ลองออนไลน์!

แก้ไข: -2 ไบต์ลบไร้ประโยชน์(รอบเงื่อนไขของcase _ ifs


คุณไม่สามารถใช้O,B,b,Rแทนที่จะORANGE,BLUE,BLACK,REDบันทึกไบต์ได้ใช่ไหม ฉันไม่รู้ว่า Scala ทำงานอย่างไร แต่ฉันคิดว่าคุณทำได้
Mr. Xcoder

ฉันเหนื่อย; ในความเป็นจริงมันช่วยประหยัด bytes ทำเช่นนี้ (seq ของสตริง) มันทำvar (O,B,b,R)=("ORANGE","BLACK","BLUE","RED")และโทรเป็นO B b Rเป็นรวม 49 ไบต์; สถานที่var c=Seq("ORANGE","BLACK","BLUE","RED")และการโทรc(...)รวมทั้งสิ้น 58 ไบต์ แต่กรณีแรกอนุญาตให้for(u<-c)แทนที่for(u<-Seq(O,B,b,R))ดังนั้นค่าใช้จ่ายไม่ใช่ -9 แต่ +2 ขอบคุณที่ทดลองใช้
V. Courtois

@ V.Courtois ฉันเชื่อว่าสิ่งที่นาย Xcoder แนะนำคือการใช้ var c=Seq("O","B","b","R")และนำตัวละครเหล่านั้นมาเป็นอินพุตของคุณแทนที่จะเป็นสายอักขระเต็มสี ดังที่ได้กล่าวไว้ในโพสต์ต้นฉบับ "สีสามารถใช้เป็น ... ตัวย่อของสตริง"
Kamil Drakari

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