交差する単語を数える


10

次の標準的な15×15 クロスワードパズルグリッドについて考えてみましょう。

クロスワードグリッド

これをASCII #ブロックで表すには、forブロックと(スペース)を白い正方形に使用します。

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

     ##   #    
   #       #   
    #   ##     

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

上記のASCIIアート形式のクロスワードグリッドを前提として、それが保持する単語数を決定します。(上記のグリッドには78ワードあります。先週の月曜日のニューヨークタイムズパズルです。)

単語は、垂直または水平に走る2つ以上の連続したスペースのグループです。単語は、ブロックまたはグリッドのエッジのいずれかで開始および終了し、常に上から下または左から右に実行されます。対角線または後方には決して実行されません。上のパズルの6行目のように、単語はパズルの幅全体に及ぶ場合があることに注意してください。単語を別の単語に関連付ける必要はありません。

細部

  • 入力は常に文字#または(スペース)を含む長方形で、行は改行(\n)で区切られます。グリッドは、およびの代わりに、2つの異なる印刷可能なASCII文字で構成されると想定できます。#
  • オプションの末尾の改行があると想定する場合があります。末尾の空白文字は、単語数に影響を与えるため、カウントされます。
  • グリッドは常に対称であるとは限らず、すべてスペースまたはすべてブロックである場合があります。
  • プログラムは理論的にはあらゆるサイズのグリッドで機能する必要がありますが、この課題では21×21を超えることはありません。
  • グリッド自体を入力として、またはグリッドを含むファイルの名前として使用できます。
  • stdinまたはコマンドライン引数から入力を取り、stdoutに出力します。
  • 必要に応じて、プログラムの代わりに名前付き関数を使用して、グリッドを文字列引数として取得し、stdoutまたは関数returnを介して整数または文字列を出力できます。

テストケース

  1. 入力:

        #
        #
        #
    

    出力:(7各の前にスペースが4つあります#。各番号記号を削除した場合の結果は同じですが、Markdownは空の行からスペースを削除します。)

  2. 入力:

    ##
     #
    ##
    

    出力:0(1文字の単語はカウントされません。)

  3. 入力:

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

    出力: 4

  4. 入力:(5月10日の日曜日のNYタイムズパズル)

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

    出力: 140

得点

バイト単位の最短コードが優先されます。タイブレイカーは最古の投稿です。

回答:


7

CJam、18 17 13 11バイト

Dennisによって2バイト節約されました。

塗りつぶされたセルと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)を指定して実行し、space / Xではなくspace /を使用します#。厄介なことに、これは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フラグが同一の正方形から始まる重複一致を可能にします。前後の理由は、スリップがすべての正方形から開始して一致を試行するため、部分的な行ではなく行全体のみに一致するようにするためです。スリップは、異なる位置から開始した場合でも、一意の一致のみを返します。

注:元々>?( +(X|$^)<<){2}はで、最初のスペースは内側にありました。これは、ポインタが次のようになるため、エッジに2スペースの長い単語があるいくつかのケースを見逃す可能性があります。

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

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

2つのフラグが3バイトなのはなぜですか?
リルトシアスト2015年

@ThomasKwaコマンドラインフラグを使用する現在のポリシーはこのメタポストであり、通常のコード呼び出しとの違いとしてバイト数をカウントします。したがって、ここでの違いはとの間py -3 slip.py regex.txt input.txtpy -3 slip.py regex.txt input.txt no、3バイトです(前のスペースを含むn
Sp3000

それは理にかなっている。私はそれをエントロピーの観点から考えていました。時々、それが私たちが数える文字であることを忘れます。
リルトシアスト2015年

4

Haskell、81バイト

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

空白をブロック文字として使用し、その他の(空白以外の)文字を空のセルとして使用します。

仕組み:入力をスペースで単語のリストに分割します。1少なくとも2文字のすべての単語についてa を取り、それら1のs を合計します。同じ手順を\n入力の転置(で分割)に適用します。両方の結果を追加します。


4

JavaScript(ES6)87 121 147

入力文字列の転置を作成して入力に追加し、2つ以上のスペースの文字列をカウントします。

Firefoxでスニペットを実行してテストします。

クレジット@ 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バイトです。あなたの正規表現は/ +/(2つのスペース)に置き換えられました、The j=0は「親」forループに追加され、構文を使用する代わりに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に最適です。もう一度見てみると、ES6っぽくて短いものが見つかりました。ES5向けのソリューションを公開することもできます。
edc65

いいえ、大丈夫です。それはあなたの解決策でした、私はそれを減らしました。自分のものであるかのように答えるのは公平ではありません。
Ismael Miguel

私はそれについて考えたので、/\n/間に実際の改行を含むテンプレート文字列で置き換えることができます。エスケープシーケンスを記述する必要がないため、1バイト節約されます。
Ismael Miguel

3

Pyth、15 14 13バイト

lftTcjd+.zC.z

OPとは反対の意味ではなく、区切り#文字と塗りつぶし文字として使用しています。オンラインで試す:デモ

#塗りつぶし文字としてではなく、文字も受け入れます。そのため、実際に解決されたクロスワードパズルを使用して、単語数を出力することができます。また、lコマンドを削除すると、すべての単語が出力されます。ここでテストしてください:5月10日のNY Timesパズル

説明

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