สี่เหลี่ยมของ Flippin


34

สร้างโปรแกรมหรือฟังก์ชั่นเพื่อแยกส่วนของตารางโดยการพลิก (กลับจุดศูนย์กลาง) เฉพาะแถวและคอลัมน์เท่านั้น

อินพุต

อินพุตจะเป็นตาราง 9x9 ของตัวเลขในรูปแบบของสตริง 9 บรรทัดดังนี้:

986553229
264564891
759176443
643982153
567891234
526917874
685328912
891732537
117644378

รูปแบบอินพุตนี้ไม่สามารถต่อรองได้ - โซลูชันใด ๆ ที่เป็น "โฆษณา" ที่มีรูปแบบอินพุตจะถือว่าไม่ถูกต้อง

เอาท์พุต

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

ตัวอย่างเอาต์พุต (ไม่ใช่โซลูชันสำหรับตัวอย่างอินพุตก่อนหน้า):

28IF5D3EAB9G3

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

กริดเป้าหมาย (สถานะที่คุณต้องการสร้างใหม่) มีดังนี้:

123456789
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678

ควรใช้ตัวเลข1- 9เป็นคำแนะนำในการพลิกแถวและตัวอักษรA- Iควรใช้สำหรับคอลัมน์ สิ่งนี้แสดงอยู่ด้านล่างพร้อมกริดในสถานะที่ถูกกู้คืน

     ABCDEFGHI
     |||||||||
     vvvvvvvvv
1 -> 123456789
2 -> 234567891
3 -> 345678912
4 -> 456789123
5 -> 567891234
6 -> 678912345
7 -> 789123456
8 -> 891234567
9 -> 912345678

ดังนั้น8วิธีพลิกแถวที่สองจากด้านล่างและFวิธีพลิกคอลัมน์ที่หก

ในกรณีที่ไม่มีวิธีแก้ปัญหาที่เป็นไปได้โปรแกรมควรสิ้นสุดโดยไม่แสดงผลลัพธ์ใด ๆ เลย

ตัวอย่าง

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

987654321
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678

เอาท์พุท:

1

ในกรณีนี้เฉพาะแถวบนสุดจำเป็นต้องมีการพลิกเพื่อกลับสู่สถานะเป้าหมาย

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

123456788
234567897
345678916
456789125
567891234
678912343
789123452
891234561
912345679

เอาท์พุท:

I

ในกรณีนี้เฉพาะคอลัมน์สุดท้าย (คอลัมน์I) ต้องพลิกเพื่อสร้างสถานะเป้าหมายใหม่

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

123456788
798765432
345678916
456789125
567891234
678912343
789123452
891234561
912345679

เอาท์พุท:

2I

ในกรณีนี้เราต้องพลิกแถว2แล้วพลิกคอลัมน์Iเพื่อกลับสู่สถานะเป้าหมาย

หมายเหตุ:

  • โปรดระบุตัวอย่างการใช้งานในคำตอบของคุณ
  • ผลลัพธ์ที่ได้รับไม่จำเป็นต้องเป็นลำดับที่สั้นที่สุดที่จะคืนสถานะเป้าหมาย - ลำดับใด ๆ ที่ส่งคืนสถานะเป้าหมายจะดำเนินการตราบเท่าที่มันใช้งานได้ (เช่นตราบเท่าที่ฉันสามารถทดสอบได้)
  • ฉันจะพยายามทดสอบคำตอบแต่ละข้อและถอนรากถอนโคนทั้งหมดที่ใช้ได้และเห็นได้ชัดว่ามีความพยายามในการเล่นกอล์ฟ
  • นี่คือการแข่งขันที่เปิดกว้าง - ฉันจะยอมรับคำตอบที่สั้นที่สุดบางครั้งในสัปดาห์หน้า แต่ถ้าคำตอบที่ถูกต้องใหม่มาพร้อมที่จะสั้นกว่าที่จุดใด ๆ ในอนาคตผมจะเปลี่ยนคำตอบที่ได้รับการยอมรับที่จะสะท้อนให้เห็นว่า
  • รางวัลที่ได้รับการตั้งค่าที่ 200 ชื่อเสียงสำหรับคำตอบที่สั้นที่สุดที่ได้รับจาก23:59:59 (GMT) บน 26/01/2014โปรดปรานเป็นรางวัลให้กับโฮเวิร์ดเขาแก้ปัญหา GolfScript 268 ตัวอักษร

การทดสอบ

โปรดให้ผลลัพธ์ของโปรแกรมของคุณสำหรับสามกริดการทดสอบต่อไปนี้พร้อมคำตอบของคุณ:

986553229
264564891
759176443
643982153
567891234
526917874
685328912
891732537
117644378

927354389
194762537
319673942
351982676
567891234
523719844
755128486
268534198
812546671

813654789
738762162
344871987
341989324
567891234
576217856
619623552
194435598
926543271

ฉันได้สร้างโปรแกรม Python ขนาดเล็กเพื่อสร้างกริดที่ถูกต้องสำหรับวัตถุประสงค์ในการทดสอบ:

import random

def output(array):
  print '\n'.join([''.join(row) for row in array])

def fliprow(rownum, array):
  return [row[::1-2*(rownum==idx)] for idx,row in enumerate(array)]

def flipcol(colnum, array):
  return zip(*fliprow(colnum, zip(*array)))

def randomflip(array):
  op=random.randint(0,1)
  row=random.randint(0,9)
  if(op==1):
    return fliprow(row, array)
  else:
    return flipcol(row, array)

def jumble(array):
  arraycopy=array
  for i in range(10, 1000):
    arraycopy=randomflip(arraycopy)
  return arraycopy

startarray=[
['1','2','3','4','5','6','7','8','9'],
['2','3','4','5','6','7','8','9','1'],
['3','4','5','6','7','8','9','1','2'],
['4','5','6','7','8','9','1','2','3'],
['5','6','7','8','9','1','2','3','4'],
['6','7','8','9','1','2','3','4','5'],
['7','8','9','1','2','3','4','5','6'],
['8','9','1','2','3','4','5','6','7'],
['9','1','2','3','4','5','6','7','8']]

print output(jumble(startarray))

8
ฉันเพิ่งเขียนคำตอบสั้น ๆ ที่พลิกแถว / คอลัมน์แบบสุ่มจนกว่าการเรียงลำดับจะเสร็จสมบูรณ์ หลังจากการทำซ้ำ 500 ล้านครั้งมันยังคงไม่ได้ไขปริศนาแรกที่คุณให้ (ซึ่งคุณเพียงแค่ต้องพลิกแถวที่ 1) การสุ่มไม่ปรากฏว่าเป็นทางออกที่ใช้งานได้สำหรับปัญหานี้!
Josh

3
@ Josh ไม่น่าแปลกใจ ปัญหานี้ดูเหมือนจะคล้ายกันมากกับการแก้ลูกบาศก์ของรูบิค ฉันคิดว่าการค้นหาแบบกว้าง ๆ บางอย่างจะเป็นพลังที่ดีที่สุด ขั้นตอนวิธีแบบสุ่มในทางทฤษฎีต้องยุติลงในที่สุดและดูเหมือนจะสอดคล้องกับกฎที่ระบุ
Cruncher

4
กำลังดุร้ายไม่จำเป็น พิจารณาข้อเท็จจริงที่ว่าแต่ละตารางย่อยสามารถวางตำแหน่งได้เพียงหนึ่งในสี่ตำแหน่งเท่านั้น: ตำแหน่งที่ถูกต้องพลิก X, พลิก Y หรือพลิก XY มันอาจช่วยให้คุณรักษาตารางทางจิตใจว่ามี (0,0) เป็นกระเบื้องกลางมากที่สุด หากคุณกำลังแก้กระเบื้อง (-2, 4), สถานที่เพียงจำนวนเป้าหมายที่อาจจะเป็น(-2, 4), (2, 4), หรือ(2, -4) (-2, -4)
นาย Llama

2
@ Cruncher: การใช้ทั้งแถว / คอลัมน์พลิกทำให้เป็นไปไม่ได้ ยกตัวอย่างเช่นการพยายามที่จะใช้ upperleftmost 1 ( A1) B1และย้ายไปยัง คุณจะได้รับ1ไปยังตำแหน่งที่B1แต่มันจะเป็นกระเบื้องจากไม่กระเบื้องจากB9 A1เนื่องจากเราอนุญาตให้พลิกทั้งแถว / คอลัมน์ทั้งหมดได้เท่านั้นส่วนบนสุด 1 จะอยู่ในหนึ่งในสี่มุมนอกสุดเท่านั้น หากฉันเข้าใจผิดกฎโปรดแจ้งให้เราทราบ
นายลามะ

7
ขอแสดงความยินดี Gareth นี่เป็นปัญหาที่ออกแบบมาอย่างดีมาก นอกจากนี้ค่อนข้างท้าทาย
DavidC

คำตอบ:


7

GolfScript, 300 279 268 ตัวอักษร

n%`{\5,{.9+}%{;.2/\2%},\;''{1${.9/7+7*+}%+:z;}:?~{{.9<77*{\zip\9-}>:Z~{1$!{-1%}*\(\}@%\Z;}/}:E~{:^;{:c;.`{[\E[.^=\8^-=]{.c=\8c-=}%[^c+^8c-+8^-c+16c-^-]{9%49+}%=}+[[]]:K[[8^- 17c-][^9c+]1$]{:s;{[[]s.+.2$+]{1$+}/}%.&}/\,K+0=z?E}5,/}5,/{{+9%)}+9,%''*}9,%={z:u;}*}+1024,/u

โปรดทราบว่ารหัสนี้ช้ามาก (เนื่องจากการจัดการบล็อกรหัสหนัก) และอาจใช้เวลาหลายนาที รหัส un-golfscript-ish นั้นมีตัวแปรและลูปอย่างชัดเจน

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

คำตอบสำหรับปริศนาที่ให้ไว้ข้างต้น:

1A2C4D9G9G9G9G1C1C1C1C9F9F9F9F1D1D1D1D2A2A2A2A8H8H8H8H2B2B2B2B2C2C8F8F2D2D2D2D3A3A7I7I3B3B7H7H7G7G7G7G3D3D7F7F6I6I6I6I4A4A4A4A6H6H6H6H6G6G4C4C4C4C6F6F4D4D

1AB39I9I1A1A9I9I1B1B9F9F8I8I8I8I2B2B8H8H8G8G8G8G2D2D2D2D3A3A3A3A7H7H7H7H3C3C3C3C3D3D7F7F6I6I4A4A6I6I4B4B4B4B6G6G4C4C4C4C6F6F6F6F4D4D

1A34D9I9I9I9I1A1A1A1A1B1B1B1B9G9G1C1C1C1C9F9F9F9F1D1D9F9F8I8I2A2A2A2A8H8H8H8H2C2C2C2C8F8F2D2D8F8F7I7I7I7I3A3A3B3B7G7G7G7G3C3C3C3C6I6I6I6I6H6H6H6H4B4B4B4B6G6G6G6G4C4C6G6G6F6F4D4D6F6F

ดีก็เป็นไปได้ที่การทำงานอย่างหนักสวยเต้นนี้ ...
แกเร็ ธ

ดูเหมือนว่าฉันผิด ...
Gareth

@Gareth ฉันรู้ว่านี่เป็นความท้าทายซึ่งจะยากกับ golfscript เทียบกับเช่น mathematica
Howard

1
@Howard - คุณใช้วิธีการใด 'รุ่นลองและตรวจสอบ' ที่คุณพูดถึงคืออะไร
SergeyS

24

Mathematica 582 575 503 464 282

เพื่อต่อสู้กับนักกอล์ฟฉันต้องใช้ปืนใหญ่หนัก!

i = "986553229
264564891
759176443
643982153
567891234
526917874
685328912
891732537
117644378";

a=Array;h@M_:=Join@@a[9(M〚##〛/. 9->9⌈2Random[]⌉)+Abs[{##}-5]&,n={9,9}];
For[i_~t~j_:=i{#2,10-#2}+j#-9&~a~{9,4},!ListQ[e=GroupElementToWord[
PermutationGroup[Cycles/@Join[1~t~9,9~t~1]],
h[ToCharacterCode@StringSplit@i-48]~FindPermutation~h@a[Mod[8+##,9,1]&,n]]],];
e~IntegerString~36<>""

เอาท์พุท:

g69g69g8g8g7g7gd96d96d8d8d7d7dh6h64a6a46d6d4g4g6b6b7h7h7c7c2a8a27b7bd8db8b7f7fg8g82c2c94a4a3a3aigfdc91

ที่นี่PermutationGroup[...]จะตั้งค่าการพลิกที่เป็นไปได้และGroupElementToWord[...]แก้ไขปัญหา (ประมาณ0.2วินาที) ปัญหาหลักคือว่ามันยากที่จะระบุการติดต่อระหว่างตำแหน่งของ9ในการเริ่มต้นและตารางสุดท้าย สำหรับการเล่นกอล์ฟฉันทำแบบสุ่ม (ใช้เวลาหลายวินาที) มีคำเตือนอยู่บ้าง แต่ก็สามารถเพิกเฉยได้

อื่น ๆ เพื่อทดสอบกริด:

g69g69g8g8g7g7gh89h89h7h7h6h6hf6f6g6g64f4f4h4hg7g73g3g2a8a28d8db8b83d3dg8g82c2c9a3a643a3a2g9f9d9c9ga
h89h89h7h7h6h6h6h6h6f6f6g6g6d6d3a7a37g7g7h7h3c3c2a8a27b7b8d8d2f2f8b8b3f3f2b2ba2a764a8aih9g9c9gb1i

มันทำซ้ำตัวอย่างทั้งหมด:

1
i
2i

โซลูชันก่อนหน้า (464)

ไม่มีฟังก์ชั่นในตัวที่ฉลาดและมี runtime 4 ms:

M=ToCharacterCode@StringSplit@i-48;
S="";s=Signature;H=(S=S<>{#,#2+9}~IntegerString~36)&;
A=(m=M〚##〛)-9Mod[m+##,2]&[s@{2#3,5}#,2#2#3~Mod~2-#2]&~Array~{4,4,4};
u=s/@Join@@A;
H@@({k,l}=#&@@@#~Position~1&/@{v=u〚13;;〛;{h=#2u〚2〛,-#u〚5〛,-#u〚9〛}&@@v,v〚4〛=u〚4〛h;v});
A〚k〛=A〚k,;;,{2,1,3,4}〛;A〚;;,l〛=A〚;;,l,{3,2,1,4}〛;
MapIndexed[4#≠#4&&H@@@If[#2<3,#0[#3,#,#2,#4];k,#0[#,#3,#4,#2];10-k]&@@
If[s@#<0,#〚{1,3,2,4}〛,#]&@Ordering[k={#2,#2};#]&,A,{2}];
M〚5,1〛<5&&5~H~{};M〚1,5〛<5&&{}~H~5;S

ไม่จำเป็นต้องขึ้นบรรทัดใหม่ที่นี่

เอาท์พุท:

3b9i9i1a1a1a1a9i9i1a1a9h9h1b1b1b1b9h9h9g9g1c1c9g9g9f9f1d1d9f9f8h8h2b2b8f8f8f8f7i7i7h7h3b3b3b3b7h7h3b3b7h7h7g7g3c3c7g7g3c3c7f7f6i6i4a4a6h6h4b4b4b4b6g6g4c4c6g6g4c4c6f6f4d4d4d4d6f6f4d4d6f6f4d4d

อีกสองกริดทดสอบ:

13ab9i9i1a1a9i9i9h9h1b1b1b1b9h9h9f9f8i8i8i8i8h8h2b2b2b2b8h8h8h8h8g8g8g8g8f8f2d2d2d2d8f8f2d2d7i7i3a3a3a3a7i7i7h7h3b3b7h7h3b3b7g7g3c3c3c3c7g7g3c3c7f7f3d3d3d3d7f7f7f7f6i6i4a4a6i6i6h6h4b4b4b4b6h6h4b4b6g6g4c4c4c4c6f6f4d4d4d4d6f6f4d4d6f6f
2bc9i9i1a1a9i9i9g9g1c1c9g9g1c1c9f9f1d1d1d1d8i8i8i8i8h8h2b2b2b2b8f8f2d2d7i7i7h7h3b3b3b3b7h7h3b3b7g7g3c3c7f7f3d3d3d3d7f7f3d3d6i6i4a4a4a4a6h6h4b4b6g6g6g6g6f6f4d4d

การแสดง:

anim = Reap[Fold[Function[{m, i}, 
 If[i > 9, (Sow@Grid[#, Background -> {i - 9 -> Pink, None}] & /@ {m, #}; #) &@
   Transpose@MapAt[Reverse, Transpose@m, i - 9], (Sow@Grid[#, 
         Background -> {None, i -> Pink}] & /@ {m, #}; #) &@
   MapAt[Reverse, m, i]]], M, IntegerDigits[FromDigits[S, 36], 36]]];

ListAnimate[Join[{#, #} &@Grid@M, anim[[2, 1]], {#, #} &@Grid@anim[[1]]], 5]

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

สตริงการป้อนข้อมูลiสามารถสร้างแบบสุ่มโดย

M = Array[Mod[8 + ##, 9, 1] &, {9, 9}];
(M[[#]] = Reverse@M[[#]]; M[[All, #2]] = Reverse@M[[All, #2]];) & @@@
   RandomInteger[{1, 9}, {10000, 2}];
i = ToString /@ # <> "\n" & /@ M <> ""

การอภิปรายสั้น ๆ

  • การพลิกสามารถแลกเปลี่ยนได้เพียงองค์ประกอบเหล่านี้ ("สี่เท่า"):

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

  • มันเป็นไปได้ที่จะแลกเปลี่ยนองค์ประกอบเหล่านี้แยกต่างหากจากองค์ประกอบอื่น ๆ เฉพาะในกรณีที่ลำดับเริ่มต้นและคำสั่งสุดท้ายมีลายเซ็นเดียวกัน

  • การพลิกขององค์ประกอบทั้งสี่นี้ก่อให้เกิดกลุ่มสลับกันของระดับ 4 (= กลุ่มการหมุนของเททราฮีด) องค์ประกอบของกลุ่มนี้ทุกองค์ประกอบประกอบด้วยองค์ประกอบที่สร้าง 2 ดังนั้นหากเรารู้ตำแหน่งเริ่มต้นและสุดท้ายเราสามารถย่อยสลายการแปลงที่สอดคล้องกันเป็นการรวมกันของการพลิกง่าย

รายละเอียด

เพื่อความเป็นนักกีฬาฉันโพสต์รายละเอียดก่อนที่จะจบการแข่งขัน!

M=ToCharacterCode@StringSplit@i-48;

แปลงสตริงเพื่อเมทริกซ์iM

S="";s=Signature;H=(S=S<>{#,#2+9}~IntegerString~36)&;

Sเราจะผนวกตัวอักษรที่จะ ตอนนี้มันเป็นสตริงที่ว่างเปล่า H[i,j]จะเพิ่มอักขระi( 1,2,3,...,9) และอักขระj( a,b,c,...,iใน base-36)

A=(m=M〚##〛)-9Mod[m+##,2]&[s@{2#3,5}#,2#2#3~Mod~2-#2]&~Array~{4,4,4};

ฉันแปลงองค์ประกอบเป็น

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

เพื่อรับเมทริกซ์เป้าหมายในรูปแบบต่อไปนี้

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

จากนั้นมีสองขั้นตอนหลักในอัลกอริทึมของฉัน

  1. ค้นหาการพลิกเพื่อให้ได้ลายเซ็นเหมือนในเมทริกซ์เป้าหมาย (เช่นลายเซ็นของ{-7,-1,1,7}คือ1และลายเซ็นของ{-6,2,-2,6}คือ-1):

    u=s/@Join@@A;
    H@@({k,l}=#&@@@#~Position~1&/@{v=u〚13;;〛;{h=#2u〚2〛,-#u〚5〛,-#u〚9〛}&@@v,v〚4〛=u〚4〛h;v});
    A〚k〛=A〚k,;;,{2,1,3,4}〛;A〚;;,l〛=A〚;;,l,{3,2,1,4}〛;
    
  2. หมุนทุก "สี่เท่า" เพื่อรับลำดับที่ถูกต้อง:

    MapIndexed[4#≠#4&&H@@@If[#2<3,#0[#3,#,#2,#4];k,#0[#,#3,#4,#2];10-k]&@@
    If[s@#<0,#〚{1,3,2,4}〛,#]&@Ordering[k={#2,#2};#]&,A,{2}];
    

    มันเป็นส่วนที่ไม่สำคัญที่สุดของอัลกอริทึม ยกตัวอย่างเช่นการเปลี่ยนแปลง1b1bจะแปลงไป{-7,-1,1,7} {-1,1,-7,7}การเปลี่ยนแปลงที่9h9hจะแปลงไป{-7,-1,1,7} {-7,7,-1,1}ดังนั้นเราจึงมีสองแผนที่

    {1,2,3,4} -> {2,3,1,4}
    {1,2,3,4} -> {1,4,2,3}
    

    และเราต้องการแปลงคำสั่งโดยพลการ{x,y,z,w}ให้{1,2,3,4}เป็น วิธีการง่ายๆคือ (ยกเว้นการค้นหาแบบสุ่ม)

    repeat   
    {x, y, z, w} -> If[z < 3, {y, z, x, w}, {x, w, y, z}]
    until {1,2,3,4}
    

    ฉันไม่สามารถพิสูจน์ได้ แต่ใช้งานได้!

ขั้นตอนสุดท้ายคือ

M〚5,1〛<5&&5~H~{};M〚1,5〛<5&&{}~H~5;S

มันทำการพลิกเล็กน้อยของแถวกลางและคอลัมน์กลางแล้วส่งคืนผลลัพธ์


@Gareth ฉันสามารถใช้ตัวอักษรขนาดเล็กในผลลัพธ์ได้หรือไม่ มันช่วยฉันได้จำนวนอักขระ
ybeltukov

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

แค่อยากรู้อยากเห็น - ประสิทธิภาพของวิธีการของคุณคืออะไร? คุณทดสอบอินพุตที่สร้างจากการโยนหลายพันครั้งหรือไม่
SergeyS

@SergeyS ใช่มันจะใช้เวลาประมาณ 50 มิลลิวินาที :)
ybeltukov

@ กาเร็ ธ ฉันเขียนโปรแกรมใหม่คุณสามารถตรวจสอบผลลัพธ์ได้หรือไม่? การทดสอบของฉันแสดงให้เห็นว่าทุกอย่างถูกต้อง
ybeltukov

7

J 487 438

q=:3 :'(>:9|+/~i.9)=/&((,{;/(,.8&-)y){])g'
l=:2 :0
:
o=:o,(m+x){a.
x&(|.@{`[`]})&.v y
)
r=:49 l]
c=:97 l|:
w=:2 :'g=:4 v^:(4=(<m){g)g'
p=:_1=C.!.2@,@:I.@q
t=:2 :'for_i.>:i.3 do.g=:i v^:(p m*i)g end.'
z=:2 :0
'i j I J'=.y,8-y
g=:".'(',(,' ',.,(I.m{q y){,;._1 n),'])^:2 g'
)
d=:3 :0
g=:9 9$".,_ list,' ',.y
o=:''
0 4 w c
4 0 w r
0 1 t c
g=:0 c^:(-.(p 1 0)=p 1 2)g
1 0 t r
for_k.>,{;~i.4 do.0 z';;jcir;irjc;Irjc'k
3 z';;IrJc;JcIr;'k end.o
)

d เป็นคำกริยาที่ใช้สตริงกริดในรูปแบบที่ระบุและส่งกลับสตริงโซลูชันในรูปแบบที่ระบุ

ตัวอย่างการใช้:

   d '987654321',LF,'234567891',LF,'345678912',LF,'456789123',LF,'567891234',LF,'678912345',LF,'789123456',LF,'891234567',LF,'912345678'
bcda2341a1a1b1b1c1c1d1da2a2b2b2c2c2d2d2a3a3b3b3c3c3d3d3a4a4b4b4c4c4d4d4

ตอนนี้ยอมรับประเภทการขึ้นบรรทัดใหม่

วิธีแก้ปัญหาสำหรับกริดทดสอบ:

b3a1a11b1bc9c99g9gd9d99f9fb8b8f8f87i7i7h7hc3c3g7g77f7fa6a64b4bh6h6c4c4g6g6d6d6f6f6
cd24a9a91c1c1d1d9f9fa2a2i8i88h8hc2c2g8g82d2d3b3bh7h7d3d37f7fa6a64b4bg6g64d4d6f6f
bc2a9a99i9ic1c1g9g91d1df9f9i8i8b2b2h8h82c2cd8d87i7ib3b3c7c7d3d34a4ai6i6b6b6g6g6d6d6

ฉันค่อนข้างใหม่สำหรับ J; สิ่งนี้อาจจะสามารถเล่นกอล์ฟได้ดียิ่งขึ้น


การตรวจสอบกริดที่ไม่ถูกต้อง / ไม่สามารถแก้ไขได้นั้นจะเกิดบทลงโทษ 123 ตัว ฉันไม่คิดว่าคำตอบอื่น ๆ ในวันที่มีการตรวจสอบข้อผิดพลาดดังกล่าว

หากต้องการทำเช่นนั้นให้เปลี่ยนบรรทัดแรกของdเป็น:

if.-.+./89 90=#y do.0 return.end.if.-.*./(/:~y)=/:~(#y)$'123456789',LF do.0 return.end.g=:9 9$".,_ list,' ',.y

และบรรทัดสุดท้ายของสิ่งนี้:

3 z';;IrJc;JcIr;'k end.if.*./,g=>:9|+/~i.9 do.o return.end.0

ฉันเลือกที่จะส่งคืน0ข้อผิดพลาดเช่นการคืนสตริงว่างจะแยกไม่ออกจากการแก้ไขกริดที่ถูกแก้ไขอย่างสมบูรณ์ โปรดทราบว่านี่จะถือว่าบรรทัดใหม่ของ UNIX (อีกครั้ง)


ขอแสดงความยินดีคุณเพิ่งจะเป็นผู้นำ :-)
Gareth

ดูเหมือนว่าการป้อนข้อมูลของคุณไม่ใช่หนึ่งสตริงตามกฎหรือฉันพลาดอะไรบางอย่าง
SergeyS

@SergeyS: คุณอาจสับสน เท่าที่ฉันรู้ J ไม่มีทางหนี (เช่นการขึ้นบรรทัดใหม่) ในสตริงตัวอักษร การก่อสร้าง 'a', LF, 'b' ใน J คล้ายกับ "a" + "\ n" + "b" ในภาษาที่ + ทำงานเพื่อผนวกสตริง
AlliedEnvy

ตกลงมันสมเหตุสมผลกว่าขอบคุณ
SergeyS

ฉันเพิ่งอ่านหัวข้อในไฟล์จากหนังสือ APL ปี 1962 และฉันคิดว่า @AlliedEnvy นั้นถูกต้อง นี่คือลักษณะที่ข้อมูลจะปรากฏต่อโปรแกรมหากอ่านจากไฟล์ในรูปแบบของคำถาม LFs แทนพาร์ทิชันของแฟ้มลำดับ
luser droog

5

C # 540 399

เอาล่ะประสิทธิภาพที่เสียสละ (ตอนนี้ใช้เวลาสูงสุด 30 วินาที) นำเสนอตัวแปรแบบไดนามิกตรรกะการแก้ปัญหาที่เปลี่ยนไปเล็กน้อย และใช่ตอนนี้คาดว่าอินพุตเป็นหนึ่งสตริงที่มีตัวแบ่งบรรทัด (ตามที่กำหนดในกฎ)

แน่นอน C # ไม่มีฟังก์ชั่นทางคณิตศาสตร์ที่กำหนดไว้ล่วงหน้าดังนั้นจึงยากที่จะต่อสู้กับพวก Mathematica อย่างไรก็ตามนี่เป็นความท้าทายที่ยิ่งใหญ่ขอบคุณผู้เขียน!

string S(string _){for(i=0,e=1>0;e;){
for(h=v=j=0;j<89;)m[j/10,j%10+9]=_[j++]-49;a="";
for(j=i++;j>0;v++,j/=2)if(j%2>0)F(v);
for(;h<9&(h<4|!e);h+=j/36,j%=36)if((e=m[h,g=j++%9+9]!=(t=(h+g)%9))|m[v=8-h,g]==t){F(v);F(g);F(v);F(g);}
}return a;}void F(int z){for(f=z<9;++l<9;)m[0,l]=m[f?z:l,f?9+l:z];for(;l-->0;)m[f?z:l,f?9+l:z]=m[0,8-l];a+=(char)(z+=f?49:56);}
dynamic h,v,i,j,e,t,l=-1,g,a,m=new int[9,19],f;

ตารางทดสอบ:

3B9A9A9B9B9C9C9D9D9F9F9G9G9H9H9I9I9B9B9C9C9D9D9F9F9G9G9H9H9C9C9D9D9C9C9D9D8B8B8F8F8H8H8B8B8F8F8B8B8H8H7B7B7C7C7F7F7H7H7I7I7H7H6A6A6B6B6C6C6D6D6F6F6H6H6A6A6B6B6D6D6F6F6D6D6D6D6F6F5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I

13AB9A9A9B9B9F9F9H9H9A9A9B9B9H9H9I9I8B8B8D8D8F8F8G8G8H8H8I8I8B8B8G8G8H8H8I8I8H8H7A7A7B7B7C7C7D7D7F7F7G7G7I7I7A7A7D7D7F7F7I7I7F7F6A6A6B6B6C6C6D6D6F6F6G6G6H6H6I6I6A6A6C6C6F6F6I6I6A6A6A6A5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I

2BC9A9A9C9C9D9D9F9F9A9A9D9D9I9I8B8B8D8D8H8H8I8I8B8B8D8D8I8I7B7B7C7C7D7D7F7F7G7G7H7H7I7I7C7C7C7C7G7G6A6A6B6B6D6D6F6F6G6G6I6I6A6A6B6B6D6D6G6G6D6D6F6F5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I

โซลูชันเก่า (540)

ทำงานในเวลาไม่ถึงวินาทีในอินพุตใด ๆ (ทดสอบบนกริดที่สร้างแบบสุ่มนับพัน) ความยาวสูงสุดของสตริงเอาท์พุทคือ 165 (เริ่มแรกกริดใด ๆ ถูกแก้ไขในไม่เกิน 82 พลิก แต่ในระหว่างการเล่นกอล์ฟฉันเสียสละสิ่งนี้)

string S(string[]_){for(i=0;i<1<<18;){
for(j=0;j<81;)m[j/9+49,j%9+65]=_[j/9][j++%9]-49;a="";char g,h='1',v='9',b,x=h,y;
for(j=i;j>0;x=x==v?'A':++x,j/=2)if(j%2>0)F(x);j=i+1;
for(i+=1<<19;h<58;h++,v--)for(g='A',b='I';g<74;g++,b--){
t=(h+g-6)%9;e=m[h,g];q=m[v,g];i=h>52&t!=e?j:i;
if(e!=t|q==t){x=q==t?v:g;y=q==t?g:v;
if(m[h,b]==t){x=b;y=h;}
F(x);F(y);F(x);F(y);}}}return a;}
void F(char z){var f=z<65;for(l=0;l<4;l++){n=m[d=f?z:49+l,s=f?65+l:z];m[d,s]=m[o=f?z:57-l,u=f?73-l:z];m[o,u]=n;}a+=z;}
int i,j,q,e,t,l,s,d,n,u,o;int[,]m=new int[99,99];string a;

คำตอบสำหรับตัวอย่างที่ 1:

15A5A5B5B5C5C5D5DE5E55F5F5G5G5H5H5I5I

คำตอบสำหรับตัวอย่างที่ 2:

19AI1I1H1H1G1G1F1F19F9F9G9G9H9H9I9I8A8AI8I87A7AI7I76A6AI6I65A5A5B5B5C5C5D
5DE5E55F5F5G5G5H5H5I5I

คำตอบสำหรับตัวอย่าง 3:

129AI1I1H1H1G1G1F1F19F9F9G9G9H9H9I9I8A8AI8I87A7AI7I76A6AI6I65A5A5B5B5C5C5
D5DE5E55F5F5G5G5H5H5I5I

คำตอบสำหรับสี่เหลี่ยมทดสอบ:

346B9A9AH1H1C9C9D9D99F9F9G9GH9H99I9IB8B8F8F87B7B7C7C7F7FH7H77I7I6A6A6B6BC6C66D6DG6G6H6H66I6I5A5A5B5B5C5C5D5DE5E55F5F5G5G5H5H5I5I

1346ABA9A9H1H19F9FH9H99I9IH2H28D8D8F8FG8G8I8I8I3I37B7B7C7CF3F37G7GI7I7H4H4D6D66F6F5A5A5B5B5C5C5D5DE5E55F5F5G5G5H5H5I5I

2BCA9A99C9CF1F19F9F9I9IH2H2D8D88H8HI8I87B7BC7C77D7D7F7F7H7H7I7II4I4B6B6D6D6G6G66I6I5A5A5B5B5C5C5D5DE5E55F5F5G5G5H5H5I5I

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

Aha! ฉันพบสิ่งที่เกิดขึ้นที่นี่! คำตอบที่คุณได้รับดูเหมือนจะเป็นคำตอบของตัวอย่างทั้ง 3 ไม่ใช่สามกริดการทดสอบ (ซึ่งลดลงในคำถาม) พวกเขาเป็นจริงการแก้ปัญหาที่ถูกต้องเพื่อกริดเหล่านั้นแม้ว่าพวกเขาจะค่อนข้างบิตนานกว่า1, Aและ2Iซึ่งเป็นโซลูชั่นที่ง่าย - แต่ที่ไม่จริงเรื่องตั้งแต่ฉันไม่ได้ตัดสินเกี่ยวกับระยะเวลาในการแก้ปัญหาตาราง :-) ถ้าคุณสามารถแก้ไขได้ และให้คำตอบสำหรับ 3 กริดการทดสอบ (ฉันจะดูว่าฉันจะได้ทำงานบน Mac ของฉันตอนนี้) ฉันสามารถให้ +1 ของคุณ
Gareth

@ Gareth - อุ๊ปส์ฉันพลาดคำตอบสำหรับการทดสอบกำลังสองขอบคุณที่ชี้ให้เห็น ฉันได้เพิ่มพวกเขาตอนนี้ในคำตอบของฉัน
SergeyS

ยอดเยี่ยมขอบคุณสำหรับสิ่งนั้น ทุกอย่างผ่านการตรวจสอบแล้ว Xamarin จะไม่ทำงานบน Mac ของฉันด้วยเหตุผลบางอย่างดังนั้นฉันจะต้องทดสอบโปรแกรมในที่ทำงานในเวลาไม่กี่ชั่วโมง
Gareth

@Gareth - จริงๆแล้วไม่มีอะไรพิเศษสำหรับ C # ในรหัสนั้นใคร ๆ ก็สามารถแปลงมันเป็น Java หรือแม้แต่ C ++ โดยไม่ต้องเจ็บปวดมากและ ... golf ตัวละครบางตัวออกมาจากมัน :) นอกจากนี้ยังสามารถแปลงเป็น GolfScript หรืออะไรอีกมากมาย รัดกุม - อาจปรากฏสั้นกว่านี้สองครั้งหรือมากกว่า;)
SergeyS
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.