Java 7、927 924 923バイト
import java.util.*;int l,k;char[][]z;Set p=new HashSet();String c(String[]a){int x=0,y=0,n,t,u,v,w=t=u=v=-1;l=a.length;k=a[0].length();z=new char[l][k];for(String s:a){for(char c:s.toCharArray())z[x][y++]=c;}x++;y=0;}for(x=0;x<l;x++)for(y=0;y<k;y++){n=0;if(z[x][y]>32){if(x<1|(x>0&&z[x-1][y]<33))n++;if(y<1|(y>0&&z[x][y-1]<33))n++;if(x>l-2|(x<l-1&&z[x+1][y]<33))n++;if(y>k-2|(y<k-1&&z[x][y+1]<33))n++;}if(n>2&t<0){t=x;u=y;}if(n>2&t>v){v=x;w=y;}}if(v+w>t+u){p(t,u);return n(""+z[t][u],t,u);}p(v,w);return n(""+z[v][w],v,w);}String n(String r,int x,int y){int a,b;if(x>0&&z[a=x-1][b=y]>32&q(a,b)){p(a,b);return n(r+z[a][b],a,b);}if(y>0&&z[a=x][b=y-1]>32&q(a,b)){p(a,b);return n(r+z[a][b],a,b);}if(x<l-1&&z[a=x+1][b=y]>32&q(a,b)){p(a,b);return n(r+z[a][b],a,b);}if(y<k-1&&z[a=x][b=y+1]>32&q(a,b)){p(a,b);return n(r+z[a][b],a,b);}return r;}boolean q(int x,int y){return!p.contains(x+","+y);}void p(int x,int y){p.add(x+","+y);}
一部のプログラミング言語では、配列xとyが2D配列の境界外にあるかどうかは関係ありませんが、JavaではスローArrayIndexOutOfBoundsExceptions
されるため、すべてをチェックする必要があります。
最初に開始点を決定し、次に再帰的なメソッドを使用してそこから文字列を作成します。さらに、リストを使用して、既に遭遇した調整を追跡するため、前後にループが発生することはありません(結果としてStackOverflowExceptionが発生します)。
これはおそらく私がこれまでに投稿した中で最長の回答ですが、一部のパーツはゴルフをすることができますが、この課題はJavaではそれほど短くなるとは思いません。Javaは、グリッド内のパスをたどるのには適していないだけです。:)
未ゴルフ&テストケース:
ここで試してみてください。
import java.util.*;
class M{
static int l,
k;
static char[][] z;
static Set p = new HashSet();
static String c(String[] a){
int x=0,
y=0,
n,
t,
u,
v,
w = t = u = v = -1;
l = a.length;
k = a[0].length();
z = new char[l][k];
for(String s:a){
for(char c:s.toCharArray()){
z[x][y++] = c;
}
x++;
y = 0;
}
for(x=0; x<l; x++){
for(y=0; y<k; y++){
n = 0;
if(z[x][y] > 32){ // [x,y] is not a space
if(x < 1 | (x > 0 && z[x-1][y] < 33)){
n++;
}
if(y < 1 | (y > 0 && z[x][y-1] < 33)){
n++;
}
if(x > l-2 | (x < l-1 && z[x+1][y] < 33)){
n++;
}
if(y > k-2 | (y < k-1 && z[x][y+1] < 33)){
n++;
}
}
if(n > 2 & t < 0){
t = x;
u = y;
}
if(n > 2 & t > v){
v = x;
w = y;
}
}
}
if(v+w > t+u){
p(t, u);
return n(""+z[t][u], t, u);
}
p(v, w);
return n(""+z[v][w], v, w);
}
static String n(String r, int x, int y){
int a,b;
if(x > 0 && z[a=x-1][b=y] > 32 & q(a,b)){
p(a, b);
return n(r+z[a][b], a, b);
}
if(y > 0 && z[a=x][b=y-1] > 32 & q(a,b)){
p(a, b);
return n(r+z[a][b], a, b);
}
if(x < l-1 && z[a=x+1][b=y] > 32 & q(a,b)){
p(a, b);
return n(r+z[a][b], a, b);
}
if(y < k-1 && z[a=x][b=y+1] > 32 & q(a, b)){
p(a, b);
return n(r+z[a][b], a, b);
}
return r;
}
static boolean q(int x, int y){
return !p.contains(x+","+y);
}
static void p(int x, int y){
p.add(x+","+y);
}
public static void main(String[] a){
System.out.println(c(new String[]{ "Hel ",
" l rin",
" o,IAmASt g",
" S",
" !ekan" }));
p = new HashSet();
System.out.println(c(new String[]{ "Python" }));
p = new HashSet();
System.out.println(c(new String[]{ "P ngPu Code ",
"r i z d G",
"o m z n o",
"gram lesA lf" }));
p = new HashSet();
System.out.println(c(new String[]{ " ~ zyx tsr XWVUTSR",
" }|{ wvu q Y Q",
"! p Z `ab P",
"\"#$ 6789:; o [ _ c O",
" % 5 < n \\]^ d N",
"('& 432 = m e M",
") 1 > lkjihgf L",
"*+,-./0 ? K",
" @ABCDEFGHIJ" }));
p = new HashSet();
System.out.println(c(new String[]{ " tSyrep ",
" r p ",
" in Sli ",
" g Sile",
" Snakes n",
"Ser ylt",
"a eh ilS ",
"fe w t ",
" emo h ",
" Sre " }));
}
}
出力:
Hello,IAmAStringSnake!
Python
ProgrammingPuzzlesAndCodeGolf
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
SlipperyStringSnakesSilentlySlitherSomewhereSafe