แผ่นตัวอักษรสำหรับเด็กของฉันถูกจัดกลุ่มตามสีอย่างเหมาะสมหรือไม่?


14

ลูก ๆ ของฉันมีแผ่นตัวอักษรเพื่อเล่นด้วยเช่นนี้:

เสื่อตัวอักษร

หลังจากหลายเดือนที่วางแผ่นกระเบื้องแบบสุ่มฉันก็เหนื่อยและวางกระเบื้องทั้งหมดของเสื่อที่จัดกลุ่มตามส่วนต่าง ๆ ตามสีพื้นหลังของพวกเขา ดังนั้นถ้าตัวอักษรแสดงสีพื้นหลังฉันได้เสื่อแบบนี้:

AABBCDDDE
ABBCCCDEE
ABCCCCDDE
AACCCDDEE
AAAACCCCE
AAAAAACCC

ดังนั้นสำหรับสี A, B, C, D และ E มักจะมีวิธีการเชื่อมต่อกระเบื้องทั้งหมดด้วยสีพื้นหลังเดียวกันทั้งแนวนอนหรือแนวตั้งในเสื่อ นั่นคือสิ่งที่ฉันเรียกเสื่อที่จัดกลุ่มตามสีอย่างเหมาะสม คุณสามารถดูกลุ่มสำหรับตัวอย่างก่อนหน้าในตารางต่อไปนี้:

AA
A
A
AA
AAAA
AAAAAA

  BB
 BB
 B

    C
   CCC
  CCCC
  CCC
    CCCC
      CCC

     DDD
      D
      DD
     DD

        E
       EE
        E
       EE
        E

นอกจากนี้มีเพียงกลุ่มเดียวสำหรับทุกสีดังนั้นสิ่งนี้จะไม่ถูกต้อง:

ABA
ABA

เนื่องจากสี A ไทล์ไม่ได้ถูกจัดกลุ่มในกลุ่มเดียวเท่านั้น สิ่งนี้จะไม่ถูกต้องเนื่องจากไทล์ไม่เชื่อมต่อทั้งแนวนอนหรือแนวตั้ง:

AB
BA

ความท้าทาย

กำหนดอาร์เรย์ 2 มิติของอักขระในช่วง ASCII ที่พิมพ์ได้ (ไม่จำเป็นต้องเป็นสี่เหลี่ยมจัตุรัสตราบใดที่ขนาดของมิติทั้งสองเท่ากับหรือมากกว่า 1) ตรวจสอบว่าอาร์เรย์แสดงmat ที่จัดกลุ่มสีอย่างถูกต้องหรือไม่ (อักขระแต่ละตัวที่แตกต่างกันในอาร์เรย์แทนสีที่ต่างกัน) อินพุตอาจอยู่ในรูปแบบที่สมเหตุสมผลตราบใดที่มันแทนอาร์เรย์ 2 มิติของอักขระ (อาร์เรย์ถ่าน 2 มิติอาร์เรย์ของสตริงที่มีความยาวเท่ากันเป็นต้น) และเอาต์พุตต้องเป็นคู่ของค่าจริงและเท็จ (0 / 1, 't' / 'f', จริง / เท็จไม่ว่าอะไรก็ตามตราบเท่าที่บางสิ่งถูกส่งคืนและค่าส่งคืนมีความสอดคล้องกันในอินพุต)

นี่คือโค้ดกอล์ฟดังนั้นโปรแกรม / ฟังก์ชั่น / วิธีการ / แลมบ์ดาที่สั้นที่สุดสำหรับแต่ละภาษาจะชนะ!

ตัวอย่าง

A    truthy

AB
AB   truthy

AB
BA   falsey

ABCDE    truthy

ABCDC    falsey

**::dd22
***:d222
*:::::22    truthy

$$$%%%&&
$$%%&&&&
&&$$$%&&    falsey

AABBCDDDE
ABBCCCDEE
ABCCCCDDE
AACCCDDEE
AAAACCCCE
AAAAAACCC   truthy

AABB
ABBA
AAAA    truthy

AAAB
AAAA
AAAA    truthy

เสื่อของฉันจัดกลุ่มตามสีอย่างเหมาะสม

เสื่อของฉันจัดกลุ่มตามสีอย่างเหมาะสม

(ฉันยังต้องแก้ไขเส้นขอบเหล่านั้น ... )


1
เพราะเหตุใดคุณจึงไม่จัดเรียงเสื่อตามลำดับตัวอักษรและตัวเลข? ไม่มีอะไรเกี่ยวข้องกับการท้าทายแน่นอนเพียงแค่สงสัย
caird coinheringaahing

4
@cairdcoinheringaahing เพราะ OCD เฉพาะของฉันจะไม่พอใจ :-)
Charlie

3
ลูก ๆ ของคุณยังคงเป็นแรงบันดาลใจสำหรับความท้าทายกอล์ฟรหัส :-)
Luis Mendo

2
เหตุใดจึงต้องแสดงอักขระด้วยสีแทนที่จะเป็นอินพุตอื่น (เช่นจำนวนเต็มหรือพิกเซลบางที)
Jonathan Allan

2
เมื่อพูดถึง ocd ความท้าทายนี้จะไม่สมบูรณ์หากไม่มีภาพเสื่อจัดกลุ่มอย่างเหมาะสม
Jonah

คำตอบ:


6

MATL , 16 15 ไบต์

1e"G@=4&1ZI1>vzg

อินพุตเป็นอาร์เรย์ถ่าน 2D (โดยมีแถวคั่นด้วย;) เอาต์พุตคือ0ถ้าอินพุตมีคุณสมบัติหรือ1อย่างอื่น

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

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

ตัวอักษรซ้ำจะถูกประมวลผลซ้ำ ๆ (ซึ่งเป็น golfier กว่า deduplicating)

1e       % Implicit input. Reshape into a row vector of chars
"        % For each char
  G      %   Push input again
  @      %   Push current char
  =      %   Equal (element-wise)? Gives a matrix of zeros and ones, where one
         %   represents the presence of the current char
  4      %   Push 4. This will indicate 4-connectivity
  &1ZI   %   Matrix with labels of connected componnents. Inputs are a number (4)
         %   to indicate connectivity, and a binary matrix. The output is a matrix
         %   the same size as the input where each connected componnent of ones
         %   in the input is replaced by a different integer starting at 1
  1>     %   Greater than 1 (element-wise)? The result is a matrix. If the result 
         %   is true for some entry the input doesn't qualify
  v      %   Concatenate vertically with results from previous iterations
  z      %   Number of nonzero/true values
  g      %   Logical. Converts nonzero to true
         % Implicit end. Implicit display. False / true are displayed as 0 / 1

3

Befunge-93, 317 bytes

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

93+:10pv  +93p01+1g01_  v@.1<
gp00g1+>00p~1+:93+`!#^_1-00g10
50p93+:vv_v#!:gg03:p02:<>40p#
!`g01: <>\ 1+:vvp05:+<@^p03_^#
v93$_v# !- g00<4v04g<^1<vp06:<
>+\!\>\ 3v> 40v0>g-v^<.g>:70vp
07_v#:<^ >#+0# g#\<  10\v4gg<^
!#v _$^  g03p <\ v1_#:^5>0g  -
   <    ^ g02p1< >-:#^_^#:g05
-1<   ^p\g06\0\+1:\g06\-1:\g06:\+1g06:g07

พิมพ์ 1 เป็นความจริง 0 เป็นความเท็จ

ลองออนไลน์

นี่คือการแสดงภาพของเส้นทางที่ตัวชี้ใช้

สีแฟนซี!

หมายเหตุ: นี่สำหรับรุ่นเก่า


มันทำงานอย่างไร

นี่คือรหัสเทียมที่รวดเร็วและสกปรก

a = 2Darray() # from 12,12 down and to the right
arrayLocation = 12
x = arrayLocation #stored at 0,0
y = arrayLocation #stored at 1,0
i = input()       #stored in the stack
while (i != 0):
    if (i == 10):
        y++
        x = init
    else
        a[x][y] = i
        x++
    i = input

new.x = init    #stored at 2,0
new.y = init    #stored at 3,0

currentChar = 0    #stored at 4,0
chars = array()    #stored at 1,1 onwards
charnum = 0        #stored 5,0
ToCheck = array()  #stored in the stack

current.x = null   #stored at 6,0
current.y = null   #stored at 7,0

while (new.y < y):
    if (a[new] != 0)
        currentChar = a[new]
        toCheck[] = new
        while (toCheck)
            current = toCheck.pop()
            if (a[current] == currentChar)
                toCheck.append(adjacent(current))
                a[current] = 0
        foreach (chars as char)
            if (char == currentChar)
                return 0
        charNum++
        chars[charNum] = char
    new.x++
    if (new.x > x)
        new.x = init
        new.y++

return 1

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

สำหรับคนที่คุ้นเคยกับ Befunge นี่เป็นโค้ดที่เว้นระยะห่าง

96+:10p    v    +69p01+1g01_v
`+96:+1~p00<+1g00pg01g00-1_^#
v                           <
>40p50p96+:v                ^
v    @.1<  >
>:10g `#^_30p:20p:30gg:#v_$>1+:00g-!#v_0   >30g+
v                       <  ^         >$96+1^
>40p30gv                   ^
       >:!#v_70p:60p:70gg40 g-!#v_$>
           v               ^     > ^
1:\g06\+1:g 07\g07\-1:\g07\ +1: <^p\g06\0\-
v          <               ^
>50gv   >5\g1+:50p40g\1p20g^
    >:!#^_:1g40g-!#v_1-
                   >0.@

พูดตามตรงฉันรู้สึกว่าคุณควรนับมันเป็น 337 ไบต์ มิฉะนั้นคุณจะระบุขนาดของรหัสภายในไฟล์ได้อย่างไร ขึ้นบรรทัดใหม่ควรนับด้วย
NieDzejkob

@NieDzejkob ใช่ฉันได้เปลี่ยนวิธีนับไบต์และสอดคล้องกับสิ่งที่ TIO พูด นอกจากนี้ฉันมีนับบรรทัดผิดหรือเปล่า? บางทีพรุ่งนี้ฉันจะต้องทำให้สั้นลงอีกเล็กน้อย
คิงคิง

2

J, 66 ไบต์

c=.1=+/@,+.]-:]*[:*@+/((,|."1)0,.1 _1)&(|.!.0)
[:*/[:c"2[="_ 0~.@,

cกำหนดคำกริยาที่บอกคุณว่าเมทริกซ์ของค่าใดค่าหนึ่งหรือศูนย์คือc onnected มันถือว่าคนเดียวเป็นกรณีพิเศษของจริง มิฉะนั้นมันจะใช้จำนวนเพื่อนบ้านเป็นมุมฉากของทุกเซลล์แล้วเครื่องหมายของการนับนั้นแล้วคูณกับเมทริกซ์ดั้งเดิม: หากผลิตภัณฑ์นั้นเท่ากับเมทริกซ์ดั้งเดิมแสดงว่ามันเชื่อมโยงกัน

การนับเพื่อนบ้านทำได้โดยการเลื่อนใน 4 ทิศทางจากนั้นทำการสรุป การเลื่อน 4 ทิศทางทำได้โดยใช้คุณลักษณะ " x-arg can by a table" ของการหมุน / การเปลี่ยน|.

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

ลองออนไลน์!


2

JavaScript (ES6), 114 ไบต์

รับอินพุตเป็นอาร์เรย์ของสตริง ผลตอบแทนหรือ01

a=>(C={},F=x=>!C[c=a[y][x]]|(g=v=>(a[y+v]||[])[x]==c)(-1)|g(1)|g(0,x--)|g(0,x+=2)?a[y+=!c]?F(C[c]=c?x:0):1:0)(y=0)

กรณีทดสอบ

จัดรูปแบบและแสดงความคิดเห็น

a => (                            // given an array of strings a
  C = {},                         // C = object holding encountered characters
  F = x =>                        // F = recursive function taking x:
    !C[c = a[y][x]]               //   c = current character; is it a new one?
    | (g = v =>                   //   g = helper function taking v
        (a[y + v] || [])[x] == c  //       and testing whether a[y + v][x] == c
      )(-1)                       //   test a[y - 1][x]
    | g(1)                        //   test a[y + 1][x]
    | g(0, x--)                   //   test a[y][x - 1]
    | g(0, x += 2) ?              //   test a[y][x + 1]; if at least one test passes:
      a[y += !c] ?                //     increment y if c is undefined; if a[y] exists:
        F(C[c] = c ? x : 0)       //       update C, update x and do a recursive call
      :                           //     else:
        1                         //       all characters have been processed -> success
    :                             //   else:
      0                           //     invalid character detected -> failure
)(y = 0)                          // initial call to F, starting with x = y = 0

1

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

And@@(ConnectedGraphQ@Subgraph[GridGraph@Dimensions[t],Tr/@Position[c,#]]&/@(c=Join@@(t=#)))&

ลองออนไลน์!

จะเข้าเป็นรายการที่ 2 มิติของตัวละคร: {{"A","B"},{"C","D"}}ยกตัวอย่างเช่น

ตัวอักษร\[Transpose]ตัวอักษร

มันทำงานอย่างไร

สำหรับตัวละครแต่ละตัวcในการป้อนข้อมูลจะใช้เวลาSubgraphของGridGraphของที่เหมือนกันDimensionsเป็น input ซึ่งสอดคล้องกับทุกPositionที่เกิดขึ้นและการตรวจสอบถ้ามันเป็นcConnectedGraphQ



1

JavaScript (ES6), 181 ไบต์

(d,o={})=>{f=(i,j,c,l=d[i])=>{if(c&&l&&l[j]==c){l[j]='';f(i-1,j,c);f(i+1,j,c);f(i,j-1,c);f(i,j+1,c);o[c]=1}};d.map((e,i)=>e.map((c,j)=>o[c]||f(i,j,c)));return!d.some(e=>e.join(''))}

เมื่อใดก็ตามที่พบแถบสีใหม่ให้เติมสีที่เชื่อมต่อด้วยสตริงว่าง ถ้าแผ่นสีถูกจัดกลุ่มอย่างเหมาะสมสีทั้งหมดควรมีการเติมสตริงว่าง

รหัสทดสอบ


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