Java、スコア23、538 507バイト
NSFW
import java.util.function.*;import java.util.stream.*;class B{static BiFunction<char[][],String,BiFunction<Integer,Integer,Byte>>f;{f=(b,s)->(i,j)->{try{if(b[i][j]!=s.charAt(0))return 0;}catch(Exception e){return 0;}if(s.length()<2)return 1;byte t=0;for(int k=9;k-->1;){t|=f.apply(b,s.substring(1)).apply(i+~k%3+1,j+~(k/3)%3+1);}return t;};BiFunction<char[][],String,Byte>g=(b,s)->{int l=b.length;return (byte)IntStream.range(0,l*l).map(i->f.apply(b,s).apply(i%l,i/l)).reduce((x,y)->x+y-x*y).getAsInt();};}}
オンラインでお試しください!
JDK 9でコンパイルされましたが、8で動作するはずです。
インポートと静的フィールド(実際には必要)をどうすればよいかわからなかったので、クラス全体を取得し、ラムダを初期化子に固定することにしました。次に、ラムダg
を2D配列と文字列に適用し1
、文字列がボードにある0
場合とない場合(a Byte
、より短い3文字Integer
)を返します。
(この場合)隣接セルをアドレス指定するハードコーディングよりも短い方法をこの男に与えてください。
この怪物を作る進行中のどこかで、ラムダで動作するようにすることに投資し、これが起こるまで次第に悪化しました。それは他の答えにも近づかないし、おそらくJavaの最適なソリューションにも近くないでしょうが、ちょっと、23x23ボードにはかなりきちんと収まります(最適ではありませんが、おそらくプログラム自体よりも近いでしょう) :
duce((x,y)->x+y-x*y).ge
e l=b.length;return (bt
rt3+1,j+~(k/3)%3+1);}yA
.n%te t=0;for(int k=rts
)iky0;}catchExcepti9e)I
){~b (b,s)->(i,j)-o;tIn
l>+;n=ring,iFunct>nkunt
/-i1rftass B{stai{ -rt(
i)( u{Slport jatote-nS)
,synt;,cmutil.vinr)> t;
l,lref];i.porfac<y{1tr}
%bpur>[*;amitu. I{r;}e;
i(pt)>].*vaj nuBnie);a}
y=ae)e[m.noitctitft{Bm}
lg.r0traerts.liFe(uti.}
p>))(yhc<noitcnugbr|Fr
pe12tB,regetnI,re[n=ua
at(<Arahc.s=!]j[]i fng
.yg)(htgnel.s(fi};0.ce
)Bnirtsbus.s,b(ylppat(
s,gnirtS,][][rahc<noi0
,b(ylppa.f>-i(pm.)l*l,
もちろん、その時点では、それを手作業で作成しようとしても意味がありませんでした。ボーナスとして、ボードにコードを圧縮するために使用した(単純な)関数を次に示します。
static char[][] toBoggleBoard(String s, int n) {
char[][] board = new char[n][n];
int i = n / 2;
int j = i;
int[] d = {1, 0};
s = s + s.charAt(s.length() - 1); //the last char gets eaten don't ask me why PS editing loop condition does make it work but causes a StringIndexOutOfBoundsException
board[i][j] = s.charAt(0);
s = s.substring(1);
while (s.length() > 0)
{
int[] ra = add(d, right(d));
int[] r = right(d);
int[] l = left(d);
if (board[i + d[0]][j + d[1]] > 0)
{
if (board[i + d[0]][j + d[1]] == s.charAt(0))
{
i += d[0];
j += d[1];
s = s.substring(1);
}
else
{
i += l[0];
j += l[1];
board[i][j] = s.charAt(0);
s = s.substring(1);
}
}
else if (board[i + ra[0]][j + ra[1]] == s.charAt(0))
{
i += ra[0];
j += ra[1];
s = s.substring(1);
}
else if (board[i + r[0]][j + r[1]] > 0)
{
i += d[0];
j += d[1];
board[i][j] = s.charAt(0);
s = s.substring(1);
}
else
{
int[] rb = sub(r, d);
d = r;
if (board[i + rb[0]][j + rb[1]] > 0)
{
continue;
}
else
{
i += d[0];
j += d[1];
board[i][j] = s.charAt(0);
s = s.substring(1);
}
}
}
for (int k = 0; k < board.length; ++k)
{
for (int l = 0; l < board.length; ++l)
{
if (board[k][l] == 0)
{
board[k][l] = ' ';
}
}
}
return board;
}
static int[] left(int[] d) {
return new int[]{-d[1], d[0]};
}
static int[] right(int[] d) {
return new int[]{d[1], -d[0]};
}
static int[] add(int[] x, int[] y) {
return new int[]{x[0] + y[0], x[1] + y[1]};
}
static int[] sub(int[] x, int[] y) {
return new int[]{x[0] - y[0], x[1] - y[1]};
}
入力をスネークの実装が機能しなかったスパイラルにマッピングし、可能であればキャラクターを除外します。それはかなり単純なので改善される可能性があり、後方右方向の文字のチェックを追加するのを忘れていました(更新:間違った結果を生成するように追加しました)。 22x22で。
編集:必要のない場所の6つのスペースを削除しました。配列インデックスのチェックをtry-catchに置き換えて13バイトを節約しました。ボードサイズをに移動して12バイトを削り落としましたint
。