การตรวจสอบงูสัตว์เลี้ยง ASCII แนวนอน


22

เมื่อไม่นานมานี้มีสัตว์เลี้ยงงู ASCII สองตัวที่ท้าทาย (เช่นที่นี่ )

            0 0               
  0        0 0 000            
00 0     00       000 0      0
    000 0            0 0   00 
       0                000   

ความท้าทายนี้คือการนำงูสัตว์เลี้ยงแนวนอนที่สร้างขึ้นแบบสุ่ม (ความสูงห้าบรรทัดความยาว 30) และตรวจสอบว่า:

  • แต่ละคอลัมน์มีเพียงหนึ่งเดียว 0
  • แต่ละอัน0จะ "เชื่อมต่อ" กับ0ก่อนและหลัง (เว้นระยะแนวตั้งด้วย 0 หรือ 1 บรรทัดเท่านั้น)

ผลลัพธ์สุดท้ายอาจเป็นtrueหรือ1ถ้างูนั้นถูกต้องหรือfalseหรือ0ถ้างูไม่ถูกต้อง

แก้ไขชี้แจง

ถือว่าอินพุต:

  • เป็นสตริง
  • มีเฉพาะ '', '0' และ '\ n'
  • แต่ละบรรทัดมีอักขระ 30 ตัว
  • มี 5 บรรทัด

นั่นคือการตรวจสอบว่ามีการเชื่อมต่องูและไม่มีตัวอักษรหลงทาง ไม่จำเป็นต้องตรวจสอบ "ผ้าใบ" ที่พิมพ์บนงู


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

5
สิ่งนี้ถูกใช้เป็นแบบต่อยหรือไม่? หรือมันสามารถใส่เป็นอาร์เรย์ 2d?
JSchiff

6
เรารับประกันได้หรือไม่ว่าการป้อนข้อมูลประกอบด้วย 0 และช่องว่าง? ทุกบรรทัดมีความยาว 30 หรือไม่? มี 5 เส้นไหม?
xnor

9
ตั้งแต่นี้เป็นปัญหาการตัดสินใจอย่างไรtruthy/falseyมากกว่าtrue/false?
Jonathan Allan

3
@JSchiff ฉันแน่ใจว่าเป็น Bytes Snake?
MarioDS

คำตอบ:


14

JavaScript (ES2018) 62 54 ไบต์

s=>!/0(.{30}|.{60,62}(.{31})*)0|( .{30}){4} /s.test(s)

อินพุตเป็นสตริงเดี่ยว:

  • โดยไม่ต้องขึ้นบรรทัดใหม่
  • มีที่ว่างเท่านั้น '0' และ '\ n'
  • 30 ตัวอักษรในแต่ละบรรทัด 5 บรรทัดรวม 154 ตัวอักษร

ตั้งค่าสถานะsหมายถึงจุดที่ตรงกับสิ่งใด ๆ (รวมถึง '\ n') ปัจจุบันคุณลักษณะนี้รองรับ Chrome 63+, Opera 50+, Safari 11.1+ ตามตารางที่ใช้งานร่วมกันได้ คุณสามารถทดสอบฟังก์ชันนี้ด้วยเบราว์เซอร์ที่รองรับเหล่านี้ คุณจะได้รับข้อยกเว้นเมื่อโหลดหน้าเว็บหากเบราว์เซอร์ของคุณไม่รองรับคุณสมบัตินี้

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

  • ไม่มีคอลัมน์ที่ไม่มี0:
    • ไม่เข้ากัน /( .{30}){4} /
  • ไม่มีสอง0s ในหนึ่งคอลัมน์:
    • ไม่เข้ากัน /0.{30}(.{31})*0/
  • ไม่0ได้เชื่อมต่อกับประเทศเพื่อนบ้าน:
    • ไม่ตรงกับ/0.{60}(.{31})*0/,/0.{62}(.{31})*0/

รวม regex เหล่านี้ทั้งหมดแล้วคุณจะได้อันนี้

ขอบคุณ Martin Ender ชี้ให้เห็นว่าตัวดำเนินการเดียว!อาจบันทึก 8 ไบต์


8

SnakeEx , 51 ไบต์

เห็นได้ชัดว่านี่เป็นภาษาที่เหมาะสมสำหรับงาน : D ^

s:({c<L>}{c<R>}0[(<R> <L>)(<L> <R>)_?])%{30}
c:0 *$

จับคู่อินพุตทั้งหมดหากเป็นงูที่ใช้ได้ ไม่สามารถจับคู่ได้หากไม่ใช่ ลองที่นี่!

คำอธิบาย

SnakeEx เป็น2-D ภาษารูปแบบที่ตรงกัน โปรแกรมประกอบด้วยรายการคำจำกัดความของ "งู" ซึ่งคลานไปรอบ ๆ ตัวละครที่เข้ากันการเปลี่ยนทิศทางและวางไข่งูอื่น ๆ ในโปรแกรมของเราเรากำหนดสองงูและsc

เราจะเริ่มด้วยcเพราะมันง่ายกว่า คำจำกัดความของมันคือ0 *$ซึ่งควรอ่านได้ค่อนข้างมากถ้าคุณรู้จัก regex: match 0ตามด้วยศูนย์เว้นวรรคหรือมากกว่าตามด้วยขอบของกริด จับหลักที่นี่: การจับคู่นี้สามารถดำเนินการในทิศทางใดก็ได้ เราจะใช้cทั้งขึ้นและลงจากงูเพื่อตรวจสอบว่าไม่มีรายการพิเศษ0ในแต่ละคอลัมน์

ตอนนี้สำหรับงูหลัก, s. มันใช้รูปแบบ(...)%{30}ซึ่งหมายถึง "จับคู่เนื้อหาของวงเล็บ 30 ครั้ง" - หนึ่งครั้งสำหรับ0งูแต่ละตัว จนถึงตอนนี้ดีมาก ภายในวงเล็บคืออะไร

{c<L>}

สิ่งนี้วางไข่เป็นcงูตัวใหม่หันซ้าย 90 องศา ทิศทางนั้นสัมพันธ์กับsทิศทางของงูดังนั้นงูใหม่จึงเคลื่อนไปทางด้านบนของตาราง (งูหลักกำลังเคลื่อนที่ไปทางขวา) cตรวจสอบงูว่าเซลล์ตารางปัจจุบันเป็น0และว่าเซลล์เหนือทุกพื้นที่ หากล้มเหลวการแข่งขันทั้งหมดจะล้มเหลว หากประสบความสำเร็จเราก็ดำเนินการต่อไป

{c<R>}

ซึ่งทำสิ่งเดียวกันเลี้ยวขวาเท่านั้น (ไปทางด้านล่างของกริด)

โปรดทราบว่าการวางไข่เหล่านี้จะไม่ส่งผลกระทบต่อตำแหน่งของตัวชี้การจับคู่ในงูหลัก พวกมันเหมือน lookaheads ใน regex (บางทีที่นี่เราสามารถเรียกพวกเขาว่า "lookbesides"?) ดังนั้นหลังจากตรวจสอบว่าเรากำลังชี้ไปที่0และส่วนที่เหลือของคอลัมน์มีช่องว่างเท่านั้นเราต้องตรงกับ0:

0

0ตอนนี้ตัวชี้การแข่งขันที่อยู่บนตัวอักษรไปทางขวาของ เราจำเป็นต้องตรวจสอบสามตัวเลือกที่แตกต่างกัน: มุมงูลง, มุมงูขึ้นหรืองูไปตรง สำหรับสิ่งนี้เราสามารถใช้นิพจน์ OR:

[...]

ภายใน OR ของเราเรามีความเป็นไปได้สามประการ:

(<R> <L>)

เลี้ยวขวาจับคู่ช่องว่างแล้วเลี้ยวซ้ายอีกครั้ง (มุมงูลง)

(<L> <R>)

เลี้ยวซ้ายจับคู่ช่องว่างแล้วเลี้ยวขวาอีกครั้ง (มุมงูขึ้น)

_?

จับคู่ขีดเส้นใต้หนึ่งขีดหรือหนึ่งขีด เนื่องจากไม่มีการขีดเส้นใต้ในอินพุตสิ่งนี้จะเป็นการจับคู่ที่ว่างเปล่าเสมอ (งูพุ่งตรง)

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


2

CJam , 35 34 ไบต์

{z_{'0e=1=}%:*\'0f#2ew::-[W0X]-!*}

ลองออนไลน์! อินพุตเป็นอาร์เรย์สี่เหลี่ยมของอาร์เรย์ของอักขระ ถือว่าการป้อนข้อมูลมีเพียงและ 0

คำอธิบาย:

{z_{'0e=1=}%:*\'0f#2ew::-[W0X]-!*}   Function taking a character matrix:
 z                                      Transpose.
   {      }%                            Consider whether each row
      e=                                  contains
        1=                                exactly one
    '0                                    of the character '0'.
            :*                            This must be true for every row.
                  #                     Next, find the position
               '0                         of the character '0'
                 f                        at every row
  _           \                           in the original input.
                       :-               Find the differences between
                      :                   each
                   2                      pair
                    ew                    of adjacent elements (in other words, compute
                                            the increments).
                                        For the snake to be valid, this array of increments
                                            must only contain {0, 1, -1}, so
                              -         Remove from this list
                         [   ]            the elements
                          W                 -1,
                           0                0,
                            X               and 1,
                               !          and then check whether the array is empty.
                                *       The previous code tested two different properties
                                          of the matrix; they both must be true for a
                                          valid snake.

2

05AB1E , 18 ไบต์

ζDε0k}¥Ä2‹sεþg}ìPΘ

ลองออนไลน์!

คำอธิบาย

ζ                    # transpose
 D                   # duplicate
  ε  }               # for each row in the first copy (column of input)
   0k                # get the index of the first 0
      ¥Ä             # calculate absolute delta's
        2‹           # check that each is less than 2
          sε  }      # for each row in the second copy (column of input)
            þg       # calculate the length of the string with non-digits removed
               ì     # concatenate the lists
                P    # calculate product
                 Θ   # truthify (turn false values to 0)

2

Huskขนาด 12 ไบต์

ทั้งนี้ขึ้นอยู่กับการชี้แจงกฎอาจจะเป็น11 ไบต์หรือ13 ไบต์

±Λ=;1Ẋ×≈mηfT

ลองออนไลน์!

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

คำอธิบาย

±Λ=;1Ẋ×≈mηfT  Implicit input: a list of lines.
           T  Transpose into list of columns.
        m     For each column,
         ηf   get list of indices of truthy elements.
              In Husk, whitespace characters are falsy and other are truthy,
              so this gets us the indices of 0s on each column.
     Ẋ        For each adjacent pair of these index lists,
      ×       for all pairs drawn from the two lists,
       ≈      give 1 if they differ by at most 1, otherwise 0.
              For each adjacent pair, this produces a list of 1s and 0s.
 Λ            Do all of these lists
  =;1         equal [1]? Return either 0 or 30 (length of the outer list + 1).
±             Signum; convert to 0 or 1.

แนวคิดนี้ใช้×≈เพื่อรับประกันว่า (a) คอลัมน์ทั้งหมดมีหนึ่ง 0 อย่างแม่นยำและ (b) ตำแหน่งของพวกเขาแตกต่างกันมากที่สุด ยกตัวอย่างเช่นพิจารณาอินพุต 8 คอลัมน์

0  0  0 
 000 0  
  00   0

ก่อนอื่นให้mηfTแปลงเป็นรายการของดัชนี

[[1],[2],[2,3],[1,2,3],[],[2],[1],[3]]

จากนั้นẊ×≈ให้

[[1],[1,1],[1,1,0,1,1,1],[],[],[1],[0]]

แต่ละ1คู่สอดคล้องกับดัชนีที่แตกต่างกันไม่เกิน 1 และแต่ละ0คู่สอดคล้องกับคู่ที่ไม่ตรงกัน ผลลัพธ์แต่ละ[1]รายการมีค่าอย่างแม่นยำเมื่อรายการทั้งสองมีดัชนีเดียวและดัชนีต่างกันมากที่สุด 1


2

Python 2 , 71 ไบต์

f=lambda s:s[1]<' 'or'0'in s[::31]in' %s '%s[1::31]in'%6s'%0*2*f(s[1:])

ลองออนไลน์!

รับอินพุตเป็นสตริงหลายบรรทัด การทดสอบกรณีจาก Bubbler

คอลัมน์แรกจะถูกแยกเป็นs[::31]และที่สองเป็นs[1::31]และพวกเขาจะถูกตรวจสอบความถูกต้อง เราย่อsการลบตัวอักษรตัวแรกทำให้มีการตรวจสอบคอลัมน์คู่ที่ต่อเนื่องกัน

การตรวจสอบสำหรับสองคอลัมน์ใช้การผูกมัดการเปรียบเทียบของ Python สำหรับการinรวมเช็คหลายรายการ:

  • '0'in s[::31] ตรวจสอบว่าคอลัมน์แรกมีอย่างน้อยหนึ่งคอลัมน์ 0
  • s[::31]in' %s '%s[1::31]ตรวจสอบว่าคอลัมน์แรกเป็นสตริงย่อยของคอลัมน์ที่สองแซนวิชระหว่างสองช่องว่างซึ่งทำให้มั่นใจได้ว่าตำแหน่งของ0ได้เลื่อนที่ช่องว่างมากที่สุด
  • ' %s '%s[1::31]in'%6s'%0*20ตรวจสอบว่าคอลัมน์ที่สองมีอย่างหนึ่งมากที่สุด

ตอนจบ*f(s[1:])ยังบังคับให้คดีที่เรียกซ้ำเป็นจริง


ตอนนี้ฉันคิดแล้ว Python เป็นภาษาที่ยอดเยี่ยมสำหรับความท้าทาย "งู" เหล่านี้ : P
Moustache ปิด

2

C (GCC) ,246 245 232 215 212 ไบต์

#define F)exit(1);
#define L for(i=l=0;i<30;i++)
#define X b[7][i]
char b[8][31];k,j,l;main(i){for(;j++<5;){gets(b);L{if(i[*b]>47){if(X++F memset(b[j+1]+i-1,l=1,3);}else if(!X&b[j][i]F}k+=!!l;}if(k<5 F L if(!X F}

ลองออนไลน์!

คิดว่าฉันจะใช้ภาษาที่ฉันโปรดปราน (แม้ว่าฉันจะเห็นได้จากรายการอื่น ๆ ที่มีขนาดเล็กกว่ามันอาจจะไม่เหมาะสำหรับความท้าทายแบบนี้) และ C สิ่งที่ฉันสามารถจัดการได้ วิธีการของโปรแกรมในการแก้ไขปัญหานั้นค่อนข้างตรงไปตรงมาเพียงแค่มีการจิกไบต์จำนวนมาก ใช้งูบน stdin และให้ผลลัพธ์ในการส่งคืนค่าของ main (เช่นรหัสทางออก;ตามที่ร้องขอในปัญหา 0 หมายถึงงูที่ไม่ถูกต้องและ 1 ใช้ได้แม้ว่ารหัสการออกที่แปลกตามปกติสำหรับรหัสทางออก 0 เป็นงูที่ถูกต้องและ 1 เป็นงูที่ไม่ถูกต้อง) เมื่อขยายมาโครและพื้นที่ว่างบางส่วนนั้นมีลักษณะดังต่อไปนี้:

char b[8][31];l,j,k;                           //Declares a buffer to work in, initialized all to 0; l j and k default to int and as globals are init to 0
main(i) {                                      //This is run no-args, so argc is 1 and the undeclared type defaults to int.
  for (; j++ < 5;) {                           //Iterating over each row, 1-indexed for convenience accessing the buffer
    gets(b);                                   //Reads into b[0] because of stack array decl layout
    for (i = l = 0; i < 30; i++) {             //j and l both init each time we begin this overall loop
      if (i[*b] > 47) {                        //Did we read a zero?
        if(b[7][i]++) exit(1);                 //If the snake already had a zero in this column, fail out
        memset(b[j+1] + i-1, l = 1, 3);        //Expect them on the next row in the columns left and right of this one (also set l)
      } else if (!b[7][i] & b[j][i]) exit(1);  //If we didn't read a zero, and we had reason to expect one this row, and there wasn't already a zero in this column, fail out
    }
    k+=!!l;                                    //Adds 1 to k iff l is nonzero 
  } if (k < 5) exit(1);                        //If less than 5 rows had zeroes in them, fail out
  for(i = l = 0 ; i < 30; i++) {               //l isn't relevant in this loop but saves some bytes when sharing a macro with the other horizontal loop
    if(!b[7][i]) exit(1);                      //If any columns didn't have zeroes, fail out
  }                                            //Else, snake is valid. main default returns 0.
}

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

มันไม่ได้มีประสิทธิภาพเลย ( gets()เป็นเพียงจุดเริ่มต้น) และอินพุตจะต้องมีช่องว่างที่เกี่ยวข้องทั้งหมด (เช่นไม่มีช่องว่างต่อท้ายด้านซ้าย) และ gcc spews คำเตือนและบันทึกเกี่ยวกับการทำงานของ stdlib โดยปริยายประกาศและอื่น ๆ แต่ C ลาวี่.

นอกจากนี้ยังสมมติว่าหัวงูไม่จำเป็นต้องอยู่ในแถวกลางและงูที่ถูกต้องจะต้องมีอย่างน้อยหนึ่งศูนย์ในทุกแถว (เช่นไม่มีแถวของช่องว่างทั้งหมดในแถวป้อน 5) หากสิ่งหลังไม่ใช่ข้อกำหนดมันสามารถทำให้สั้นลงได้เล็กน้อย - ทุกอย่างที่เกี่ยวกับkและlในโปรแกรมสามารถตัดออกหรือแทนที่ด้วยรหัสไบต์ที่น้อยลงในกรณีนั้น

ขอบคุณ user202729 ประมาณ บันทึก 26 ไบต์


ยินดีต้อนรับสู่ PPCG! และไม่ต้องกังวลเกี่ยวกับโปรแกรมสั้นในภาษาอื่น
user202729

คุณสามารถเว้นช่องว่างระหว่าง#define Fและ)ถึง -1 ไบต์
user202729

นอกจากนี้เนื่องจากอินพุตมีเพียง\n(10), <space>(32) และ0(48) คุณสามารถตรวจสอบ==48ด้วย>47(-1 ไบต์) / คุณสามารถลบได้={0}เมื่อเริ่มต้นbถ้าตัวแปรเป็นระดับโลก สร้างพารามิเตอร์kglobal และia (untyped -> int) ของmain(ในตำแหน่งargcที่เป็น1)
user202729

ขอขอบคุณ! แก้ไขก่อนที่ฉันจะเห็นคำแนะนำหลัง; ฉันจะขีดทางของฉันผ่านพวกเขา ( iเช่นเดียวกับargcเป็นอัจฉริยะ) ร่างแรกของสิ่งนี้มีขนาดมากกว่า 400 ไบต์; ฉันใช้เวลานานพอที่จะลากมันลงไปสู่เป้าหมายส่วนตัวของฉันที่ 300 และ 256 จากนั้นจึงอาจมีวิธีที่จะทำให้ผอมลงฉันพลาด
SevenStarConstellation

ตัดสินใจที่จะทำให้k,jและlGlobals ทั้งหมดจะบันทึกเกี่ยวกับการมีแยกต่างหากintประกาศตระหนักแล้วค่าเริ่มต้นจะให้ฉันรับไปกับการออกจากชนิดออกทั้งหมด ขอบคุณอีกครั้ง!
SevenStarConstellation

1

MATL , 18 17 ไบต์

32>&fun30=wd|2<vA

อินพุตเป็นอาร์เรย์ถ่าน 2D ตัวละครที่ไม่ใช่ช่องว่างสามารถใช้สำหรับงู

ลองออนไลน์!

คำอธิบาย

32>      % Implicit input. Transform non-space into 1, space into 0
&f       % Push vector of row indices and vector of column indices of nonzeros
u        % Unique: vector of deduplicated entries
n        % Length
30=      % Does it equal 30? (*)
w        % Swap. Moves vector of row indices to top
d|       % Absolute consecutive differences
2<       % Is each value less than 2? (**)
v        % Concatenate results (*) and (**) vertically
A        % All: true if all entries are nonzero. Implicit display

1
สเป็คแสดงถึงความยาวของเส้นที่เป็น 30 รับประกันดังนั้นฉันคิดว่าคุณสามารถประหยัดได้ไม่กี่
Jonathan Allan

@JanathanAllan ขอบคุณ! ฉันใช้un30=เพื่อตรวจสอบว่าดัชนีคอลัมน์ทั้งหมดแตกต่างกันและไม่มีคอลัมน์ใดใน 30 คอลัมน์ว่างเปล่า บางทีฉันสามารถทดสอบสิ่งนั้นได้โดยตรง แต่ฉันไม่เห็นว่า
หลุยส์เมนโด


1

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

Zn⁶T€L€=1$$;FIỊ$$$Ạ

ลองออนไลน์!

-2 ไบต์ขอบคุณ Mr. Xcoder

คำอธิบาย

Zn⁶T€L€=1$$;FIỊ$$$Ạ  Main Link
Z                    Transpose the matrix of characters
                         (string -> list of chars in Jelly)
 n⁶                  != " " (vectorizing)
   T€                For each column, get (row) indices of snake parts
     L€=1$$          For each index list, is its length 1? (that is, exactly one snake part per column)
           ;     $   Append (helper part)
            FIỊ$$    helper part:
            F        flatten index list
             I       get increments/forward differences
              Ị      are the values insignificant? (|z| <= 1)
                  Ạ  Are these all true?

อินพุตเป็นรายการของสตริง


@ Mr.Xcoder Huh ล้มเหลวปัญหาเกี่ยวกับการแสดงสตริงของ Jelly lol แก้ไขโดย ungolfing the 1 byte
HyperNeutrino

1

เยลลี่ , (14? *) 13 ไบต์

Zn⁶T€z-IỊ0-¦Ȧ

ลิงก์ monadic ที่รับรายการห้าสาย * แต่ละความยาว 30 ประกอบด้วยช่องว่างและอักขระอื่น ๆ (เช่น0s) และส่งคืนจำนวนเต็ม (1 ถ้างูตามที่กำหนดไว้ 0 เป็นอย่างอื่น)

* หากอินพุตต้องเป็นสตริงเดี่ยว (รายการของอักขระ) จากนั้นเติม a เพื่อแยกสตริงที่ฟีดบรรทัด

ลองออนไลน์!

อย่างไร?

Zn⁶T€z-IỊ0-¦Ȧ - Link: list of lists of characters, Lines
Z             - transpose the lines -> columns
  ⁶           - literal space character
 n            - not equal? -> 0 where there were spaces and 1 where there were "0"s
   T€         - truthy indices for each -> e.g. [0,0,1,0,0] -> [3] or [0,1,1,0,0] -> [2,3]
              -                           note: [0,0,0,0,0] -> []
      -       - literal minus one
     z        - transpose with filler (-1) -> {valid: a single list of heights {top:1,...,bottom:5}
              -                              invalid: list of >1 lists, some of which contain -1
              -                                       ...OR an empty list (no 0s in the input at all)}
       I      - differences -> {up:-1; down:1; flat:0; invalid:-6,-5,...,-2,2,...4}
        Ị     - insignificant (abs(z)<=1) -? {up/down/flat:1; invalid:0}
           ¦  - sparse application///
         0    - ...action: literal zero
          -   - ...to indices: [-1] -> make penultimate list into a zero (when one exists)
            Ȧ - any & all -> when flattened:{empty or contains a 0:0; otherwise:1}

อ่าคิดว่าฉันจะลองทุกกรณีขอบขอบคุณสำหรับหัวขึ้น; จะต้องระบุที่อยู่ในภายหลัง
Jonathan Allan

@ LuisMendo หือและในการแก้ไขว่าฉันบันทึกสามดังนั้นขอบคุณอีกครั้ง!
Jonathan Allan

... เอ่อ แต่ฉันแนะนำคนอื่น แก้ไขสำหรับอีก 3 :(
Jonathan Allan

ไม่ใช่การนับไบต์ที่ไม่ดีแม้ว่า :-)
Luis Mendo

1

Stax , 20 bytes CP437

Å┴m▐◘5)ît╢V¼≥+╝╜►º½ê

24 ไบต์เมื่อคลายการแพค

LM{'0|Ic%vChm:-{Jh!f%29=

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

อาจไม่ใช่นักกอล์ฟที่ดีที่สุด แต่ฉันคิดว่าวิธีนี้แปลกใหม่และน่าสนใจ

คำอธิบาย

LM                          Load the input string as a 2d array of characters, and transpose it

  {         m               Map array with block
   '0|I                     Get all indices of substring "0"
       c%vC                 Map to nothing if the indices are not unique
           h                Otherwise map to the unique index

             :-             Take pairwise difference

               {   f        Filter array with block
                Jh!         Only keep 0, 1 and -1

                    %29=    Check whether the final array has exactly 29 elements

1

J , 38, 37 30 ไบต์

-8 ไบต์ขอบคุณ FrownyFrog

[:($e.~[:(-:*)2-/\])@:I.'0'=|:

ลองออนไลน์!


1
วิธีการเกี่ยวกับ[:(-:*)2-/\ตรวจสอบว่ามีความแตกต่างทั้งหมด -1, 0 หรือ 1
FrownyFrog

@ ฟรุตฟรายใช่เลยมันเป็นนักการตลาดที่ยอดเยี่ยมมาก! ขอขอบคุณ!
Galen Ivanov

@ FrownyFrog อืมฉันไม่ได้ตระหนักว่า ฉันจะพยายามแก้ไข ขอบคุณสำหรับการชี้ให้เห็นว่า
Galen Ivanov

1
[:(#@{.=[:(-:*)2-/\])@:I.'0'=|:
FrownyFrog

1
โอ้นี่ใช้ได้เช่นกัน[:($e.~[:(-:*)2-/\])@:I.'0'=|:
FrownyFrog

1

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

Zµi€”0IỊ;ċ€⁶=4ƊẠ

ลองออนไลน์!

สมมติว่าสตริงอินพุตจะมีเพียงช่องว่างและศูนย์เท่านั้น รับอินพุตเป็นรายการของสตริง (แต่ละตัวแทนบรรทัด) และเอาต์พุต1หากเป็นจริง0มิฉะนั้นจะเป็น

คำอธิบาย

Zµi€”0IỊ;ċ€⁶=4ƊẠ | Monadic full program.
Z                | Transpose.
 µ               | Start a new monadic chain.
  i€”0           | Retrieve the first index of 0 in each column.
      IỊ         | Check whether their increments are insignificant (element-wise).
        ;     Ɗ  | Append the result of the following:
         ċ€⁶     | In each list of characters, count the occurrences of a space.
            =4   | Check whether they equal 4 (returns a boolean array).
               Ạ | All. Check whether all the elements are truthy.


0

Python 2และPython 3 , 122 120 119 ไบต์

lambda s:s.count('0')<31and all(s[i-31*(i>30):31*(i<124)-~i:31].strip(' ')for i,x in enumerate(s,1)if' '<x)and' '<s[62]

ลองออนไลน์!

รูปแบบอินพุตเป็นสตริงที่มีความยาวหนึ่ง 154 (5 x 30 ตัวอักษร, บรรทัดใหม่ 4 บรรทัด):

'''
            0 0               
  0        0 0 000            
00 0     00       000 0      0
    000 0            0 0   00 
       0                000   '''[1:] # to exclude starting newline

ถ้าหัวไม่จำเป็นต้องเป็นแถวกลาง

ความต้องการหัวแถวกลางอยู่ในความท้าทายดั้งเดิม แต่ฉันพบว่าไม่ใช่ในกรณีนี้ (อย่างน้อยก็ไม่ได้กล่าวถึงอย่างชัดเจน)

Python 2และPython 3 , 124 123 ไบต์

lambda s:s.count('0')<31and all(s[i-31*(i>30):31*(i<124)-~i:31].strip(' ')for i,x in enumerate(s,1)if' '<x)and'0'in s[::31]

ลองออนไลน์!


แก้ไข:

  • ลดลง 2 ไบต์โดยการเปลี่ยนเท่ากับ (== ) เป็นความไม่เท่าเทียมกันสำหรับแต่ละรหัส
  • พบข้อผิดพลาดในรุ่นที่มีข้อ จำกัด น้อยกว่าและแก้ไข (โชคดีที่มันไม่น่ากลัวเกินไปดังนั้นฉันสามารถทำให้ทุกรุ่นมีความยาวเหมือนกัน) คุณสามารถดูกรณีทดสอบเพิ่มเติมได้ในลิงค์ TIO สองอันหลัง
  • พบ byte ห้อยต่องแต่งใน Py2 solution ทำให้all()เคล็ดลับไม่มีความหมายใน Py3 ดังนั้นผสานทั้งสองเวอร์ชัน

0

Excel (VBA), 68 ไบต์

ใช้หน้าต่างทันทีCell[A6]เป็นผลลัพธ์

[A1:AD5]="=CHOOSE(ROUND(RAND()+1,),0,"""")":[A6]="=COUNT(A1:AD5)=30"





0

งูหลาม 3 , 197 185 bytes

ใน command prompt do verify.py<snake.txtหรือใน bash docat snake.txt | python verify.pyหรือทุบตีทำsnake.txtไฟล์อยู่ที่ไหนที่มีงูที่จะตรวจสอบ

หากงูถูกต้องไม่มีอะไรจะถูกส่งออก ถ้ามันไม่ถูกต้อง Python จะเพิ่มข้อผิดพลาดของดัชนี

import sys
s=sys.stdin.read().split("\n")
x=0
exec('t,y="",0\nwhile y<5:t+=s[y][x];y+=1\ns+=[t];x+=1;'*30)
s=list(map(lambda l:len(l.rstrip()),s))
while y<35:"ee"[abs(s[y]-s[y+1])];y+=2

โอ้ไม่ได้สังเกตว่าผลลัพธ์ของฉันต้องเป็นจริงหรือเท็จ รหัสข้อผิดพลาดที่ส่งคืนจะถูกนับหรือไม่
MoustacheMoses

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