Java,得分23,538 507字节
国家自然科学基金会
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一起使用。
我不知道如何处理import和static字段(实际上是必需的),所以我决定只学习整个类并将lambda保留在初始化程序中。g
然后,可以将lambda 应用于2D数组和字符串,并返回1
该字符串是否在面板中(0
如果不是)(作为Byte
,比短3个字符Integer
)。
值得称赞的是,这个人(以我为例)比硬编码寻址地址更短。
在制作这种怪兽的过程中,我投入了一些资金,使其与lambda一起使用,在这种情况发生之前,它变得越来越糟。它甚至与其他答案都不太接近,而且甚至可能与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字节来减少12个字节int
。