別の文字を探す


10

あなたはこのようなパズルを見たかもしれません:

を見つける0
OOOOOOOOOOOOOOOOOOOO0OOOOOOOOOOOOOOOOOO

課題は、画像が与えられた別の文字のインデックスを見つけるプログラムを書くことです。

入力

入力はになりますImage。画像は、Helvetica 24 pt1行黒いテキストで構成されます白い背景の上のフォント。テキストは、2つの文字の選択から構成されます。1つの文字が繰り返され、1つの文字が1回だけ表示されます。例えば:

入力例

出力

出力はInteger、異なる文字のインデックスであるになります。上記の例では、出力はになります4。(文字列のインデックスはで始まることに注意してください0

プログラムの仕様

コードゴルフではいつものように、最短のプログラムが勝ちます。


テストケース

 => 10
 => 11
 => 5
 => 16
 => 10
 => 21
 => 20
 => 13
 => 11
 => 4
 => 7


2
知識の注:実際の例は、それ自体がパズルではありません。それはもっと面白いアイゲームです。
ザックゲイツ

これはどのように採点されますか?
intboolstring 2016年

これはコードゴルフなので、各例への答えを正しく出力する最短のプログラムです。
AMACB 2016年

2
一部の言語の最も短い答えは、実際には結果をハードコーディングし、入力画像のサイズのようなものに基づいて1つを選択することです(これは許可されていないと思います)。
user81655

1
@AMACB "例には何も含まれていませんが"、それを変更するのは良い考えかもしれません;)。また、処理する必要がある最小文字数はいくつですか?(少なくとも3つあると思いますが、それ以上だと思いますか?)また、その最小値のテストケースも必要です。
マーティンエンダー

回答:


6

Dyalog APL31 32バイト

{1⍳⍨+⌿∘.≡⍨{⍵/⍨~∧⌿⍵}¨⍵⊂⍨2>/∧⌿1,⍵}

⎕IO←0 (OPごとに)0で始まるインデックスを取得します。これは、多くのAPLシステムではとにかくデフォルトです。

1,⍵各文字の左端にある
∧⌿すべて白(垂直AND削減)
2>/ブール値が
⍵⊂⍨各TRUEで始まるブロックに分割される場合、各列に白ピクセルの列を(マージンを確保するために)付加します。
{… [all-white]ではない全白(垂直AND削減)列がすべての要素に一致する場合、各列の各ブロックの
∧⌿⍵ブール値最初の1つのブロック(垂直プラス削減)インデックスと同じブロック数(つまり、ユニークな要素)
⍵/⍨~
∘.≡⍨
+⌿
1⍳⍨

画像がマトリックス内の黒(0)ピクセルと白(1)ピクセルであり、I文字の間に少なくとも1つの真っ白なピクセル列があると仮定します。

      f←{1⍳⍨+⌿∘.≡⍨{⍵/⍨~∧⌿⍵}¨⍵⊂⍨2>/∧⌿1,⍵}

"!私!!":

      ⊢I←6 12⍴(13/1),(22⍴0 1 1),(5/1),0,(8/1),(10⍴0 1 1),13/1
1 1 1 1 1 1 1 1 1 1 1 1
1 0 1 1 0 1 1 0 1 1 0 1
1 0 1 1 0 1 1 0 1 1 0 1
1 1 1 1 0 1 1 1 1 1 1 1
1 0 1 1 0 1 1 0 1 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1
      f I
1

「mmnmm」:

      ⊢I←7 31⍴(94/1),0 0,(∊0 1⌽¨2/⊂12⍴6↑1 0 1 1),0 1,(62⍴1 1 1,(⊢,⌽)(14⍴0 1)),33/1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 0 1 0 1 1 0 0 1 0 1 1 0 0 0 1 1 0 0 1 0 1 1 0 0 1 0 1 1 1
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1     
      f I
2

を完全に削除して{⍵/⍨~∧⌿⍵}¨、そのまま残すことはできません{1⍳⍨+⌿∘.≡⍨⍵⊂⍨2>/∧⌿1,⍵}か?
lstefano 2016年

@lstefano次に、空白の量が変化すると機能しなくなります。
アダム・

あなたの言っていることがわかります。
lstefano 2016年

3

Mathematica、125バイト

StringCases[#,x:Except[StringCases[#~StringTake~3,x_~~___~~x_:>x][[1]]]:>Position[Characters@#,x]][[1,1,1]]-1&@*TextRecognize

ああ、Mathemeaticaビルトイン。本当に素晴らしい。(そしてとても長い...)爆破する| /!:/; 、/。`/ 'とm / nで異なる方法で爆破します。


これはいくつの入力に対して機能しますか?たとえば、私のコピーは最初の例(パイプと感嘆符)のテキストを認識しません。私は何かが欠けていない限り、私はと同じ性能を持っている Length[Split[Characters@TextRecognize@#][[1]]] &
Aシモンズ

おっと、Splitのことを忘れてしまいました...そして、それはMathematicaの組み込みのテキスト認識機能に依存しています...そして、あなたは決してそれを信頼することはできません。
CalculatorFeline

その後、別の解決策として私のものを投稿します。
シモンズ

3

Mathematica、46バイト

Length@First@Split@Characters@TextRecognize@#& 

同じTextRecognize機能に依存しているため、他のmathematicaソリューションと同じ失敗。


Bytesave:Length@First@Split@Characters@TextRecognize@#&
CalculatorFeline

@CatsAreFluffy Cheers
A Simmons

残念ながら、@*保存できないほど長い時間です。
CalculatorFeline
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.