เตรโตมิโนอันไหน


54

รับจำนวนเต็ม 16 บิตN ที่ไม่ได้ลงนามงานของคุณคือการตรวจสอบว่าการแสดงฐานสองของมันถูกแมปภายในเมทริกซ์ 4x4 กำลังจับคู่กับรูปทรง tetrominoหรือไม่และถ้าเป็นเช่นนั้น

มดลูก

แต่ละบิตของNจะถูกแมปภายในเมทริกซ์ 4x4 จากซ้ายไปขวาและจากบนลงล่างเริ่มต้นด้วยบิตที่สำคัญที่สุด

ตัวอย่าง :

N = 17600
binary representation: 0100010011000000
matrix: [ [ 0, 1, 0, 0 ],
          [ 0, 1, 0, 0 ],
          [ 1, 1, 0, 0 ],
          [ 0, 0, 0, 0 ] ]

รูปร่าง Tetromino

รูปร่างฐาน

มีรูปร่าง tetromino 7 รูปแบบตามตัวอักษรO , I , S , Z , L , JและT :

tetrominoes

การหมุนและการแปล

หากมีการแปลรูปร่างและ / หรือหมุนภายในเมทริกซ์ 4x4 ก็ยังถือว่าเป็นรูปแบบที่ถูกต้องของ tetromino เดียวกัน ตัวอย่างเช่นควรระบุ 17600, 1136, 2272 และ 1604 เป็นJ tetrominoes:

ตัวอย่าง J ที่ถูกต้อง

อย่าห่อ!

อย่างไรก็ตามรูปร่างไม่สามารถพันหรือเคลื่อนที่ได้เกินขอบเขตของเมทริกซ์ ตัวอย่างเช่นไม่ควรระบุ568 หรือ 688 เป็นJ tetrominoes (ไม่นับรูปร่างอื่น ๆ ):

ตัวอย่าง J ไม่ถูกต้อง

คำอธิบายและกฎ

  • คุณอาจรับอินพุตเป็นจำนวนเต็มหรือเป็นเลขฐานสองโดยตรง 16 หลักในรูปแบบที่เหมาะสมเช่นอาร์เรย์ 2D, อาร์เรย์แบบแบนหรือสตริงที่มีการคั่น
  • อินพุตรับประกันว่าจะเป็นจำนวนเต็ม 16 บิตที่ไม่ได้ลงชื่อ (หรือการแสดงที่เทียบเท่ากันในฐานะอาร์เรย์หรือสตริง)
  • เมื่อมีการระบุรูปร่างที่ถูกต้องคุณต้องพิมพ์หรือส่งคืนตัวอักษรที่ระบุรูปร่างไม่ว่าจะเป็นตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่
  • หากไม่มีการระบุรูปร่างคุณต้องพิมพ์หรือคืนค่าที่ไม่ตรงกับตัวอักษร tetromino คุณอาจเลือกที่จะไม่ส่งคืนสิ่งใดเลย
  • ในการพิจารณาว่าถูกต้องเมทริกซ์จะต้องมีรูปร่าง tetromino ที่แน่นอนโดยไม่มีเซลล์เพิ่มเติมใด ๆ (ดู 1911 และ 34953 ในกรณีทดสอบ)
  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ!

กรณีทดสอบ

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

0      -> false
50     -> false
51     -> 'O'
1911   -> false
15     -> 'I'
34952  -> 'I'
34953  -> false
1122   -> 'S'
3168   -> 'Z'
785    -> 'L'
1136   -> 'J'
568    -> false
688    -> false
35968  -> 'T'
19520  -> 'T'

ที่น่าสนใจฉันกำลังทำงานเกี่ยวกับปัญหาที่คล้ายกันอย่างมากในวันก่อนที่ฉันจะฟุ้งซ่านสร้างเทคนิคเพื่อใช้ฟังก์ชันกลุ่มfunc1 . func2 . func3ใน JS: P
ETHproductions

ฉันสามารถใช้การป้อนข้อมูลเป็นสี่แถวร่วมกับ0เช่น1111011110111101111สำหรับ65535?
ETHproductions

@ ETHproductions ที่ดูเหมือนดี ฉันได้แก้ไขความท้าทายด้วยรูปแบบการป้อนข้อมูลที่ผ่อนคลายเล็กน้อย
Arnauld

3
I: 15,240,3840,4369,8738,17476,34952,61440J: 71,113,142,226,275,550,802,1100,1136,1604,1808,2272,3208,3616,4400,8800,12832,17600,18176,25664,28928,36352,51328,57856L: 23,46,116,232,368,547,736,785,1094,1570,1856,2188,3140,3712,5888,8752,11776,12560,17504,25120,29696,35008,50240,59392O: 51,102,204,816,1632,3264,13056,26112,52224S: 54,108,561,864,1122,1728,2244,8976,13824,17952,27648,35904T: 39,78,114,228,305,562,610,624,1124,1220,1248,1824,2248,3648,4880,8992,9760,9984,17984,19520,19968,29184,35968,58368Z:99,198,306,612,1224,1584,3168,4896,9792,19584,25344,50688
Engineer Toast

สร้างขึ้นโดยใช้คำตอบ Python 3 ของ Lynnเพราะมันมีรูปแบบอินพุต / เอาท์พุตที่สะดวก
Engineer Toast

คำตอบ:


6

เยลลี่ ,  54 43 42  41 ไบต์

-1 ไบต์ด้วย Erik the Outgolfer (เคลื่อนย้ายภายในห่วงโซ่การทำซ้ำ)

T€FṀ⁸ṙ€Zµ⁺F
ZU$3СǀḄṂ“çc3Ð6'G‘i’ị“¥Çıƭ⁵»

การเชื่อมโยงเอกการอาร์เรย์ 2 มิติของจำนวนเต็ม ( 1และ0s) และกลับมาเป็นตัวอักษรตัวพิมพ์เล็กoiszljtสำหรับ tetromino นั้นหรือwถ้าไม่ถูกต้อง

ลองออนไลน์! หรือดูชุดทดสอบ

โปรดดูโปรแกรมนี้ซึ่งแสดงรายการไบนารี 2 มิติแบบ 1820 ที่เป็นไปได้ทั้งหมดที่มีสี่บิตที่ตั้งค่าพร้อมกับเอาต์พุตของพวกเขาเรียงลำดับตามเอาต์พุตเหล่านั้น

อย่างไร?

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

T€FṀ⁸ṙ€Zµ⁺F - Link 1, shift set bits right & then down : list of lists of bits          
        µ⁺  - perform the following twice, 1st with x=input, then with x=result of that):
T€          -   truthy indexes of €ach
  F         -   flatten into a single list
   Ṁ        -   maximum (the index of the right-most bit)
    ⁸       -   chain's left argument, x
     ṙ€     -   rotate €ach left by that amount
       Z    -   transpose the result
          F - flatten (avoids an € in the main link moving this into here)

ZU$3СǀḄṂ“çc3Ð6'G‘i’ị“¥Çıƭ⁵» - Main link: list of lists of bits (the integers 0 or 1)
   3С                        - repeat this 3 times collecting the 4 results:
  $                           -   last two links as a monad:
Z                             -     transpose
 U                            -     upend (reverse each) -- net effect rotate 90° CW
      Ç€                      - call the last link as a monad for €ach
        Ḅ                     - convert from binary (vectorises)
         Ṃ                    - minimum (of the four results)
          “çc3Ð6'G‘           - code-page indexes = [23,99,51,15,54,39,71]
                              -   ...the minimal such results for l,z,o,i,s,t,j shapes
                   i          - 1-based index of minimum in there or 0 if not found
                    ’         - decrement
                      “¥Çıƭ⁵» - compressed words: "zoist"+"jowl" = "zoistjowl"
                     ị        - index into (1 indexed & modular, so -1 yields 'w',
                              -             0 yields 'l', 1 yields 'z', ...)

วิธีก่อนหน้า (54 ไบต์)

Fœr0Ḅ“çc3Ðñ'G‘i
;Z$Ḅ©f“¦µ½¿Æ‘ȯ®¬S>2ȧZU$3СǀṀ’ị“¥Çıƭ⁵»

การเชื่อมโยงเอกการอาร์เรย์ 2 มิติของจำนวนเต็ม ( 1และ0s) และกลับมาเป็นตัวอักษรตัวพิมพ์เล็กoiszljtสำหรับ tetromino นั้นหรือwถ้าไม่ถูกต้อง

ลองออนไลน์!

การตรวจสอบนี้มีอย่างน้อยสามบรรทัดว่าง (แถว + คอลัมน์) และรูปแบบของบิตบางอย่างไม่ปรากฏในบรรทัดใด ๆ (โดยเฉพาะตัวเลข 5,9,10,11 และ 13) เหล่านี้เข้าด้วยกันทำให้มั่นใจว่าขั้นตอนต่อไปจะไม่เกิดผล เท็จบวก จากนั้นปรับให้แบนราบแล้วเลื่อนชั้นเลขฐานสอง (โดยการลากเส้นศูนย์ต่อท้ายก่อนการแปลง) ของแต่ละรอบการหมุนทั้งสี่และค้นหาผลลัพธ์ที่น้อยที่สุดในรายการตัวเลขโดยใช้ผลลัพธ์ที่ลดลงเพื่อจัดทำดัชนีลงในคำพจนานุกรมที่ต่อกันสองคำzoist+ jowl, ยอมทำwเมื่อไม่พบคู่ที่ตรงกัน


และฉันรู้ว่ามีวิธีที่ดีกว่า
การเข้ารหัสฮาร์ดดิ

btw ฉันคิดว่ารหัสนี้ขึ้นอยู่กับความบังเอิญ (เพราะzoistjowlปกติจะไม่เหมาะกับสตริงอย่างอื่น: p)
Erik the Outgolfer

คุณหมายถึงอะไร "ขึ้นอยู่กับความบังเอิญ"? (การค้นหาพจนานุกรมจะบันทึกเพียงหนึ่งไบต์เท่านั้น...Ṁị“LZOISTJW)
Jonathan Allan

อืม ... ใช่ฉันรู้ว่าไม่นาน ... btw ฉันคิดว่าคุณขโมยของฉันZU$3С: p
Erik the Outgolfer

ฉันพยายามทำวิธีเดียวกันเมื่อวานนี้หลังจากส่งก่อนหน้านี้ แต่คิดว่าฉันเหนื่อยเล็กน้อย
Jonathan Allan

28

Python 3 , 124 ไบต์

def f(n):
 while n&4369<n/n:n>>=1
 while n&15<1:n>>=4
 return'TJLZSIO'["rēȣc63ıGtIJȱᄑ@'̢̑@@@@Ȳq".index(chr(n))%7]

ลองออนไลน์!

คาดว่าจะเป็นจำนวนเต็มn ที่แทนเมทริกซ์ไบนารี 4 × 4 โยนหากไม่พบเทโตรมิโน

บรรทัดที่ 2 เลื่อนรูปร่างไปทางขวาจนกระทั่ง 1 อยู่ในคอลัมน์ขวาสุด (4369 เป็น0001 0001 0001 0001แบบไบนารี่) บรรทัดที่ 3 จะลดรูปร่างจนกว่า 1 จะอยู่ในแถวด้านล่าง ร่วมกันเปิดนี้เช่น:

    0 1 0 0        0 0 0 0
    1 1 1 0  into  0 0 0 0
    0 0 0 0        0 0 1 0
    0 0 0 0        0 1 1 1

จากนั้นเราค้นหาดัชนีของnในรายการนี้:

 [114  275  547   99   54   15   51
  305   71  116  306  561 4369   64
   39  802  785   64   64   64   64
  562  113   23]
#   T    J    L    Z    S    I    O

แต่ละคอลัมน์ของดัชนีที่เทียบเท่าโมดูโล 7 สอดคล้องกับรูปร่างของ tetromino 64 ( @) ใช้เป็นค่า padding เนื่องจากnไม่สามารถเป็น 64 ณ จุดนี้ในโค้ด

NB มีข้อยกเว้นสำหรับการป้อนข้อมูล0โดยการคำนวณn/nแทน1แทน


เหตุใดสตริงไบนารีของคุณจึงทำงาน ฉันมีปัญหากับสิ่งนั้นใน Python 3 ดูความคิดเห็นcodegolf.stackexchange.com/a/85201/53667
Karl Napf

Python ใช้ UTF-8 เป็นการเข้ารหัสเริ่มต้นสำหรับซอร์สโค้ดและเอาท์พุทข้อความ แต่ไฟล์ PPM ไม่ได้อ่านใน UTF-8 เมื่อคุณเรียกใช้print("ÿ")ไบต์ที่เขียนc3 bf 0aไม่เป็นff 0aเช่นนั้นและอิมเมจ PPM จะกลายเป็นขยะ
ลินน์

8

APL (Dyalog) , 95 94 93 89 87 ไบต์

-2 ขอบคุณZacharý

ต้องใช้⎕IO←0ซึ่งเป็นค่าเริ่มต้นในหลาย ๆ ระบบ รับเมทริกซ์บูลีน (ของรูปร่างใด ๆ !) เป็นอาร์กิวเมนต์ ไม่ส่งคืนอะไรถ้าจำนวนบิตที่กำหนดไม่ใช่สี่และบรรทัดว่างถ้าบิตที่กำหนดสี่บิตไม่ก่อให้เกิด tetromino

{4=+/,⍵:'OIZSJLT'/⍨∨/1∊¨(((2 2)4⍴¨1),(0 1⌽¨⊂K2J),(⍳3)⊖¨⊂J1,⍪K31)∘.⍷⍵∘{⌽∘⍉⍣⍵⊢⍺}¨⍳4}

ลองออนไลน์!

ทำงานโดยสร้างการหมุนทั้งสี่ของอินพุตจากนั้นมองหาเทรโตมิโนแต่ละตัวในแต่ละการหมุน

{} ฟังก์ชั่นที่ไม่ระบุตัวตนโดยมีการโต้แย้งโดย:

,⍵ ravel (แผ่) อาร์กิวเมนต์

+/ รวมมัน

4= สี่เท่ากับหรือไม่

: ถ้าเป็นเช่นนั้นแล้ว (ไม่มีอะไรคืน):

  ⍳4 สี่ครั้งแรกɩ ndices; [0,1,2,3]

  ⍵∘{ ใช้ฟังก์ชั่นต่อไปนี้ในแต่ละรายการโดยใช้อินพุตเป็นอาร์กิวเมนต์ซ้ายคงที่

    อาร์กิวเมนต์ซ้ายเช่นอินพุต

   ⊢⍺ ให้ผลผลิตนั้น (แยกจาก)

   ⌽∘⍉⍣⍵ กระจกและไขว้ (เช่นหมุน 90 °) ครั้ง

  ()∘.⍷ ด้านนอก "ผลิตภัณฑ์" แต่ใช้การค้นหา * ของรายการต่อไปนี้และการหมุน:

   3↑1 เอาองค์ประกอบสามจากหนึ่ง padding ด้วยศูนย์; [1,0,0]

   K← ร้านค้าที่เป็น K

    ตาราง (ทำเป็นคอลัมน์เวกเตอร์); [[1],[0],[0]]

   1, เสริมหนึ่ง; [[1,1],[1,0],[1,0]]( "J")

   J← เก็บเป็น J

   (... )⊖¨⊂ หมุน J ทั้งหมดในแนวตั้งโดยแต่ละขั้นตอนดังต่อไปนี้:

    ⍳3 ครั้งแรกที่สามɩ ntegers;[0,1,2]

   เรามี[[[1,1],[1,0],[1,0]],[[1,0],[1,0],[1,1]],[[1,0],[1,1],[1,0]]]("J", "L," T ")

   (), เพิ่มรายการต่อไปนี้:

    2⊖J หมุนJสองขั้นตอนในแนวตั้ง [[1,0],[1,1],[1,0]]( "T")

    K⌽ หมุนแถวของโดย 1, 0 และ 0 ขั้นตอนตามลำดับ [[0,1],[1,1],[1,0]]( "Z")

    0 1⌽¨⊂ หมุนทั้งอาร์เรย์ในแนวตั้งโดยไม่มีเวลาและครั้งเดียว [[[0,1],[1,1],[1,0]],[[1,0],[1,1],[0,1]]] ("Z", "S")

    (), เพิ่มรายการต่อไปนี้:

     (2 2)4⍴¨1 เปลี่ยนรูปร่างหนึ่งเป็นเมทริกซ์ 2 × 2 และรายการ 4 องค์ประกอบ [[[1,1],[1,1]],[1,1,1,1]]("O", "I")

  1∊¨ สำหรับแต่ละคนเป็นสมาชิกหรือไม่

  ∨/ แนวนอนหรือการลด (เช่นข้ามการหมุนหนึ่งบูลีนสำหรับแต่ละรูปร่าง)

  'OIZSLJT'/⍨ ใช้สิ่งนั้นเพื่อกรองสตริง

* Find ส่งคืนอาร์เรย์บูลีนที่มีรูปร่างเดียวกันกับอาร์กิวเมนต์ที่ถูกต้องโดยมีรายการที่ระบุมุมซ้ายบนของทุก subarrays เหมือนกับอาร์กิวเมนต์ซ้าย


จะใช้งานได้ไหม {4=+/,⍵:'OIZSJLT'/⍨∨/1∊¨(((2 2)4⍴¨1),(0 1⌽¨⊂K⌽2⊖J),(⍳3)⊖¨⊂J←1,⍪K←3↑1)∘.⍷⍵∘{⌽∘⍉⍣⍵⊢⍺}¨⍳4}
Zacharý

@ Zacharýใช่ขอบคุณเสร็จแล้ว
อดัม

7

JavaScript (ES6), 242 212 172 164 ไบต์

x=>[...'OISZLJT'].filter((z,y)=>x.match(`^0*(${'99,33825|15,51|2145,195|561,2115|57,1059|135,71|1073'.split`,`[y].replace(/\d+/g,C=x=>x?x%2+C(x>>1)+x%2:'|')})0*$`))

ควรจะเป็นแค่การกลิ้งลูกบอล แต่ฉันก็สายไปหน่อยสำหรับเรื่องนั้น¯ \ _ (ツ) _ / ¯

รับค่าสตริงบิตโดยมีแถวคั่นด้วย0s ( '0001000110001000000'แทน0001 0011 0010 0000) และส่งกลับอาร์เรย์ที่มีอักขระที่เป็นตัวแทนของ tetromino หรืออาร์เรย์ที่ไม่มีอะไรเลย

สิ่งนี้ทำงานโดยตรวจสอบการหมุนแต่ละรอบของ tetromino เพื่อดูว่าอินพุตที่จุดใด ๆ มี tetromino ล้อมรอบทั้งหมดด้วยศูนย์ทั้งสองด้าน แต่ละเทรโตมิโนถูกแสดงด้วยเลขฐานสองหนึ่งหมายเลขหรือมากกว่า:

0 0 0 0   -> 0000 0110 1100 0000
0 1 1 0   -> 0000001100110000000
1 1 0 0   -> 110011
0 0 0 0   -> 51

0 1 0 0   -> 0100 0110 0010 0000
0 1 1 0   -> 0100001100001000000
0 0 1 0   -> 100001100001
0 0 0 0   -> 2145

ดังนั้นในการตรวจสอบว่าอินพุตมี S tetromino เราก็ตรวจสอบว่ามันมีการแสดงเลขฐานสองของทั้งสอง51หรือ2145มีเพียง0ด้านเดียว

tetrominoes สองสามดวงมีทิศทาง 4 แบบ ถ้าคุณดูการแทนเลขฐานสองของสิ่งเหล่านี้แต่ละอันมี 2 การแทนซึ่งเป็นเพียงการสะท้อนของอีกสองอัน เพื่อเป็นการประหยัดพื้นที่การสร้างไบนารี่ถูกสร้างขึ้นไปข้างหน้าและข้างหลังพร้อมกันด้วยCฟังก์ชั่นวนซ้ำทำให้เราสามารถใส่การหมุนสองทิศทางเท่านั้น


วิธีอื่นด้วย charcodes:

x=>[...'OISZLJT'].filter((z,y)=>x.match(`^0*(${[...'÷,êÿ,óî,ûÝ,ëúüÏ,çöïþ,ßýíÞ'.split`,`[y]].map(c=>(C=n=>n?'1e'+(n%4+2)%5-0+C(n>>2):'')(c.charCodeAt())).join`|`})0*$`))

3

เรติน่า 125 ไบต์

s`(.*1){5}.*

{s`.*1111.*
I
s`.*111(.{2,4})1.*
$.1
T`234`\LTJ
s`.*11(.{2,4})11.*
$.1
T`2-90`S\OZ4-9
s`.*4.*

O#$`.
$.%`
O#$^`

ลองออนไลน์! ลิงก์มีกรณีทดสอบรวมทั้งส่วนหัวในการแปลงจากจำนวนเต็มเป็นเมทริกซ์ 4 × 4 คำอธิบาย:

s`(.*1){5}.*

ลบอินพุตถ้ามันมี 5 1วิ

{s`.*1111.*
I

ตรวจสอบการหมุนทั้งหมดของอินพุต (ดูด้านล่าง) ถ้าใส่มีสี่ติดต่อกัน1s Iมันเป็น

s`.*111(.{2,4})1.*
$.1
T`234`\LTJ

หากมีสาม1s ติดต่อกันบวก a 1ในบรรทัดถัดไปใต้หนึ่งในสามจากนั้นแมปจำนวนอักขระกลางกับตัวอักษรผลลัพธ์ที่เหมาะสม

s`.*11(.{2,4})11.*
$.1

ในทำนองเดียวกันสำหรับสองที่อยู่ติดกัน1ที่อยู่ติดกับสองที่อยู่ติดกัน1ในบรรทัดถัดไป

T`2-90`S\OZ4-9

แต่ให้นับจำนวนรอบการหมุนโดยใช้0s ที่ไม่ได้ใช้

s`.*4.*

และยอมแพ้ถ้ามีการหมุนมากเกินไป

O#$`.
$.%`
O#$^`

ไขว้และกลับอาร์เรย์ดังนั้นจึงหมุนมัน


3

MATL , 60 ไบต์

Itt6tIl7tl7H15vHe"4:"G@X!HYa]4$v@BIthYaEqY+4=aa]v'OSZLJTI'w)

อินพุตเป็นอาร์เรย์ไบนารี 4 × 4 (เมทริกซ์) โดยใช้ ;เป็นตัวคั่นแถว Ouput เป็นตัวอักษรหรือว่างเปล่าสำหรับไม่มี tetromino

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด (เอาต์พุตมีจุดต่อท้ายเพื่ออนุญาตให้ระบุผลลัพธ์ที่ว่างเปล่า)

คำอธิบาย

รหัสนี้สร้างการหมุน 4 ครั้งของอาร์เรย์อินพุต 4 × 4 ในขั้นตอน 90 องศา แต่ละแถวที่ถูกหมุนจะถูกเติมด้วย 2 ศูนย์ขึ้นและลงซึ่งจะแปลงเป็นอาร์เรย์ 8 × 4 4 อาร์เรย์ถูกต่อกันเป็นแนวตั้งเป็นอาร์เรย์ 32 × 4 อาเรย์สี่ตัวที่หมุนภายในอาเรย์ที่ต่อกันนี้คือ "ตัวแยก" ซึ่งต้องขอบคุณการทำให้เป็นศูนย์

แต่ละรูปแบบที่เป็นไปได้ 7 แบบจะถูกทดสอบเพื่อดูว่ามีอยู่ในอาร์เรย์ 32 × 4 หรือไม่ มีการใช้การวนซ้ำสำหรับสิ่งนี้ แต่ละรูปแบบถูกกำหนดโดยตัวเลขสองตัวซึ่งแสดงในรูปแบบไบนารีให้มาส์ก 0/1 ที่เหมาะสม ยกตัวอย่างเช่นตัวเลข3, 6กำหนด "S" รูปร่าง

หมายเลข 7 ชุด 2 ชุดจะถูกจัดเรียงเป็นเมทริกซ์ 2 × 7 ซึ่งลูปจะเลือกแต่ละคอลัมน์ตามลำดับ เมทริกซ์ถูกกำหนดโดยการผลักดันตัวเลขทั้งหมดไปยังสแต็กทำการผสมเข้ากับเวกเตอร์และเปลี่ยนเป็นเมทริกซ์ 2 แถว เนื่องจากรูปร่าง "I" ถูกกำหนดโดยหมายเลข 15 ตามด้วย 0 การวางไว้ที่ท้ายทำให้ 0 ถูกเติมโดยฟังก์ชันการปรับรูปร่างโดยนัย

จากนั้นหน้ากากจะถูกเติมด้วย 3 ศูนย์ในสี่ทิศทาง นี่เป็นสิ่งจำเป็นเพื่อตรวจจับค่าที่ไม่ต้องการในอินพุต

หากต้องการดูว่ามีหน้ากากอยู่ในอาร์เรย์ 32 × 4 หรือไม่หน้ากากหลังจะถูกแปลงเป็นรูปแบบสองขั้ว (เช่น −1/1 แทน 0/1) และเชื่อมโยงกับหน้ากาก เนื่องจากมาสก์มี 4 รายการการจับคู่จะเกิดขึ้นหากบางรายการในผลลัพธ์ของการสนทนาเท่ากับ 4

ในตอนท้ายของลูป 7 ผลลัพธ์ที่เป็นเท็จ / จริงได้รับซึ่งส่วนใหญ่เป็นจริง ใช้เพื่อทำดัชนีในสตริงที่มีตัวอักษรเอาต์พุตที่เป็นไปได้


3

เยลลี่ขนาด 53 ไบต์

ZL0ẋW⁸tZµ⁺ZU$3С“©©“œ“Ç¿“¦©¦“ƽ‘;Uḃ2$’¤iЀṀị“÷¶Ė¡µỵỤ»

ลองออนไลน์!

โปรแกรมเต็มรูปแบบ ใช้ 4x4 พิมพ์mถ้าไม่ใช่ tetromino มิฉะนั้นพิมพ์ตัวพิมพ์เล็ก


... กำลังใช้อาร์เรย์ของบิตที่ถูกกฎหมายหรือไม่ นั่นจะช่วยฉันได้เช่น 40 ไบต์
ETHproductions

@ETHproductions คุณสามารถรับข้อมูลเป็นจำนวนเต็มหรือเรียกโดยตรงว่าเป็นอาร์เรย์ 2 มิติของเลขฐานสองแบบ 4x4 หรือชุดจำนวน 16 หลักแบบเรียบ
Erik the Outgolfer

อืมมมทำหน้าที่ผมที่เหมาะสมสำหรับ skimming กว่าคำถาม ...
ETHproductions

1

Perl 5 , 197 + 1 (-p) = 198 ไบต์

s/(0000)*$//;1while s/(...)0(...)0(...)0(...)0/0${1}0${2}0${3}0${4}/;$_={51,O,15,I,4369,I,54,S,561,S,99,Z,306,Z,547,L,23,L,785,L,116,L,275,J,113,J,802,J,71,J,114,T,562,T,39,T,609,T}->{oct("0b".$_)}

ลองออนไลน์!

รับสาย 16 บิตเป็นอินพุต ไม่มีผลอะไรถ้าอินพุตไม่ใช่ tetromino เดียว

อย่างไร?

การแทนที่ทั้งสอง "ย้าย" รูปร่างอินพุตไปที่มุมขวาล่าง สตริงบิตที่ได้จะถูกแปลงเป็นจำนวนเต็มจากนั้นตรวจสอบในแฮชของจำนวนเต็มที่ถูกต้อง


1

APL (Dyalog) , 66 ไบต์

{'TIOJSLZ-'[(¯51 144 64,,∘+⍨12J96 ¯48J64)⍳×/(+/-4×⊢)⍵/,0j1⊥¨⍳4 4]}

ลองออนไลน์!

หาเรื่องเป็นเวกเตอร์บูลีน

คำนวณระยะทางที่มีการลงจุดของจุดไปยังจุดศูนย์กลางของแรงโน้มถ่วงเป็นตัวเลขที่ซับซ้อน (ส่วนจริงและจินตภาพคือ ∆x, ∆y) และคูณจำนวนเชิงซ้อนด้วยกัน เรื่องนี้กลายเป็นสิ่งที่ดีพอที่จะแยกแยะความแตกต่างระหว่าง tetrominoes


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