บล็อกการจัดเรียงใหม่


14

ดังนั้นงานของคุณคือใช้บล็อก 3x3 โดยที่-ช่องว่างเฉลี่ยหมายถึงและ*ช่องว่างที่เติมเต็มตัวอย่างเช่น

-**
-*-
*-*

และจัดเรียงบล็อกใหม่เพื่อให้*รูปแบบเป็น X ดังนี้:

*-*
-*-
*-*

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

เอาท์พุท:จำนวนที่สั้นที่สุดของการเคลื่อนไหวเพื่อจัดเรียงใหม่เป็น X การเคลื่อนไหวแต่ละครั้งจะพลิกตัวละคร 2 ตัวที่สัมผัสและเป็นแนวนอนจากกันแนวตั้งจากกันและกันหรือแนวทแยงมุมจากกัน ถ้ามันเป็นไปไม่ได้กลับมาส่งออกไปไม่ได้ใด ๆ ตัวอย่างเช่นหรือ999 เป็นจำนวนที่น้อยที่สุด-42425

กรณีทดสอบ:

1) ผลลัพธ์: 1

-**
-*-
*-*

2) ผลลัพธ์: -1

-*-
-*-
*-*

3) ผลลัพธ์: 3

---
-**
***

4) ผลลัพธ์: 0

*-*
-*-
*-*

คุณสามารถแทนที่อักขระว่างและไม่ใช่อักขระว่างได้ แต่ต้องแน่ใจว่าได้รวมอักขระที่อยู่ในโพสต์ของคุณ

รหัสกอล์ฟ

โปรดจำไว้ว่านี่คือการแข่งขันรหัสที่สั้นที่สุดชนะ!


1
โดยการพลิกตัวละคร 2 ตัวคุณหมายถึงการพลิกจากอวกาศไปยัง*และในทางกลับกันหรือแลกเปลี่ยนมัน?
user202729

เกิดอะไรขึ้นถ้ามีมากกว่าห้า*? คุณสามารถเพิ่มกรณีทดสอบเพิ่มอีกได้ไหม?
Stewie Griffin

ตัวอย่างเช่น @ user202729 abc จะเป็น acb หากคุณพลิกอักขระ 2 ตัวสุดท้าย
โนอาห์คริสติโน

@StewieGriffin "หากไม่สามารถส่งคืนได้ -1" มากกว่า 5 *หรือน้อยกว่า 5 ทำให้เป็นไปไม่ได้
โนอาห์คริสติโน

6
เราอาจใช้สิ่งอื่นที่ไม่ใช่-1? ตัวอย่างเช่น5(เป็นไปไม่ได้) หรือโยนข้อผิดพลาด?
Jonathan Allan

คำตอบ:


12

Python 3 , 104 78 ไบต์

lambda n:-(sum(n)!=5)or sum(n[1::2])+n[4]*(max(n,n[6:],n[::3],n[2::3])>=[1]*3)

ลองออนไลน์!

แก้ไข: ใช้ทั้งคำแนะนำของ @Jonathan Allan และ @ xnor เพื่อลดจำนวนไบต์ลงอย่างมาก

อินพุตเป็นรายการสตริงที่มีความยาว 9 พร้อมเลขศูนย์และรายการที่อยู่ใน*รายการ

นี่คือข้อสังเกตบางอย่าง:

  • เราไม่จำเป็นต้องขยับดวงดาวไปยังเซลล์ที่ถูกต้องแล้ว ดาวที่วางผิดตำแหน่งใด ๆ มี 5 เซลล์โดยรอบซึ่งไม่สามารถปิดกั้นได้ในครั้งเดียว (มิฉะนั้นคำตอบคือ -1 แล้ว)
  • ค่าใช้จ่ายสำหรับดาวที่ใส่ผิดตำแหน่งคือ 1 หรือ 2 และเป็น 2 เท่านั้นถ้ามันถูกล้อมรอบด้วยดาวสามดวงที่วางไว้อย่างถูกต้อง
  • ค่าใช้จ่ายสำหรับดาวที่หายไปแต่ละดวงนั้นไม่ขึ้นอยู่กับกันและกัน

ดังนั้นเราจะทดสอบก่อนว่าสตริงมีห้าอันแล้วนับสิ่งเหล่านี้:

  • จำนวนดาวที่ใส่ผิดตำแหน่ง = = ดวงที่ดัชนีแปลก ๆ
  • จำนวนดาวใส่ผิดของค่าใช้จ่ายที่ 2 (= เซลล์ที่0124, 0346, 2458, 4678เป็นทุกคน)
    • ปัจจัยจากการเป็นหนึ่งและทดสอบแต่ละคนสกัดช่วงn[4]'111'
    • ตั้งแต่ดาวดังกล่าวเป็นที่หนึ่งมากที่สุดเราสามารถใช้แทนmaxsum

บันทึก 17 ไบต์โดยยอมรับรายการแทนสตริง (แทนที่counts ด้วยsums และ'111'ด้วย[1]*3) TIO (ฉันพยายามฉลาดด้วยn[i::j]>=[1]*3ลูป แต่ไม่พบว่าสั้นลง)
Jonathan Allan

เนื่องจากมีเพียงสามารถเป็นหนึ่งในค่าใช้จ่าย 2 max(n,n[6:],n[::3],n[2::3])>='1'*3ดาวดูเหมือนว่าคุณสามารถทำได้
xnor

มีการเตรียมการอื่น ๆ ที่มีดาวต้นทุน 2 ดาว ฉันคิดว่า [0,1,1,1,1,1,0,1,0,0] ควรกลับ 3 แทน 2
RootTwo

นอกจากนี้ [1,1,1,1,0,0,1,0,0] ควรเป็น 3 แทนที่จะเป็น 2
RootTwo

นอกจากนี้ [1,1,1,1,0,0,1,0,0] ควรเป็น 3 แทนที่จะเป็น 2
RootTwo

4

เยลลี่ 26 ไบต์

5ḶḤd3ạŒ!Ṁ€€ḅ1Ṃ
T’d3Ç-L=5Ɗ?

ลองออนไลน์!


ใช้รายการแบนเป็นอินพุต

น่าเสียดายที่ Jelly ไม่มี "ดัชนีความจริงหลายมิติ" ... ใช้T€ṭ€"JẎงานได้ แต่ต้องใช้ 1 ไบต์อีก


อัลกอริทึม: มี 5 ตำแหน่งบล็อกปัจจุบันและ 5 เป้าหมาย (จุดหมายปลายทาง) อัลกอริทึมจะลองแต่ละ 5! การจับคู่และส่งออกผลรวมขั้นต่ำของ [ต้นทางปลายทาง] ระยะทาง Chebyshev


คุณอาจใช้รายการแบบเรียบ ("แต่คุณต้องการ") ... บางทีคุณอาจใช้ดัชนีที่มี 0 และมี 24?
Jonathan Allan

4

Haskell , 176 132 126 104 ไบต์

w=0:1:w
m a|sum a/=5=5|1>0=sum$[a!!4|3<-sum.map(a!!)<$>[[0,1,2],[0,3,6],[2,5,8],[6,7,8]]]++zipWith(*)a w

ลองออนไลน์!


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


2
เคล็ดลับ: การlengthทดสอบสามารถสั้นลงsum[1|1<-a]ได้ Function sto: (1-e,n+sum[1|b>e])ซึ่งคุณสามารถ inline เพื่อบันทึก byte อื่น คุณสามารถใช้otherwiseยามในการบันทึกคู่ของm ()สุดท้ายในระดับชั้นนำในยามจะถูกแทนที่ด้วย&& ,...
nimi

2
คุณสามารถบันทึกไบต์อื่นได้โดยใช้ a sumในรายการเพื่อทำความเข้าใจกับ Boolean เป็น int ลองออนไลน์!
โพสต์ Rock Garf Hunter

2
mที่จริงคุณสามารถบันทึกค่อนข้างไม่กี่ไบต์เพราะเมื่อยามรูปแบบจะหายไปคุณก็สามารถย้ายสิ่งที่ทั้งขึ้นไป ลองออนไลน์!
โพสต์ร็อค Garf Hunter

2
นอกจากนี้เนื่องจากองค์ประกอบที่ไม่ใช่ 1 ของทุกอย่างaจะต้อง0ไม่สามารถใช้sum aแทนได้sum[1|1<-a]หรือไม่ ลองออนไลน์!
โพสต์ร็อค Garf Hunter

1
ฉันเพิ่งรู้เพราะมีไม่เกิน 1 ด้านกับทุกคน1ยกเว้นว่าศูนย์กลางคือ0คุณสามารถทำได้3<-แทนelem 3$แทนคุณยังสามารถใช้แทนsum.map(a!!) sum<$>map(a!!)
โพสต์ Rock Garf Hunter

3

Python 2 , 194 192 ไบต์

from itertools import*
f=lambda l,k=0:-(sum(l)!=5)or[1,0]*4!=l[:-1]and k<4and-~min(f(l[:a]+[l[b]]+l[a+1:b]+[l[a]]+l[b+1:],k+1)for a,b in combinations(range(9),2)if max(b/3-a/3,abs(a%3-b%3))<2)

ลองออนไลน์!


1
ใช้งานไม่ได้[0,1,0,1,0,1,1,1,0](คาดว่า: 4 จริง: 13)
Bubbler

@Bubler แก้ไขมัน
ovs

3

JavaScript (ES6), 123 ไบต์

รับอินพุตเป็นจำนวนเต็ม 9 บิต แก้ปริศนาโดยใช้กฎอย่างไร้เดียงสาซึ่งได้รับการพิสูจน์แล้วว่าไม่ใช่วิธีที่สั้นที่สุด

f=(n,k=b=-1)=>n^341?k>2?b:[3,6,9,10,17,18,20,34,36].map(m=>[1,8,8].map(M=>(x=n&(m*=M))&-x^x||f(n^m,k+1)))|b:!~b|k<b?b=k+1:b

ลองออนไลน์!

แสดงความคิดเห็น

f = (                           // f = recursive function taking:
  n,                            //   n = input
  k =                           //   k = number of moves, initialized to -1
  b = -1                        //   b = best result so far, initialized to -1
) =>                            //
  n ^ 341 ?                     // if n does not match the target pattern:
    k > 2 ?                     //   if we've already done more than 3 moves:
      b                         //     we're not going to find a solution -> abort
    :                           //   else:
      [3,6,9,10,17,18,20,34,36] //     for each swap bitmask m
      .map(m =>                 //     and
      [1,8,8]                   //     for each multiplier M:
      .map(M =>                 //       apply the multiplier to m and
        (x = n & (m *= M))      //       apply the final bitmask to n -> this gives x
        & -x                    //       isolate the least significant bit of x
        ^ x ||                  //       if it's the only bit set,
        f(n ^ m, k + 1)         //       then swap the bits and make a recursive call
      )) | b                    //     end of both map() loops; return b
  :                             // else:
    !~b | k < b ? b = k + 1 : b //   this is a solution in k+1 moves: update b

NB : รหัสนี้มีการเคลื่อนไหวที่ผิดกฎหมายบางอย่างซึ่งอยู่เหนือส่วนบนของบอร์ดเมื่อmถูกคูณด้วย 64 แต่พวกมันจะถูกเพิกเฉยเพราะพวกเขาไม่สามารถนำไปสู่การแก้ปัญหาที่สั้นกว่าโซลูชันทางกฎหมายที่ดีที่สุด

ด้านล่างนี้เป็น bitmasks swap 9 ฐานและรูปแบบเป้าหมาย มุมซ้ายบนเป็นบิตที่สำคัญที่สุด

000  000  001  001  010  010  010  100  100     101
011  110  001  010  001  010  100  010  100     010 (341)
(3)  (6)  (9)  (10) (17) (18) (20) (34) (36)    101

คุณสามารถลิงค์ hexdump เพื่อทำการทดสอบได้หรือไม่? นอกจากนี้ฉันไม่ทราบว่าเป็นจำนวนเต็ม 9 บิตใน JS
Stan Strum

@StanStrum อัปเดตเป็นเวอร์ชั่นที่สั้นกว่าด้วยการเข้ารหัสที่ตรงไปตรงมามากขึ้น (และใช่: JS รองรับการทำงานระดับบิตสูงสุด 32 บิต)
Arnauld

2

เยลลี่ 26 ไบต์

“ċȤ‘ḤB;U$=a¥;Ḋm2ƊẠ€SɓSn5Nȯ

ลองออนไลน์!

ลิงก์ monadic

อย่างไร?

แรงบันดาลใจจากคำตอบ Python ของ Bubbler ; golfed เพื่อให้เหมาะกับเยลลี่ ...

“ċȤ‘ḤB;U$=a¥;Ḋm2ƊẠ€SɓSn5Nȯ - Link: length 9 list of ones & zeros, X
“ċȤ‘                       - list of code-page indices     = [232,154]
    Ḥ                      - double                        = [464,308]
     B                     - to binary     = [[1,1,1,0,1,0,0,0,0],[1,0,0,1,1,0,1,0,0]]
        $                  - last two links as a monad:
       U                   -   upend       = [[0,0,0,0,1,0,1,1,1],[0,0,1,0,1,1,0,0,1]]
      ;                    -   concatenate = [[1,1,1,0,1,0,0,0,0],[1,0,0,1,1,0,1,0,0],[0,0,0,0,1,0,1,1,1],[0,0,1,0,1,1,0,0,1]]
           ¥               - last two links as a dyad:
          a                -   logical AND (vectorises)
         =                 -   equal? (vectorises)
                Ɗ          - last three links as a monad:
             Ḋ             -   dequeue X (remove leftmost element)
               2           -   literal two
              m            -   modulo slice (keeps the "edge-elements") 
            ;              - concatenate
                 Ạ€        - all? for €ach (edge-elements: no-op
                           -                else: 1 for any cost-2 element 0 otherwise)
                   S       - sum
                    ɓ      - new dyadic chain ^that on the right; X on the left
                     S     - sum X
                       5   - literal five
                      n    - not equal?
                        N  - negate (-1 if not exactly 5 1s, 0 otherwise)
                         ȯ - logical OR with right

2

JavaScript, 85 ไบต์

s=>/^0*(10*){5}$/.test(s)*s.match(/(?=1.(..)*$|^1(..)?11.1|1.11(..)?1$)|$/g).length-1

นี่คือพอร์ต regex ของคำตอบของ Bubblerคำตอบ

อินพุตเป็นสตริง 0/1


2

Stax , 23 22 ไบต์

Ç╙╤Ü┤└åVτ┐├Y-²▼░█∩¡3ëâ

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

โปรแกรมนี้ใช้อาร์เรย์ของ [0, 1]เป็นอินพุตและส่งคืนจำนวนการย้ายจำนวนเต็มหรือสตริงว่างถ้าไม่มีวิธีแก้ไขที่เป็นไปได้

พิจารณาดัชนีนี้สำหรับกริด

0 1 2
3 4 5
6 7 8
  • หากมีไม่ตรง 5 1อินพุตวินาทีแสดงว่าไม่มีวิธีแก้ไขดังนั้นเราจึงไม่สร้างเอาต์พุต
  • ศูนย์กลางของแต่ละด้านเป็นตำแหน่งที่ไม่ถูกต้อง นี่คือดัชนี 1, 3, 5 และ 7 รวมระยะทางสำหรับแต่ละข้อ1ตำแหน่งในผลลัพธ์เหล่านี้จะให้ผลลัพธ์สุดท้าย
  • สำหรับแต่ละ1ตำแหน่งที่ไม่ถูกต้องระยะของมันคือ 1 หรือ 2 มันจะเป็น 2 iff ซึ่งล้อมรอบด้วย1s อื่น ตัวอย่างเช่นหากมี1s ที่ดัชนี [0, 1, 2, 4] ดังนั้นระยะทางสำหรับค่าที่ไม่ถูกต้อง1คือ 2
  • เมื่อคำนึงถึงสิ่งนี้ให้พิจารณาโค้ดหลอกนี้เพื่อให้ได้ระยะทางที่สนับสนุนผลลัพธ์โดยดัชนี 1

    1. อ่าน 4 บิตจากดัชนี [1, 0, 2, 4] สิ่งนี้ทำให้ตำแหน่งที่ไม่ถูกต้องในตำแหน่งที่สำคัญที่สุด
    2. แปลงบิตเหล่านี้เป็นตัวเลข bตั้งแต่ 0 ถึง 15
    3. เมื่อ0 <= b <= 7ระยะทางที่เป็น 0 เมื่อ8 <= b <= 14ระยะคือ 1. เมื่อb == 15ระยะทางที่ 2 b * 2 / 15นี้สามารถคำนวณโดยใช้แบ่งจำนวนเต็มโดย

ดังนั้นระยะทางทั้งหมดสามารถคำนวณได้โดยทำซ้ำขั้นตอนนี้ 4 ครั้งแล้วหมุนกริดในระหว่างนั้น

1#5=4*  if the number of 1s is 5, then 4, else 0
D       repeat the rest of the program that many times
  x     push the value in the x register, which is initially the input
  3/    split into 3 rows
  rM    rotate 90 degrees
  $X    flatten back into single array, and save the "rotated" array in the X register
  A|2E  get the digits of 2^10 i.e. [1,0,2,4]
  @     read the bits from the current rotation at indices [1,0,2,4]
  :b    convert bits to integer
  H15/  double, then divide by 2
  +     add to running total

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


ตรวจสอบการแก้ไขค่าที่เป็นไปได้ใด ๆ ที่ยอมรับไม่เพียง -1 ถ้าช่วยคุณได้
โนอาห์คริสติโน

ใช่. ที่บันทึกไว้ 2 ไบต์
เรียกซ้ำ

1

Excel, 86 81 ไบต์

=SUM(B1,A2,B3,C2)+B2*(AND(A1:A3)+AND(A1:C1)+AND(C1:C3)+AND(A3:C3))/(SUM(A1:C3)=5)

เก่า: เมื่อผลลัพธ์ที่เป็นไปไม่ได้คือ-1

=IF(SUM(A1:C3)=5,SUM(B1,A2,B3,C2)+B2*(AND(A1:A3)+AND(A1:C1)+AND(C1:C3)+AND(A3:C3)),-1)

ใช้1สำหรับการเติมเต็มและสำหรับที่ว่างเปล่าใส่ในช่วง 0 เป็นไปได้ที่จะตีกอล์ฟต่อไปหากเราสามารถคืนค่าอื่น ๆ นอกเหนือจาก"เป็นไปไม่ได้" ส่งคืนA1:C3-1#DIV/0!ข้อผิดพลาดบนกริดที่เป็นไปไม่ได้

ทำงานบนตรรกะเดียวกับBubbler คำตอบของงูหลาม


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