クロスワードを読む


11

この形式へのパッキングに関するこの質問に触発されました。

ときどき、完成したクロスワードが表示され、私と同じようにいると、手がかりの解決策が実際に何であったかを知るのに迷惑をかけることができません。

入力:

  • 2D文字列(任意の形式、改行区切り、2Dリストなど)
  • 空白の四角は(スペース文字)で表されます
  • 他のすべての正方形は小文字のアルファベットになります。
  • 入力がスペースで埋められて長方形を形成すると仮定することができます

出力:

  • 見つかった各単語
    • 前後の単語を検索する必要があります
    • 単語は少なくとも2文字の長さになります
    • 重複する単語がある場合は、出現するたびに出力する必要があります
  • 検証する必要はありません
  • 単語は任意の順序で出力できます
  • 厳密なフォーマット規則はありません

テストケース:

word
e e 
step
t d 

word, step, west, reed
---
pies
 not
  no
wasp

pies, not, no, wasp, in, eons, stop
---
igloo
    n
word

igloo, word, on

回答:


8

Pyth- 11 10 8 7バイト

@issacgのおかげで1バイト節約できました。

t#cjsCB

こちらからオンラインでお試しください

t#               Filter by if len > 1
 c               Chop by whitespace by default
  j              Join by newlines
   sCB           Input, implicit and its transpose in one list

@Maltysen素晴らしい。
リーキー修道女

1
Pythが勝ちます。いつものように。
リーキー修道女

1
あなたは除去することにより、1つのバイトを保存することができdますが、これは、jまだによって切断される改行、上参加c ... )
isaacg

本当に、感謝クールだ@isaacg
Maltysen

2

CJam、14バイト

{_z+S*S%{,(},}

スタックの最上部に(パディングされた)文字列のリストを期待し、代わりに単語のリストを残す名前のないブロック。

ここでテストしてください。

説明

_z    e# Duplicate and transpose the grid.
+     e# Append the transpose to the original grid.
S*    e# Join all lines by spaces to ensure that we don't get words 
      e# spanning multiple lines.
S%    e# Split around spaces, discarding empty segments.
{,(}, e# Filter: keep only those strings with length 2 or greater.

1

JavaScript(ES6)、83バイト

s=>(s+` `+[...(t=s.split`
`)[0]].map((_,i)=>t.map(t=>t[i]).join``)).match(/\w\w+/g)

0

Pyth、18バイト

Lm:d"\S\S+"1byQyCQ

オンラインでお試しください!

サンプル入力:

["pies"," not","  no","wasp"," t  "]

サンプル出力:

[['pies'], ['not'], ['no'], ['wasp'], []]
[[], ['in', 'at'], ['eons'], ['stop']]

使い方:

Lm:d"\S\S+"1byQyCQ                                 The "1" here is mode
                    assign('Q',eval_input())       "1" which means show
                    @memoized                      all matches
L                   def y(b):                               v
 m:d"\S\S+"1b           return map(lambda d:regex(d,"\S\S+",1),b)
             yQ     imp_print(y(Q))
               yCQ  imp_print(y(transpose(Q)))

0

Haskell、58バイト

import Data.List
f x=[w|w@(_:_:_)<-words=<<x++transpose x]

使用例:f ["pies"," not"," no","wasp"]-> ["pies", "not", "no", "wasp", "in", "eons", "stop"]

仕組み:入力の各行を分割し、スペースで転置して単一のリストワードにします。一致するもの(_:_:_)、つまり少なくとも2つの文字を保持します。


0

C ++ 14、209 207 201バイト

途方もなく大量のバイト...しかしまあまあ。転置行列、分割文字列。簡単です。移調のためのネイティブ関数がありません

[](vector<string>; m){auto t=m;int C=size(m[0]),j=0;for(;++j<C*C;)t[j%C][j/C]=m[j/C][j%C];for(j=0;++j<C+C;){stringstream Z(j<C?m[j]:t[j-C]);string s;while(getline(Z,s,' '))cout<<(size(s)>1?s+' ':"");}}

ゴルフをしていない:

using S=vector<string>;
[](S m){
  S t=m;
  int C=size(m[0]),j=0;
  for(;j<C*C;++j)t[j%C][j/C]=m[j/C][j%C]; // Transpose
  for(j=0;j<C+C;++j){ // since rectangle matrix, we can iterate like so
    stringstream Z(j<C?m[j]:t[j-C]); // Get string from m or t
    string s;
    while(getline(Z,s,' '))
      cout<<(size(s)>1?s+' ':"");
  }
}

使用方法(質問のとおりにパディングを強制する必要があります):

using S = vector<string>;[](S m) { ... }({"pies", " not", "  no", "wasp"});

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.