นอร์มัลไลซ์ Pentomino 6x10 solution


19

อย่างที่คุณน่าจะเป็นไปได้ตอนนี้มีคำตอบ 2339 ตัวสำหรับตัวต่อ Pentomino Puzzle ในตาราง 6x10 มีรูปแบบการติดฉลากที่แตกต่างกันสำหรับ 12 pentominoes ทั้งสองจะแสดงในภาพด้านล่าง:

ป้อนคำอธิบายรูปภาพที่นี่

เครดิตรูปภาพ: Wikipedia

สำหรับวัตถุประสงค์ของงานปัจจุบันเราจะกล่าวว่าโซลูชัน Pentomino ที่ได้มาตรฐานเป็นโซลูชันที่ใช้รูปแบบการติดฉลากที่สอง (Conway's)

ตัวอย่าง:

O O O O O S S S Z Z
P P R R S S W W Z V
P P P R R W W Z Z V
U U X R T W Y V V V
U X X X T Y Y Y Y Q
U U X T T T Q Q Q Q

ชิ้นส่วนที่มี 5 สี่เหลี่ยมในแถวนั้นเขียนด้วยตัวอักษรOตามรูปแบบ เช่นเดียวกับทุกชิ้น

งาน:

ให้วิธีการแก้ปัญหากับ 6x10 pentomino ซึ่งชิ้นส่วนนั้นถูกเขียนด้วย sheme แบบสุ่มทำให้มันเป็นมาตรฐานเพื่อให้ชิ้นส่วนทั้งหมดได้รับการติดฉลากในรูปแบบการติดฉลากของ Conway คุณจำเป็นต้องรู้จักชิ้นส่วนและทำเครื่องหมายแต่ละตารางของชิ้นส่วนเฉพาะด้วยสัญลักษณ์ของชิ้นส่วน

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

วิธีแก้ปัญหาที่จะทำให้เป็นมาตรฐานในรูปแบบใด ๆ ที่สะดวกสำหรับคุณตัวอย่างเช่น:

  • สตริงหลายบรรทัด

  • รายการของสตริง

  • รายการของตัวละคร

และอื่น ๆ

เอาท์พุท:

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

กรณีทดสอบ:

1. อินพุต:

6623338888
6222344478
66A234BB70
1AAA94B770
11A99BB700
1199555550

เอาท์พุท:

UURTTTQQQQ
URRRTVVVSQ
UUXRTVZZSY
PXXXWVZSSY
PPXWWZZSYY
PPWWOOOOOY

2. อินพุต:

45ookkkk00
455ooogk00
4a55gggdd0
4aaa3gnnd.
4am333ndd.
mmmm3nn...

เอาท์พุท:

OWSSQQQQPP
OWWSSSRQPP
OTWWRRRUUP
OTTTXRZZUV
OTYXXXZUUV
YYYYXZZVVV

เกณฑ์การชนะ:

ทางออกที่สั้นที่สุดเป็นไบต์ในแต่ละภาษาชนะ อย่าท้อใจกับภาษากอล์ฟ ยินดีต้อนรับสู่การอธิบายขั้นตอนวิธีและการใช้งาน



@KevinCruijssen ขอขอบคุณ! (ฉันไม่ได้ตรวจสอบคำถามเกี่ยวกับ tetromonoes)
Galen Ivanov

คำตอบ:


12

APL (Dyalog Classic) , 54 53 50 ไบต์

⍴⍴{'OXRYTPZQUWSV'[⌊5÷⍨⍋⍋,{×/+⌿↑|(⊢-+/÷≢)⍸⍵}¨⍵=⊂⍵]}

ลองออนไลน์!

คำนวณค่าคงที่สำหรับแต่ละ pentomino ในอินพุต: วัด (∆x, ∆y) จากแต่ละช่องของมันไปยังศูนย์กลางของแรงโน้มถ่วงใช้ abs (∆x) และ abs (∆y) รวมองค์ประกอบ x และแยก y ส่วนประกอบและคูณสองผลรวม สิ่งนี้ให้ผลลัพธ์ที่แตกต่าง 12 อย่าง จากนั้นหาดัชนีของค่าคงที่ของเพนตามิโนแต่ละตัวในกลุ่มของค่าคงที่ทั้งหมด แทนที่ 0 ด้วย'O', 1 ด้วย'X', 2 ด้วย'R', ฯลฯ


ขอบคุณสำหรับคำตอบที่รวดเร็วและคำอธิบาย +1 จากฉัน! ฉันหมายถึงวิธีแก้ปัญหาที่จะพิมพ์อย่างชัดเจนเป็นตารางขนาด 6x10 ฉันเปลี่ยนการล้างค่าโปรดอัปเดตโซลูชันของคุณ - ขออภัยในความไม่สะดวก
Galen Ivanov

@GalenIvanov แต่ ... มันเป็นตาราง ผลการทดสอบของฉัน "ตกลง" แทนที่จะพิมพ์ผลลัพธ์ - บางทีมันอาจสับสนเกินไป
ngn

ใช่ฉันสับสนกับการทดสอบ
Galen Ivanov

3
ตอนนี้พวกเขาพิมพ์ผลลัพธ์ก่อนที่จะตรวจสอบความถูกต้อง
ngn

4

เยลลี่ , 37 ไบต์

ŒĠZÆmạƊ€ḅı§AỤỤị“æṂ⁾+’Œ?¤+78Ọ,@FQṢƊyⱮY

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

ลองออนไลน์!

อย่างไร?

ฉันเชื่อว่างานนี้ใช้ pentominos ประเภทเดียวกับโซลูชัน APL ของ ngnแม้ว่าจะมีวิธีที่แตกต่างกันเล็กน้อย (ฉันไม่รู้จัก APL ดังนั้นฉันจึงไม่แน่ใจว่าวิธีการนี้คล้ายกับการจัดหมวดหมู่อย่างไร)

(โปรดทราบว่า“æṂ⁾+’Œ?¤+78Ọเป็นเพียงหนึ่งไบต์บันทึกมากกว่า“XRPTZWUYSVQO”!)

ŒĠZÆmạƊ€ḅı§AỤỤị“æṂ⁾+’Œ?¤+78Ọ,@FQṢƊyⱮY - Main Link: list of lists of characters L
ŒĠ                                    - group multidimensional indices by value
      Ɗ€                              - last three links as a monad for €ach i.e. f(x):
  Z                                   -   transpose x
   Æm                                 -   mean (vectorises) (i.e. the average of the coordinates)
     ạ                                -   absolute difference with x (vectorises) (i.e. [dx, dy])
         ı                            - square root of -1 (i)
        ḅ                             - convert from base (vectorises) (i.e a list of (i*dx+dy)s)
          §                           - sum each
           A                          - absolute value (i.e. norm of the complex number)
            Ụ                         - grade up (sort indices by value)
             Ụ                        - grade up (...getting the order from the result of A back,
                                      -              but now with one through to 12)
                       ¤              - nilad followed by links as a nilad:
               “æṂ⁾+’                 -   base 250 literal = 370660794
                     Œ?               -   permutation@lex-index = [10,4,2,6,12,9,7,11,5,8,3,1]
              ị                       - index into
                        +78           - add seventy-eight
                           Ọ          - cast to characters (character(1+78)='O', etc...)
                                 Ɗ    - last three links as a monad (i.e. f(L)):
                              F       -   flatten
                               Q      -   de-duplicate
                                Ṣ     -    sort
                            ,@        - pair (with sw@pped @rguments) (giving a list of 2 lists)
                                   Ɱ  - Ɱap across L with:
                                  y   -   translate i.e. swap the letters as per the the pair)
                                    Y - join with new lines
                                      - implicit print

2

ภาษา Wolfram (Mathematica) , 103 ไบต์

""<>Riffle[(t=#)/.Thread[SortBy[Union@@t,Tr@Kurtosis@Position[t,#]&]->Characters@"UPSWZVRTQXYO"],"\n"]&

รับอินพุตเป็นรายการของอักขระ

ลองออนไลน์!

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

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

อย่างไรก็ตามนอกเหนือจากค่าคงที่แปลก ๆ วิธีนี้คล้ายกับตัวอื่น: เราจัดเรียงตัวละครและชิ้นส่วนโดยแต่ละค่าคงที่จากนั้นเปลี่ยนตัวละครแต่ละตัวด้วยตัวอักษรที่สอดคล้องกันของ"UPSWZVRTQXYO": ชิ้นส่วนเรียงลำดับตามผลรวม kurtosis

ในที่สุด""<>Riffle[...,"\n"]ก็คือรหัสการพิมพ์เป็นตาราง


+1 สำหรับการรับรู้การดำเนินการที่ฉันไม่เคยได้ยินมาก่อนและนำไปใช้ให้เป็นประโยชน์
Black Owl Kai

ความพยายามครั้งแรกของฉันในการแก้ปัญหามีSort@Varianceในสถานที่Tr@Kurtosisและอาจมีคนได้ยินความแปรปรวน แต่Tr@Varianceไม่ได้ผลเพราะเพนท์โนหลายแห่ง (เช่น P และ X) มีผลรวมของ x-variance และ y-variance เท่ากัน ดังนั้นฉันจึงดูเอกสารของ Mathematica เพื่อหาสิ่งที่น่าสนใจ
Misha Lavrov

2

Python 2 , 191 ไบต์

def y(o):print"".join(['XPRTWZUYSVQO\n'[[w for v,w in sorted([sum(abs(u-sum(t)/5)for t in[[complex(r%11,r/11)for r,q in enumerate(o)if q==p]]for u in t),p]for p in o)].index(x)/5]for x in o])

ลองออนไลน์!

ใช้สตริงแบบหลายบรรทัดพร้อมกับขึ้นบรรทัดใหม่และทำรายการที่ซ้อนกันหกรายการ

เวอร์ชันที่ไม่ดี

def pentomino_normalizer(input_string):
    # input_string is a multi-line string with a trailing newline

    results = []  # For saving the results of the for loop
    for current_char in input_string:
        # current_char = p in the golfed version

        # The python data type complex stores a real and a imaginary value and
        # is used for storing the x and y coordinates.
        # In the end, the positions list contains a complex number for every
        # occurence of current_char in the string
        # positions_list = t in the golfed version
        positions_list = [complex(i % 11, i / 11) for i, c
                          in enumerate(input_string) if c == current_char]
        # average_pos is the midpoint of all occurences of current_char, 
        # to get rid of translations
        average_pos = sum(positions_list)/5
        # Calculates a value for each tile that is invariant under 
        # translations and rotations,
        # simply the sum of all the distances between the midpoint
        # and the positions
        invariant = sum(abs(pos - average_pos) for pos in positions_list)

        # Saves the invariant value to a list
        results.append(invariant, current_char)

    # This new list contains the characters occuring in the string, sorted
    # by the invariant value. Because this was done with each char in the 
    # input string, this lists contains every value five times and also 
    # contains six newlines
    # at the end of the list
    sorted_results = [w for v, w in sorted(results)]

    # This code snippet maps each char from the input string to its according
    # output and prints to stdout
    chars = ['XPRTWZUYSVQO\n'[sorted_results.index(c)/5] for c in input_string]
    print "".join(chars)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.