นับจำนวนคำไขว้


10

พิจารณากริดปริศนาอักษรไขว้มาตรฐาน 15 × 15 ต่อไปนี้

ตารางไขว้

เราสามารถแสดงสิ่งนี้ในรูปแบบ ASCII โดยใช้#สำหรับบล็อกและ(ช่องว่าง) สำหรับสี่เหลี่ยมสีขาว

     #    #    
     #    #    
          #    
   #   #       
###     ##   ##

     ##   #    
   #       #   
    #   ##     

##   ##     ###
       #   #   
    #          
    #    #     
    #    #     

ให้กริดไขว้ในรูปแบบศิลปะ ASCII ด้านบนกำหนดจำนวนคำ (ตารางด้านบนมี 78 คำเกิดขึ้นเป็นปริศนานิวยอร์กไทม์สของวันจันทร์ )

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

รายละเอียด

  • ข้อมูลที่ป้อนจะเป็นรูปสี่เหลี่ยมผืนผ้าที่มีอักขระ#หรือ(ช่องว่าง) โดยมีแถวคั่นด้วยบรรทัดใหม่ ( \n) คุณสามารถสันนิษฐานได้ว่าตารางที่ทำจาก 2 ใด ๆ ที่แตกต่างกันASCII พิมพ์ตัวอักษรแทนและ#
  • คุณอาจคิดว่ามีบรรทัดใหม่ต่อท้ายที่เป็นตัวเลือก การนับจำนวนอักขระต่อท้าย DO จะมีผลต่อจำนวนคำ
  • ตารางจะไม่สมมาตรเสมอไปและอาจเป็นช่องว่างหรือบล็อกทั้งหมด
  • โปรแกรมของคุณในทางทฤษฎีควรสามารถทำงานบนกริดได้ทุกขนาด แต่สำหรับความท้าทายนี้มันจะไม่ใหญ่กว่า 21 × 21
  • คุณอาจใช้กริดเป็นอินพุตหรือชื่อไฟล์ที่มีกริด
  • รับอินพุตจาก stdin หรืออาร์กิวเมนต์บรรทัดรับคำสั่งและเอาต์พุตไปยัง stdout
  • หากคุณต้องการคุณอาจใช้ฟังก์ชั่นที่มีชื่อแทนโปรแกรมโดยใช้กริดเป็นอาร์กิวเมนต์สตริงและส่งออกจำนวนเต็มหรือสตริงผ่าน stdout หรือฟังก์ชันส่งคืน

กรณีทดสอบ

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

        #
        #
        #
    

    เอาท์พุท: 7(มีช่องว่างสี่ช่องก่อนละ#ช่องผลลัพธ์จะเหมือนกันถ้าลบหมายเลขแต่ละเครื่องหมาย แต่มาร์คดาวน์จะเว้นช่องว่างจากบรรทัดว่างอื่น ๆ )

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

    ##
     #
    ##
    

    ผลลัพธ์: 0(คำตัวอักษรหนึ่งตัวไม่นับ)

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

    ######
    #    #
      ####
    # ## #
    # ## #
    #### #
    

    เอาท์พุท: 4

  4. อินพุต: (ตัวต่อปริศนาSunday NY Timesของวันที่ 10 พฤษภาคม)

       #    ##   #       
       #    #    #       
       #         #       
           #     ###   ##
        #       #        
    ##   #   #           
            #       ##   
          #   ##         
       #        ##      #
             #   ###   ##
    #   ##         ##   #
    ##   ###   #         
    #      ##        #   
             ##   #      
       ##       #        
               #   #   ##
            #       #    
    ##   ###     #       
           #         #   
           #    #    #   
           #   ##    #   
    

    เอาท์พุท: 140

เกณฑ์การให้คะแนน

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ Tiebreaker เป็นโพสต์ที่เก่าแก่ที่สุด

คำตอบ:


7

CJam, 18 17 13 11 bytes

2 ไบต์บันทึกโดย Dennis

ใช้ช่องว่างสำหรับเซลล์ที่เติมและ1เซลล์ว่าง:

qN/_z+:~1-,

ทดสอบที่นี่

คำอธิบาย

q    e# Read the entire input.
N/   e# Split into lines.
_z   e# Make a copy and transpose it.
+    e# Add the lines of the two grids together.
:~   e# Evaluate each line which will push a rep-digit number for each empty-cell chunk.
1-   e# Remove all the 1s as these correspond to individual empty cells.
,    e# Get the length of the array.

9

สลิป 18 + 3 = 21 ไบต์

>? ( +(X|$^)<<){2}

ทำงานด้วยธงno(เพราะฉะนั้น 3) และพื้นที่การใช้งาน / Xแทนของพื้นที่#/ น่ารำคาญนี่มันนานกว่า CJam / Pyth แต่ฉันเดาว่า Slip ไม่ได้ถูกออกแบบมาให้เป็นลูกกอล์ฟโดยเฉพาะ ...

ลองมันออนไลน์ โปรดทราบว่าตัวอย่างแรกไม่มีช่องว่างในสองสามบรรทัด

คำอธิบาย

>?           Optionally turn right, hence matching either horizontally or vertically
[space]      Match a space
(    ){2}    Group, twice:
[space]+       Match 1+ spaces
(X|$^)         Either an X or the boundary of the grid
<<             Reverse the match pointer by turning left twice

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

หมายเหตุ: ตอนแรกฉันมี>?( +(X|$^)<<){2}ช่องว่างด้านในด้านใน สิ่งนี้จะพลาดบางกรณีที่มีคำยาว 2 ช่องอยู่ตรงขอบเนื่องจากตัวชี้จะเป็นดังนี้:

XXX       XXX       XXX       XXX
X>        X >       X<        <
XXX       XXX       XXX       XXX

[sp]    [sp]+$^    <<[sp]    [sp]+   (uh oh match fails)

ทำไมแฟล็กสองสามไบต์?
lirtosiast

@ThomasKwa ฉันคิดว่านโยบายปัจจุบันที่มีการตั้งค่าสถานะบรรทัดคำสั่งคือโพสต์เมตานี้ซึ่งนับจำนวนไบต์เป็นความแตกต่างจากการเรียกใช้รหัสปกติ ดังนั้นนี่คือความแตกต่างระหว่างpy -3 slip.py regex.txt input.txtและpy -3 slip.py regex.txt input.txt noซึ่งเป็นสามไบต์ (รวมถึงช่องว่างก่อนn)
Sp3000

นั่นทำให้รู้สึก ฉันกำลังคิดเกี่ยวกับมันจากมุมมองของเอนโทรปี บางครั้งฉันลืมว่ามันเป็นตัวละครที่เรานับ
lirtosiast

4

Haskell, 81 ไบต์

import Data.List
m x=sum[1|(_:_:_)<-words x]
f x=m x+m(unlines$transpose$lines x)

ใช้ช่องว่างเป็นอักขระบล็อกและอักขระอื่น ๆ (ไม่ใช่ช่องว่าง) เป็นเซลล์ว่าง

มันทำงานอย่างไร: แยกอินพุตออกเป็นรายการคำที่ช่องว่าง ใช้1สำหรับทุกคำด้วยอย่างน้อย 2 ตัวอักษรและรวม1s ใช้ขั้นตอนเดียวกันกับการขนย้าย (แยกที่\n) ของอินพุต เพิ่มผลลัพธ์ทั้งสอง


4

JavaScript ( ES6 ) 87 121 147

สร้างการขนย้ายของสตริงป้อนเข้าและผนวกเข้ากับอินพุตจากนั้นนับสตริงของ 2 ช่องว่างหรือมากกว่า

เรียกใช้ตัวอย่างใน Firefox เพื่อทดสอบ

Credits @IsmaelMiguel โซลูชันสำหรับ ES5 (122 ไบต์):

function F(z){for(r=z.split(/\n/),i=0;i<r[j=0][L='length'];i++)for(z+='#';j<r[L];)z+=r[j++][i];return~-z.split(/  +/)[L]};

F=z=>
(
  r=z.split(/\n/),
  [r.map(r=>z+=r[i],z+='#')for(i in r[0])],
  ~-z.split(/  +/).length
)

// TEST
out=x=>O.innerHTML += x + '\n';

[
'     #    #    \n     #    #    \n          #    \n   #   #       \n###     ##   ##\n               \n     ##   #    \n   #       #   \n    #   ##     \n               \n##   ##     ###\n       #   #   \n    #          \n    #    #     \n    #    #     ', '##\n #\n##', '    #\n    #\n    #',
 '######\n#    #\n  ####\n# ## #\n# ## #\n#### #',
 '   #    ##   #       \n   #    #    #       \n   #         #       \n       #     ###   ##\n    #       #        \n##   #   #           \n        #       ##   \n      #   ##         \n   #        ##      #\n         #   ###   ##\n#   ##         ##   #\n##   ###   #         \n#      ##        #   \n         ##   #      \n   ##       #        \n           #   #   ##\n        #       #    \n##   ###     #       \n       #         #   \n       #    #    #   \n       #   ##    #   '  
].forEach(x=>out(x.replace(/ /g,'.')+'\n'+F(x)+'\n'))
<pre id=O></pre>


1
เกี่ยวกับF=z=>{for(r=z.split(/\n/),i=0;i<r[j=0][L='length'];i++)for(z+='#';j<r[L];)z+=r[j++][i];return~-z.split(/ +/)[L]}อะไร ยาว 113 ไบต์ regex ของคุณถูกแทนที่ด้วย/ +/(2 ช่องว่าง), The j=0ถูกเพิ่มเข้ามาในforลูป'parent' และแทนที่จะใช้ไวยากรณ์obj.lengthฉันเปลี่ยนไปใช้L='length'; ... obj[L]ซึ่งซ้ำแล้วซ้ำอีก 3 ครั้ง
Ismael Miguel

ฉันได้มันมาใช้งานบนes6fiddle.net/iakdcpdh (แทนที่จะF=z=>ต้องใช้var F=(z,i,L,j,r)=>) ฉันทดสอบกับ IE11 แล้วใช้งานได้!
Ismael Miguel

@IsmaelMiguel ทำได้ดีมาก! และเหมาะสมที่สุดสำหรับ ES5 เมื่อมองดูอีกครั้งฉันก็พบว่ามี ES6ish มากขึ้นและสั้นลง บางทีคุณอาจเผยแพร่โซลูชันของคุณสำหรับ ES5
edc65

ไม่เป็นไร มันเป็นทางออกของคุณฉันเพิ่งลดมัน ฉันคิดว่ามันไม่ยุติธรรมเลยที่จะตอบเหมือนเป็นของตัวเอง
Ismael Miguel

ตอนนี้ฉันคิดแล้วคุณสามารถแทนที่/\n/ด้วยสตริงแม่แบบที่มีบรรทัดใหม่จริงระหว่าง นั่นช่วยประหยัด 1 ไบต์เนื่องจากคุณไม่จำเป็นต้องเขียนลำดับหนี
Ismael Miguel

3

Pyth, 15 14 13 ไบต์

lftTcjd+.zC.z

ฉันใช้เป็นตัวคั่นและ#เติมอักขระแทนความหมายตรงกันข้ามของพวกเขาจาก OP ลองใช้งานออนไลน์: การสาธิต

แทนที่จะ#เป็นตัวละครเติมนี้ยอมรับตัวอักษร ดังนั้นคุณสามารถไขปริศนาไขว้ที่ถูกแก้ไขแล้วและมันจะพิมพ์จำนวนคำ และถ้าคุณลบlคำสั่งมันก็จะพิมพ์คำทั้งหมด ทดสอบที่นี่: ปริศนาวันอาทิตย์ NY Times 10 พฤษภาคม

คำอธิบาย

        .z      all input rows
          C.z   all input columns (C transposes)
       +        add them (all rows and columns)
     jd         join by spaces
    c           split by spaces
 f              filter for pieces T, which satisfy:
  tT              len(T) > 1
l               length, implicitly printed
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.