자바, 득점 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
있는지 아닌지 ( 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
였습니다.