Geçiş kelimelerini sayın


10

Aşağıdaki standart 15 × 15 bulmaca ızgarasını düşünün .

Bulmaca ızgarası

Bunu ASCII sanatında beyaz kareler #için bloklar ve (boşluk) kullanarak temsil edebiliriz .

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

     ##   #    
   #       #   
    #   ##     

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

Yukarıdaki ASCII sanat biçiminde bir bulmaca ızgarası verildiğinde, kaç kelime içerdiğini belirleyin. (Yukarıdaki tablo 78 kelime var. Geçen Pazartesi New York Times bulmacası olacak .)

Bir kelime, dikey veya yatay olarak çalışan iki veya daha fazla ardışık boşluktan oluşan bir gruptur. Bir kelime ya bir blok ya da ızgaranın kenarı ile başlar ve biter ve daima çaprazdan ya da geriye doğru asla yukarıdan aşağıya ya da soldan sağa doğru çalışır. Yukarıdaki bulmacanın altıncı satırında olduğu gibi kelimelerin bulmacanın tüm genişliğini kapsayabileceğini unutmayın. Bir kelimenin başka bir kelimeye bağlanması gerekmez.

ayrıntılar

  • Girdi her zaman satırları bir satırsonu ( ) ile ayırarak karakter #veya (boşluk) içeren bir dikdörtgen olacaktır \n. Izgaranın ve yerine 2 farklı yazdırılabilir ASCII karakterden oluştuğunu varsayabilirsiniz .#
  • İsteğe bağlı bir takip eden yeni satır olduğunu varsayabilirsiniz. Sondaki boşluk karakterleri, kelime sayısını etkilediğinden dikkate alınır.
  • Izgara her zaman simetrik olmayacaktır ve tüm boşluklar veya tüm bloklar olabilir.
  • Programınız teorik olarak herhangi bir boyutta bir ızgara üzerinde çalışabilmelidir, ancak bu meydan okuma için asla 21 × 21'den büyük olmayacaktır.
  • Izgaranın kendisini girdi olarak veya ızgarayı içeren bir dosyanın adı olarak alabilirsiniz.
  • Stdin veya komut satırı bağımsız değişkenlerinden girdi alın ve stdout'a çıktı alın.
  • İsterseniz, bir program yerine adlandırılmış bir işlev kullanabilir, ızgarayı dize argümanı olarak alabilir ve stdout veya işlev dönüşü aracılığıyla bir tam sayı veya dize çıktısı alabilirsiniz.

Test senaryoları

  1. Giriş:

        #
        #
        #
    

    Çıktı: 7(Her birinden önce dört boşluk vardır #. Her sayı işareti kaldırılırsa sonuç aynı olur, ancak Markdown boş satırlardan boşluklar çıkarır.)

  2. Giriş:

    ##
     #
    ##
    

    Çıktı: 0(Tek harfli kelimeler sayılmaz.)

  3. Giriş:

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

    Çıktı: 4

  4. Girdi: (10 Mayıs Pazar NY Times yapboz)

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

    Çıktı: 140

puanlama

Bayt cinsinden en kısa kod kazanır. Tiebreaker en eski gönderi.

Yanıtlar:


7

CJam, 18 17 13 11 bayt

Dennis tarafından kaydedilen 2 bayt.

Doldurulmuş hücreler ve 1boş hücreler için boşluk kullanır :

qN/_z+:~1-,

Burada test edin.

açıklama

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

Kayma , 18 + 3 = 21 bayt

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

Bayraklarla çalıştırın no(dolayısıyla +3) ve space / Xyerine space / kullanır #. Can sıkıcı bir şekilde bu CJam / Pyth daha uzun, ama sanırım Slip özel golfy için tasarlanmış değildi ...

Çevrimiçi deneyin . İlk örneğin birkaç satırda boşluk olmadığını unutmayın.

açıklama

>?           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

nBayrak çıktı eşleşme sayısını yazdırmak yapar ve obayrak aynı meydanda başlayarak üst üste maçları sağlar. İleri ve geri gitmenin nedeni, Slip'in her kareden başlayarak eşleşmeyi denemesidir ve kısmi yerine yalnızca tam bir satırla eşleştiğimizden emin olmak istiyoruz. Slip, farklı konumlardan başlasalar bile yalnızca benzersiz eşleşmeler döndürür.

Not: Başlangıçta >?( +(X|$^)<<){2}, içeride ilk boşluk vardı . İşaretçi şu şekilde olacağından, kenarda 2 boşluk uzunluğunda kelime bulunan bazı durumlar gözden kaçar:

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

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

İki bayrak neden üç bayt?
lirtosiast

@ThomasKwa Bence komut satırı bayrakları ile mevcut politika bayt sayısını kodun normal çağırma farkı olarak sayan bu meta yazı olduğunu düşünüyorum . Yani burada fark arasındadır py -3 slip.py regex.txt input.txtve py -3 slip.py regex.txt input.txt no(daha önce boşluk dahil olmak üzere üç bayt olan n)
SP3000

Mantıklı. Bunu entropi perspektifinden düşünüyordum; bazen saydığımız karakterler olduğunu unutuyorum.
lirtosiast

4

Haskell, 81 bayt

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

Boşlukları blok karakter olarak ve diğer (boşluk olmayan) karakterleri boş hücre olarak kullanır.

Nasıl çalışır: girdiyi boşluklardaki sözcükler listesine ayırın. 1Her karakter için en az 2 karakterli bir kelime alın ve bunları 1toplayın. \nGirişin transpozisyonuna (bölünmüş ) aynı prosedürü uygulayın . Her iki sonucu da ekleyin.


4

JavaScript ( ES6 ) 87 121 147

Giriş dizesinin transpozisyonunu oluşturun ve girişe ekleyin, ardından 2 veya daha fazla boşluğun dizelerini sayın.

Test etmek için snippet'i Firefox'ta çalıştırın.

Krediler @IsmaelMiguel, ES5 için bir çözüm (122 bayt):

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
Ne olmuş 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 bayt uzunluğundadır. Normal ifadeniz / +/(2 boşluk) ile değiştirildi j=0, 'ebeveyn' fordöngüsüne eklendi ve sözdizimini kullanmak yerine, 3 kez tekrarlanan obj.lengthkullanımı değiştirdim L='length'; ... obj[L].
Ismael Miguel

Es6fiddle.net/iakdcpdh üzerinde çalışmak için aldım (yerine F=z=>kullanmak zorundayım var F=(z,i,L,j,r)=>). IE11'de test ettim ve işe yarıyor!
Ismael Miguel

@IsmaelMiguel aferin! ve ES5 için en uygun. Tekrar baktığımda, daha ES6ish ve daha kısa bir şey buldum. Belki ES5 için çözümünüzü yayınlayabilirsiniz.
edc65

Hayır sorun yok. Sizin çözümünüzdü, sadece azalttım. Sanki kendimmişim gibi cevap vermeyi adil bulmuyorum.
Ismael Miguel

Şimdi düşünüyorum, /\n/arasında gerçek bir satırsonu ile bir şablon dizesi ile değiştirebilirsiniz . Bu, kaçış dizisini yazmak zorunda olmadığınız için 1 bayt tasarruf sağlar.
Ismael Miguel

3

Pyth, 15 14 13 bayt

lftTcjd+.zC.z

OP karşıtı anlamları yerine ayırıcı ve #dolgu karakterleri olarak kullanıyorum . Çevrimiçi deneyin: Gösteri

#Bu dolgu karakteri yerine harfleri de kabul eder. Yani aslında çözülmüş bulmaca alabilir ve kelime sayısını yazdırabilirsiniz. Ve lkomutu kaldırırsanız, tüm kelimeleri bile yazdırır. Yapboz Burada test: 10 Mayıs Pazar NY Times

açıklama

        .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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.