Bir Dize Snakify


58

Normal bir dize şuna benzer:

Hello,IAmAStringSnake!

Ve bir dize yılanı şuna benzer:

Hel         
  l      rin
  o,IAmASt g
           S
       !ekan

Senin görevin

String yılanları tehlikelidir, bu nedenle string yılanı giriş olarak alan ve normal bir string olarak çıkaran bir program yapmalısınız.

Özellikler

  • Giriş, çok satırlı bir dize veya bir dizi dizgi olabilir.
  • Girişin her satırı dikdörtgen bir ızgara oluşturmak için boşluklarla doldurulur.
  • Yılandaki karakterler, sadece yanlarında, altlarında, sollarında veya sağlarında bulunan bitişik karakterlere bağlanabilir (Snake oyununda olduğu gibi). Çapraz gidemezler.
  • Yılan karakterleri, yalnızca bağlı karakterlerin olduğu, yılanın başka bir bölümüne asla bitişik olmayacaktır.
  • Dizenin ilk karakteri , giriş ızgarasının sol üst köşesinden en kısa Manhattan mesafesine sahip bitiş karakteridir (yani bir yılanın doğrudan bitiş karakterinden sol üste gitmesi için gereken minimum hareket sayısı) köşe). Her iki uç da asla aynı mesafeye sahip olmayacak.
  • Dize, kod noktaları 33 ile 126 arasında herhangi bir ASCII karakterini içerebilir (boşluk veya satır yok).
  • Dize 2 ila 100 karakter uzunluğunda olacak.
  • Bayt cinsinden en kısa kod kazanır.

Test Kılıfları

(Giriş ızgarası, ardından çıkış dizesi)

Hel         
  l      rin
  o,IAmASt g
           S
       !ekan

Hello,IAmAStringSnake!

----------

Python

Python

----------

P  ngPu  Code 
r  i  z  d  G 
o  m  z  n  o 
gram  lesA  lf

ProgrammingPuzzlesAndCodeGolf

----------

   ~ 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

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

----------

  tSyrep    
  r    p    
  in Sli    
   g    Sile
   Snakes  n
Ser      ylt
a eh   ilS  
fe w   t    
   emo h    
     Sre    

SlipperyStringSnakesSilentlySlitherSomewhereSafe

20
Eğlenceli Bilgiler: Bağlantılı Vikipedi makalesine göre, Manhattan mesafesi de yılan mesafesi olarak bilinir!
user81655

Hastebin.com/asugoropin.vbs gibi bir giriş doğru olur mu?
FliiFe

@FliiFe Hayır, yılanın parçaları yan yana olamaz çünkü bu olduğunda yılanın nereye gittiğini söylemek her zaman mümkün değildir (ve mücadeleyi zorlaştırır). Bunu açıklamak için özelliğe bir satır ekledim.
user81655

Girdi iki boyutlu bir dizi olabilir mi (yani, bir eleman olarak her karakter)?
FliiFe

29
Elbette bu bulmacanın python'da bir cevabı olması gerekiyor mu?
saat

Yanıtlar:


11

APL, 55 bayt

{⍵[1↓(⊂0 0){1<⍴⍵:⍺,∆[⊃⍋+/¨|⍺-∆]∇∆←⍵~⍺⋄⍺}(,⍵≠' ')/,⍳⍴⍵]}

Bu işlev, içinde yılan yılanı olan bir karakter matrisini alır.

Örnek:

      s1 s2 s3
┌────────────┬──────────────┬────────────────────┐
│Hel         │P  ngPu  Code │   ~ zyx tsr XWVUTSR│
│  l      rin│r  i  z  d  G │   }|{ wvu q Y     Q│
│  o,IAmAst g│o  m  z  n  o │!          p Z `ab P│
│           S│gram  lesA  lf│"#$ 6789;: o [ _ c O│
│       !ekan│              │  % 5    < n \]^ d N│
│            │              │('& 432  = m     e M│
│            │              │)     1  > lkjighf L│
│            │              │*+,-./0  ?         K│
│            │              │         @ABCDEFGHIJ│
└────────────┴──────────────┴────────────────────┘
      ↑ {⍵[1↓(⊂0 0){1<⍴⍵:⍺,∆[⊃⍋+/¨|⍺-∆]∇∆←⍵~⍺⋄⍺}(,⍵≠' ')/,⍳⍴⍵]} ¨ s1 s2 s3 
Hello,IAmAstringSnake!                                                                        
ProgrammingPuzzlesAndCodeGolf                                                                 
!"#$%&'()*+,-./0123456789;:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefhgijklmnopqrstuvwxyz{|}~

Açıklama:

  • (,⍵≠' ')/,⍳⍴⍵: tüm boşluk olmayanların koordinatlarını al
  • (⊂0 0): (0,0) 'da başlar (geçersiz bir koordinattır)
  • {... }: pozisyonu ve yılanı verilen yılanı takip et:
    • 1<⍴⍵:: 1 öğeden fazla kalan varsa:
      • ∆←⍵~⍺: mevcut pozisyonu yılandan çıkarın ve saklayın .
      • +/¨|⍺-∆: Geçerli konum ve yılanın geri kalanındaki her nokta arasındaki mesafeyi bulun
      • ∆[⊃⍋...] `: yılanın en yakın noktasını bul
      • : fonksiyonu, yeni geçerli noktaya en yakın noktaya ve yeni yılana göre kısaltılmış yılana yakın tekrar çalıştırın.
      • ⍺,: sonucuna o anki pozisyonu ekle
    • ⋄⍺: aksi halde, sadece geçerli pozisyona geri dön
  • 1↓: sonuçtaki ilk öğeyi bırak ((0,0) pozisyonu)
  • ⍵[... ]: bu elemanları those'dan o sırayla al

24

JavaScript (ES6) + SnakeEx , 176 bayt

a=b=>snakeEx.run("s{A}:<+>([^ ]<P>)+",b).reduce((c,d)=>(e=c.marks.length-d.marks.length)>0?c:e?d:c.x+c.y>d.x+d.y?d:c).marks.reduce((c,d,e,f)=>e%2?c+b.split`\n`[d][f[e-1]]:c,"")

SnakeEx'i hatırladın mı? Güzel, çünkü ben de öyle! Golf önerileri kabul edilir.


19

MATL , 80 bayt

@LevelRiverSt 'a düzeltme için teşekkürler

32>2#fJ*+X:4Mt1Y6Z+l=*2#fJ*+ttXjwYj+K#X<)wt!"tbb6#Yk2#)yw]xxvtXjwYjqGZy1)*+Gw)1e

Giriş, 2B karakter dizisi gibidir, satırlarla ayrılır ;. Bu formattaki test durumları

['Hel         ';'  l      rin';'  o,IAmASt g';'           S';'       !ekan']
['Python']
['P  ngPu  Code ';'r  i  z  d  G ';'o  m  z  n  o ';'gram  lesA  lf']
['   ~ 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']
['  tSyrep    ';'  r    p    ';'  in Sli    ';'   g    Sile';'   Snakes  n';'Ser      ylt';'a eh   ilS  ';'fe w   t    ';'   emo h    ';'     Sre    ']

Çevrimiçi deneyin!

açıklama

Her bir boşluksuz karakterin koordinatları karmaşık bir sayı ile gösterilir. Her mevcut karakter için, bir sonraki en yakın olanı elde eder (karmaşık koordinatlarının minimum mutlak farkı).

İlk karakteri belirlemek için, iki bitiş noktasının bulunması gerekir. Bu şu şekilde yapılır. Bir bitiş noktası, tam olarak bir tane boşluksuz komşusu olan bir boşluksuz karakterdir. Komşuların sayısı 2B evrişim yoluyla uygun bir maske ile elde edilir. İlk nokta, karmaşık koordinatı gerçek ve hayali parçaların en az toplamına sahip olan uç noktadır; yani, Manhattan'a 0 numaralı kompleksle en yakın mesafede veya sol üst köşenin karmaşık koordinatı olan 1 + 1j'ye eşdeğerdir.

32>      % Take input as 2D char array. Compute 2D array with true for nonspace,
         % false for space
2#f      % Arrays of row and column indices of nonspaces
J*+      % Convert to complex array. Real part is row, imaginary part is column
X:       % Convert to column array
4Mt      % Push arrays of zeros and ones again. Duplicate
1Y6      % Push array [0 1 0; 1 0 1; 0 1 0]. Used as convolution mask to detect
         % neighbours that are nonspace
Z+       % 2D convolution with same size as the input
1=       % True for chars that have only one neighbour (endpoints)
*        % Multiply (logical and): we want nonspaces that are endpoints
2#fJ*+   % Find complex coordinates (as before)
ttXjwYj  % Duplicate. Take real and imaginary parts
+        % Add: gives Manhattan distance to (0,0)
K#X<     % Arg min. Entry with minimum absolute value has least Manhattan
         % distance to (0,0), and thus to (1,1) (top left corner)
)        % Apply as an index, to yield complex coordinate of initial endpoint
wt!      % Swap, duplicate, transpose.
         % The stack contains, bottom to top: complex coordinates of initial
         % endpoint, column array with all complex coordinates, row array of all
         % coordinates. The latter is used (and consumed) by the next "for"
         % statement to generate that many iterations
"        % For loop. Number of iterations is number of nonspaces
  tbb    %   Duplicate, bubble up twice (rearrange is stack)
  6#Yk   %   Find which of the remaining points is closest to current point. This
         %   is the next char in the string
  2#)    %   Remove the point with that index from the array of complex
         %   coordinates. Push that point and the rest of the array
  yw     %   Duplicate extracted point, swap
]        % End for
xx       % Delete top two elements of the stack
v        % Concatenate all stack contents into a column array. This array
         % contains the complex coordinates of chars sorted to form the string
tXjwYj   % Extract real part and imaginary part
GZy1)    % Number of rows of input. Needed to convert to linear index
*+       % Convert rows and columns to linear index
Gw       % Push input below that
)        % Index to get the original chars with the computed order
1e       % Force the result to be a row array (string). Implicitly display

Bir açıklama geleceğini varsayacağım?
Matt,

@Matt Sure ... günün ilerleyen saatlerinde :-)
Luis Mendo

Açıklama eklendi @Matt
Luis Mendo

The initial point is the endpoint whose complex coordinate has the least absolute valueDikkatli: Öklid mesafesi! = Manhattan mesafesi. örneğin, 7 + 7j noktası Öklid mesafesine 9.8994 ve Manhattan 14 mesafesine sahiptir. Bunun dışında harika bir konsept!
Seviye River St

@LevelRiverSt Teşekkürler! Düzeltildi
Luis Mendo

14

C 198 190 179 180 181 bayt

Düzenleme: ipucu user81655 tarafından kullandı ve üçlü operatörde parantezi kaldırdı, teşekkürler! Ben de daha uygun (ve daha kısa!)% 2 eşitlik için hantal (S & 1) testini değiştirdim.

Düzen2: * bir adresleme stilini yoğun bir şekilde kullanmak, beni S'in tanımındaki belirgin optimizasyonlara kör etti, yani, * (a + m) 'yi [m] ile değiştirdi. S'nin yarısı. Kod artık putchar değerinden de faydalanıyor.

Düzen3: Baştan beri olan sabit hata, Manhattan arama durdurma ölçütleri a <b + m yalnızca önceden azaltılmışsa doğrudur. Bu, 2 bayt ekler, ancak bir m global tanımını yaparak geri kazanılır.

Düzenleme4: Golfçüm minimum seviyeyi geçti ve şimdi yanlış yoldan gidiyor. Manhattan arama ile ilgili başka bir hata düzeltme. Başlangıçta yerinde kontroller yaptım ve bunlar olmadan arama b dizisinin ötesinde büyük girdi dizileri (50x50 civarında bir yerde) devam ediyor. Bu nedenle, bu dizinin önceki boyuttan en az iki katına genişletilmesi gerekir; bu, bir bayt daha ekler.

#define T(x)+x*((a[x]>32)-(a[-x]>32))
m=103;main(){char b[m<<8],*e=b,*a=e+m;while(gets(e+=m));for(e=a;(T(1)T(m))%2**a<33;a=a<b+m?e+=m:a)a-=m-1;for(;*a;a+=T(1)T(m))*a-=putchar(*a);}

Ungolfed ve açıkladı:

/* T(1)T(m) (formerly S) is used in two ways (we implicitly assume that each cell has
   one or two neighbors to begin with):
   1. (in the first for-loop) T(1)T(m) returns an odd (even) number if cell a has one (two)
      neighbors with ASCII value > 32. For this to work m must be odd.
   2. (in the second for-loop) at this stage each cell a in the array at which T(1)T(m) is
      evaluated has at most one neighboring cell with ASCII value > 32. T(1)T(m) returns the
      offset in memory to reach this cell from a or 0 if there is no such cell.
      Putting the + in front of x here saves one byte (one + here replaces two
      + in the main part)

#define T(x)+x*((a[x]>32)-(a[-x]>32))

  /* A snake of length 100 together with the newlines (replaced by 0:s in memory) fits
     an array of size 100x101, but to avoid having to perform out-of-bounds checks we
     want to have an empty line above and the array width amount of empty lines below
     the input array. Hence an array of size 202x101 would suffice. However, we save
     a (few) bytes if we express the array size as m<<8, and since m must be odd
     (see 1. above), we put m = 103. Here b and e point to the beginning of the (now)
     256x103 array and a points to the beginning of the input array therein */

m=103;
main()
{

  char b[m<<8],*e=b,*a=e+m;

  /* This reads the input array into the 256x103 array */

  while(gets(e+=m));

  /* Here we traverse the cells in the input array one
     constant-Manhattan-distance-from-top-left diagonal at a time starting at the top-left
     singleton. Each diagonal is traversed from bottom-left to top-right since the starting point
     (memory location e) is easily obtained by moving one line downwards for each diagonal
     (+m) and the stopping point is found by comparing the present location a to the input array
     starting position (b+m). The traversal is continued as long as the cell has either
     an ASCII value < 33 or it has two neighbors with ASCII value > 32 each (T(1)T(m)
     is even so that (T(1)T(m))%2=0).
     Note that the pointer e will for wide input arrays stray way outside (below) the
     input array itself, so that for a 100 cell wide (the maximum width) input array
     with only two occupied cells in the bottom-right corner, the starting cell
     will be discovered 98 lines below the bottom line of the input array.
     Note also that in these cases the traversal of the diagonals will pass through the
     right-hand side of the 103-wide array and enter on the left-hand side. This, however,
     is not a problem since the cells that the traversal then passes have a lower
     Manhattan distance and have thereby already been analyzed and found not to contain
     the starting cell. */

  for(e=a;(T(1)T(m))%2**a<33;a=a<b+m?e+=m:a)a-=m-1;

  /* We traverse the snake and output each character as we find them, beginning at the
     previously found starting point. Here we utilize the function T(1)T(m), which
     gives the offset to the next cell in the snake (or 0 if none), provided that
     the current cell has at most one neighbor. This is automatically true for the
     first cell in the snake, and to ensure it for the rest of the cells we put the
     ASCII value of the current cell to 0 (*a-=putchar(*a)), where we use the fact
     that putchar returns its argument. The value 0 is convenient, since it makes the
     stopping condition (offset = 0, we stay in place) easy to test for (*a == 0). */

  for(;*a;a+=T(1)T(m))
    *a-=putchar(*a);
}

1
Bu cevap harika.
saat

+1 Bu harika. Çözümünüze göre bayt'ı nerede beklediğimi gösteren cevabımı açıklama yapmak istiyorum, tamam mı?
16'da

MIllIbyte - yorum eklemek için çekinmeyin, bu yeni fikirlere giden yoldur.
Zunga

user81655 - Bahşiş için teşekkürler, 6 bayt ile tıraş oldu. Aslında, dün ve eşitlik testi için 2 bayt tıraşlayan (S & 1) yerine S% 2 kullanmaya çalıştım, ama bir nedenden ötürü (kodum başka bir yerde buggy'di) ne işe yaradı? Şimdi, ancak her şey yolunda görünüyor.
Zunga

Çok hoş. a[1], a[-m]Vs. ile biraz daha fazlasını kazanın ve mglobal hale getirin - m=103;main().
ugoren

9

C, 272 bayt

#define E j+(p/2*i+1)*(p%2*2-1)
#define X(Y) a[Y]&&a[Y]-32
char A[999],*a=A+99;j,p,t;i;main(c){for(;gets(++j+a);j+=i)i=strlen(a+j);for(c=j;j--;){for(t=p=4;p--;)t-=X(E);t==3&&X(j)?c=c%i+c/i<j%i+j/i?c:j:0;}for(j=c;c;){putchar(a[j]),a[j]=0;for(c=0,p=4;!c*p--;)X(E)?c=j=E:0;}}

@ Zunga'nın kaynağına bak. Şimdi benimkine bak. Fazladan 91-baytı nasıl aldığımı bilmek ister misin?
Ungolfed:

#define E j+(p/2*i+1)*(p%2*2-1)
#define X(Y) a[Y]&&a[Y]-32  //can be more concise, see @Zunga's
  //and then doesn't need the define
char A[999],*a=A+99;j,p,t;i;
main(c){for(;gets(++j+a);j+=i)
i=strlen(a+j); //we don't need to know the length of a line
  //in @Zunga's solution, lines are spaced a constant distance apart
for(c=j;j--;){
for(t=p=4;p--;)t-=X(E);  //a ton of bytes can be saved with determining 
  //the neighbors, see @Zunga's source
t==3&&X(j)?
c=c%i+c/i<j%i+j/i?c:j:0;}  //we search for ends of the snake, 
  //and compute the Manhattan distance
for(j=c;c;){putchar(a[j]),a[j]=0;
for(c=0,p=4;!c*p--;)  //determining the neighbors again
X(E)?c=j=E:0;}}

5

Python (2 ve 3), 640 624 604 583 575 561 546 538 bayt

Ben hala bir golf n00b yaşıyorum bu yüzden bu biraz büyük.

Düzenleme: Önerileriniz için @porglezomp 'a teşekkürler ! Tüm 've' işleçlerini Python 3'ü kıracak şekilde kaldırmadım.

Düzenleme2 : isspace () hakkındaki yorumunuz için @Aleksi Torhamo'ya teşekkürler . Ortaya çıkan azalma, koyduğum hata düzeltmesini telafi ediyor. Ayrıca sözdizimi vurgulaması için anonim teşekkürler!

Düzen3: Birkaç ek bayt için @ mbomb007 'e teşekkürler .

import sys;s=sys.stdin.read().split('\n');m={};q=[];o=len;j=o(s);r=range;g='!'
for y in r(j):
 v=s[y];f=o(v);d=y+1
 for x in r(f):
  n=[];a=n.append;U=s[y-1]
  if v[x]>=g:j>=y>0==(U[x]<g)<=x<o(U)and a((x,y-1));j>y>=0==(v[x-1]<g)<x<=f and a((x-1,y));j>y>-1<x+1<f>(v[x+1]<g)<1and a((x+1,y));j>d>-1<x<o(s[d])>(s[d][x]<g)<1and a((x,d));m[x,y]=[v[x],n];o(n)-1or q.append((x,y))
t=min(q,key=sum);w=sys.stdout.write;w(m[t][0]);c=m[t][1][0]
while o(m[c][1])>1:
 b=m[c][1];w(m[c][0])
 for k in r(o(b)):
  if b[k]!=t:t=c;c=b[k];break
print(m[c][0])

Ve işte golf öncesi versiyonum

import sys

lines = sys.stdin.read().split('\n')
startend = []
mydict = {}
for y in range( 0, len(lines)):
  for x in range( 0, len(lines[y])):
    if not lines[y][x].isspace():
      neighbors = []
      if x>=0 and x<len(lines[y-1]) and y-1>=0 and y-1<len(lines):
        if not lines[y-1][x].isspace():
          neighbors.append( (x,y-1) )
      if x-1>=0 and x-1<len(lines[y]) and y>=0 and y<len(lines):
        if not lines[y][x-1].isspace():
          neighbors.append( (x-1,y) )
      if x+1>=0 and x+1<len(lines[y]) and y>=0 and y<len(lines):
        if not lines[y][x+1].isspace():
          neighbors.append( (x+1,y) )
      if x>=0 and x<len(lines[y+1]) and y+1>=0 and y+1<len(lines):
        if not lines[y+1][x].isspace():
          neighbors.append( (x,y+1) )
      mydict[(x,y)] = [ lines[y][x], neighbors ]

      if len( neighbors ) == 1:
        startend.append( (x,y) )

startend.sort( key=lambda x : x[0]*x[0] + x[1]*x[1] )

last = startend[0]
sys.stdout.write( mydict[ last ][0] )
current = mydict[last][1][0]
while len( mydict[current][1] ) > 1:
  sys.stdout.write( mydict[current][0] )
  for k in range( 0, len( mydict[current][1] ) ):
    if mydict[current][1][k] != last:
      last = current
      current = mydict[current][1][k]
      break

print(mydict[current][0])

1
S=lambda s:s.isspace()Tanıtıp S(s)yerine yaparak 12 bayt kurtardım s.isspace().
porglezomp

1
Ben aynı zamanda tüm değiştirebilir düşünmek and To <beri f() < g() < h()aynıdır g = g(); f() < g and g < h()yan etkiler açısından (karşılaştırma zincirleri kısa devre) 'de ve yine karşılaştırmaların sonucunu görmezden geliyorsunuz.
porglezomp

1
m[(x,y)]=kısa m[x,y]=
olanlarla

2
@ porglezomp: söylemesi daha da kısaS=str.isspace
Aleksi Torhamo,

1
Çıkarma Sve <'!'her durumda kullanma , aynı uzunlukta olabilir ve muhtemelen daha fazla tasarruf etme fırsatı sunar. Değiştirilmesi if 1-S(v[x]):için if(v[x]<'!')<1:, örneğin. Belki bazı parantezleri sonraki karşılaştırmalarda bu şekilde yaparak kaldırabilirsiniz.
mbomb007

4

JavaScript (ES6), 195

Test snippet'inin içindeki açıklamaya bakın

s=>[...s].map((c,i)=>{if(c>' '&([n=-1,1,o=-~s.search('\n'),-o].map(d=>n+=s[i+d]>' '&&!!(e=d)),n<1)&m>(w=i/o+i%o|0))for(m=w,r=c,p=i+e;r+=s[i=p],[e,o/e,-o/e].some(d=>s[p=i+(e=d)]>' '););},m=1/0)&&r

Ölçek

f=s=>[...s].map((c,i)=>{if(c>' '&([n=-1,1,o=-~s.search('\n'),-o].map(d=>n+=s[i+d]>' '&&!!(e=d)),n<1)&m>(w=i/o+i%o|0))for(m=w,r=c,p=i+e;r+=s[i=p],[e,o/e,-o/e].some(d=>s[p=i+(e=d)]>' '););},m=1/0)&&r

// Less golfed

u=s=>(
  o = -~s.search('\n'), // offset between lines
  m = 1/0, // current min manhattan distance, init at infinity
  // scan input looking for the 2 ends of the string
  [...s].map((c,i)=>{ // for each char c at position i
     if(c > ' ' // check if part of the string
        & ( [-1,1,o,-o] // scan in 4 directions and count neighbors
             .map(d=> n+=s[i+d]>' '&&!!(e=d), n=0), // remember direction in e
          n < 2) // if at end of string will have exactly 1 neighbor
        & (w = i/o + i%o |0) < m) // manhattan distance in w, must be less than current min
       // found one of the ends, follow the path and build the string in r
       for(m = w, r = c, p = i+e; 
           r += s[i=p], 
           [e,o/e,-o/e] // check 3 directions, avoiding to go back
           .some(d=>s[p=i+(e=d)]>' '); // save candidate position and direction in p and e
          ); // empty for body, all the work is inside the condition
  }),
  r
)  

console.log=x=>O.textContent+=x+'\n'

;[`Hel         
  l      rin
  o,IAmASt g
           S
       !ekan`,
 `   ~ 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`].forEach(t=>{
  console.log(t+'\n\n'+f(t)+'\n')
  })
<pre id=O></pre>


Noktalı virgüller ););}gerekli mi?
Cees Timmerman

1
@CeesTimmerman evet. Birincisi for2 kolonun gerektiği başlığın içinde . İkinci forvücut için
sınırlayıcıdır

3

Lua, 562 535 529 513 507 504 466 458 Bayt

Şu ana kadarki en büyük golf oyunuma kadar , hala çalışacağım 100 baytı kesebileceğimi düşünüyorum, fakat bunu zaten biraz zaman aldı gibi bir cevap olarak gönderiyorum :). Haklıydım, 100 bayttan fazla veri kesdim! İyileştirilecek çok yer olduğunu sanmıyorum.

bu fonksiyon hücre başına bir karakter içeren bir 2D dizi ile çağrılmalıdır.

@KennyLau ile çalışırken 40 byte kurtarıldı , onun için teşekkürler!

Bravo! 500'ün altında!

function f(m)t=2u=1i=1j=1s=" "::a::if s~=m[i][j]and(i<#m and m[i+1][j]~=s)~=(j<#m[i]and m[i][j+1]~=s)~=(i>1 and m[i-1][j]~=s)~=(j>1 and m[i][j-1]~=s)then goto b end
i,t=i%t+1,#m>t and t==i and t+1or t j=j>1 and j-1or u u=u<#m[1]and j==1 and u+1or u goto a::b::io.write(m[i][j])m[i][j]=s
i,j=i<#m and s~=m[i+1][j]and i+1or i>1 and s~=m[i-1][j]and i-1or i,j<#m[i]and s~=m[i][j+1]and j+1or j>1 and s~=m[i][j-1]and j-1or j
if s==m[i][j]then return end goto b end

Ungolfed

Açıklamalar bir kere golf oynamayı bitirdikten sonra gelecek, şimdilik, size bu kaynak kodun okunabilir bir versiyonunu ödünç vereceğim: D İşte açıklamalar!

Düzenleme: en son değişikliklerle güncellenmedi, güncellemeden önce hala golf. Aynı açıklamalar için de geçerli

function f(m)                    -- declare the function f which takes a matrix of characters
  t=2                            -- initialise the treshold for i
                                 -- when looking for the first end of the snake
  u=1                            -- same thing for j
  i,j=1,1                        -- initialise i and j,our position in the matrix
  s=" "                          -- shorthand for a space
  ::a::                          -- label a, start of an infinite loop
    if m[i][j]~=s                -- check if the current character isn't a space
      and(i<#m                   -- and weither it is surrounded by exactly
          and m[i+1][j]~=s)      -- 3 spaces or not
      ~=(j<#m[i]
          and m[i][j+1]~=s)      -- (more explanations below)
      ~=(i>1 
          and m[i-1][j]~=s)
      ~=(j>1
          and m[i][j-1]~=s)
      then goto b end            -- if it is, go to the label b, we found the head
    i,t=                         -- at the same time
      i%t+1,                     -- increment i
      #m>t and t==i and t+1or t  -- if we checked all chars in the current range, t++
    j=j>1 and j-1or u            -- decrement j
    u=u>#m[1]and j==1 and u+1or u-- if we checked all chars in the current range, u++
  goto a                         -- loop back to label a

  ::b::                          -- label b, start of infinite loop
  io.write(m[i][j])                    -- output the current char
    m[i][j]=s                    -- and set it to a space
    i,j=i<#m                     -- change i and j to find the next character in the snake
          and m[i+1][j]~=s       -- this nested ternary is also explained below
            and i+1              -- as it takes a lot of lines in comment ^^'
          or i>1 
            and m[i-1][j]~=s
            and i-1
          or i,
       j<#m[i] 
         and m[i][j+1]~=s
           and j+1
         or j>1 
           and m[i][j-1]~=s 
           and j-1
         or j
    if m[i][j]==s                -- if the new char is a space
    then                         -- it means we finished
      return                  -- exit properly to avoid infinite
    end                          -- printing of spaces
  goto b                         -- else, loop back to label b
end

İşte bu programın nasıl çalıştığı hakkında bazı ayrıntılı açıklamalar geliyor.

Öncelikle, etiketli döngüyü düşünelim, asol üst köşeye en yakın ucu bulmamıza izin veriyor. Sonu yoksa sonsuza dek döngüde kalacaktır, ancak bu bir problem değil: D.

4x4 ızgarada, burada yılan mesafeleri (solda) ve bakılma sırası (sağda).

1  2  3  4    |     1  2  4  7
2  3  4  5    |     3  5  8 11
3  4  5  6    |     6  9 12 14
4  5  6  7    |    10 13 15 16

Bu karakterin her biri için, son olarak, iki koşulu kontrol etmek zorundadır: - Boşluk olmamak - Tam olarak 3 boşlukla (veya tam olarak 1 boşluksuz) çevrelenmek

Bu koşullar aşağıdaki kod parçasını kontrol eder

r=m[i][j]~=s
    and(i<#m and m[i+1][j]~=s)
    ==not(j<#m[i] and m[i][j+1]~=s)
    ==not(i-1>0 and m[i-1][j]~=s)
    ==not(j-1>0 and m[i][j-1]~=s)
    and m[i][j]
    or r
  -- special note: "==not" is used as an equivalent to xor
  -- as Lua doesn't know what is a xor...

Karakterin boşluk olup olmadığını kontrol etmek, ifade ile sağlanır m[i][j]~=s.

W'nin sadece 1 boşluksuz tarafından çevrilip çevrilmediğini kontrol etmek, çevremiz için yukarıdaki şartları yerine getirerek sağlanır;

m[i+1][j]~=" "  m[i][j+1]~=" "  m[i-1][j]~=" "  m[i][j-1]~=" "

Ve son olarak, yukarıdakilerin tümü doğru olarak değerlendirilirse, üçlü sondakileri geri döndürür and-> m[i][j]. Aksi takdirde, izin vermeyelim r:)

Şimdi yılanın başı bizde, hadi sonuna kadar gidelim! Yılanı yinelemek esas olarak şu iç içe geçmiş üçlüler tarafından sağlanır:

i,j=i<#m and m[i+1][j]~=s and i+1or i-1>0 and m[i-1][j]~=s and i-1or i,
    j<#m[i]and m[i][j+1]~=s and j+1or j-1>0 and m[i][j-1]~=s and j-1or j

Eski değerleri saklamak için aptallara ihtiyaç duymamak için yeniden ayarladık ive jaynı anda hem yapıya sahipler, hem de basit koşullar kullanıyorlar, bu yüzden bunları iç içe şeklinde sunacağım, bunları ifokumanıza izin vermeli daha kolayca. :)

i=i<#m and m[i+1][j]~=s and i+1or i-1>0 and m[i-1][j]~=s and i-1or i

Çevrilebilir:

if(i<#m)
then
  if(m[i+1][j]~=" ")
  then
    i=i+1
  end
elseif(i-1>0)
then
  if(m[i-1][j]~=" ")
  then
    i=i-1
  end
end

Dene!

İşte bunu çalıştırmak için kullandığım kod, çevrimiçi kopyalayıp yapıştırarak test edebilirsiniz .

function f(m)t=2u=1i=1j=1s=" "::a::if s~=m[i][j]and(i<#m and m[i+1][j]~=s)~=(j<#m[i]and m[i][j+1]~=s)~=(i>1 and m[i-1][j]~=s)~=(j>1 and m[i][j-1]~=s)then goto b end
i,t=i%t+1,#m>t and t==i and t+1or t j=j>1 and j-1or u u=u<#m[1]and j==1 and u+1or u goto a::b::io.write(m[i][j])m[i][j]=s
i,j=i<#m and s~=m[i+1][j]and i+1or i>1 and s~=m[i-1][j]and i-1or i,j<#m[i]and s~=m[i][j+1]and j+1or j>1 and s~=m[i][j-1]and j-1or j
if s==m[i][j]then return end goto b end


test1={}
s1={
"  tSyrep    ",
"  r    p    ",
"  in Sli    ",
"   g    Sile",
"   Snakes  n",
"Ser      ylt",
"a eh   ilS  ",
"fe w   t    ",
"   emo h    ",
"     Sre    ",
     }
for i=1,#s1
do
  test1[i]={}
  s1[i]:gsub(".",function(c)test1[i][#test1[i]+1]=c end)
end
f(test1)

1
Dil seçimi nedeniyle şu an için çok az seçeneğe sahip uzun cevaplar için yumuşak bir nokta var.
Matt,

@Matt destek için çok teşekkürler! Aslında, hala bu golf oynamak için yollar buluyorum, ancak daha da zorlaşıyor!
Katenkyo

2

Lua, 267 bayt

Lua 5.3 gereklidir.

e=" "w=#arg[1]+1i=1/0q=0s=table.concat(arg,e)s=e:rep(#s)..s
m,n=i,{}for p in s:gmatch"()%g"do u=-1
for _,d in ipairs{-1,1,-w,w}do u=u+(s:find("^%S",d+p)or 0)end
n[p]=u+1m=math.min(m,p*i^(u//#s)+(p%w*w+p)*#s)end
p=m%#s repeat q,p=p,n[p]-q io.write(s:sub(q,q))until p<1

Kullanımı:

$ lua desnakify.lua \
>    "  tSyrep    " \
>    "  r    p    " \
>    "  in Sli    " \
>    "   g    Sile" \
>    "   Snakes  n" \
>    "Ser      ylt" \
>    "a eh   ilS  " \
>    "fe w   t    " \
>    "   emo h    " \
>    "     Sre    "
SlipperyStringSnakesSilentlySlitherSomewhereSafe

2

Python 3, 245 243 241 236 bayt

sGiriş dizesi, nçıktı stdout'a yazdırılıyor:

f=s.find
w,l=f('\n')+1,len(s)
t=1,w,-1,-w
y=z=f(s.strip()[0]);n=s[y];v={y}
for i in range(l*l):
 i%=l;c=s[i]
 if c>' 'and i not in v:
  if i-y in t:y=i;n=c+n;v|={i}
  elif i-z in t:z=i;n+=c;v|={i}
if y%w+y//w>z%w+z//w:n=n[::-1]
print(n)

Düzenleme: 5 bayt tasarruf için @Cees Timmerman teşekkürler!


c>' 'andve print nPython 2'de.
Cees Timmerman,

Eğer yapamaz ifyerine elif?
clismique,

@ Qwerp-Derp ne yazık ki hayır, daha önce denedim, ancak örneğin "! EkanSgnirtSAmAI, olleHello, IAmAStringSnake!" ve "SlipperyStSyreppilS".
16'da

Giriş formatı nedir?
clismique

@ Qwerp-Derp sdeğişkeni çok satırlı bir dizedir; dizenin son karakteri yeni bir satır olmalıdır (bu, Pythontest durumunun geçmesi için gereklidir )
pgks

1

Python, 537

İlk çözümüm:

from itertools import chain, product, ifilter
from operator import add
moves = ((1,0),(0,1),(-1,0),(0,-1))
h = dict(ifilter(lambda (p,v):not v.isspace(),chain(*map(lambda (i,r):map(lambda (j,c):((i,j),c),enumerate(r)),enumerate(s)))))
n = defaultdict(list)
for m,p in product(moves, h):
    np = tuple(map(add,m,p))
    if np in h:
        n[p].append(np)
def pr(nx):
    return(lambda l:(h[l[0]], h.pop(l[0]))[0] + pr(l[0]) if l else '')([x for x in n[nx] if x in h])
(lambda y: h[y]+ pr(y))(next(x for x in n if len(n[x])==1))

Biraz sıkıştırılmış, ancak bir yöntem olarak bıraktı:

from itertools import chain, product
from operator import add
def unsnake(s):
    (h,n) = (dict(filter(lambda (p,v):not v.isspace(),chain(*map(lambda (i,r):map(lambda (j,c):((i,j),c),enumerate(r)),enumerate(s))))),defaultdict(list))
    for m,p in product(((1,0),(0,1),(-1,0),(0,-1)), h):(lambda np: n[p].append(np) if np in h else 0)(tuple(map(add,m,p)))
    def pr(nx):return(lambda l:(h[l[0]], h.pop(l[0]))[0] + pr(l[0]) if l else '')([x for x in n[nx] if x in h])
    return(lambda y: h[y]+ pr(y))(next(x for x in n if len(n[x])==1))

1

Java 7, 927 924 923 bayt

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);}

Tamam, bu biraz zaman aldı. Bazı programlama dillerinde, x ve y dizilerinin 2B dizisinin sınırları dışında olup olmadığı önemli değil, fakat Java ile birlikte atlar ArrayIndexOutOfBoundsExceptions, bu yüzden her şeyin kontrol edilmesi gerekir.

Önce başlangıç ​​noktasını belirledim, sonra dizgiyi oradan inşa etmek için özyinelemeli bir yöntem kullanıyorum. Ek olarak, daha önce karşılaştığım koordinatları takip etmek için bir liste kullanıyorum, bu yüzden ileri geri bir döngüye girmeyecek (bir StackOverflowException ile sonuçlanacak).

Bu muhtemelen şu ana kadar yayınladığım en uzun cevaptı, ancak bazı kısımlar golf oynayabilse de, bu zorluğun Java'da bu kadar kısa olabileceğini sanmıyorum. Java sadece bir ızgarada bir yolu takip etmek için uygun değildir. Yine de anlamak eğlenceli bir işti. :)

Ungolfed ve test durumları:

Burada dene.

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    " }));
  }
}

Çıktı:

Hello,IAmAStringSnake!
Python
ProgrammingPuzzlesAndCodeGolf
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
SlipperyStringSnakesSilentlySlitherSomewhereSafe

924 bayt, isa mesih ... lol
Shaun Wild

@BasicallyAlanTuring Hehe. Ben sadece meydan okudum, kod yazdım ve bayt sayımına baktım. Gerçekten beklenenden çok daha fazlaydı, ama peki, en azından 1k'nin altındaydı ... Geliştirecek bir şey görürseniz, bana bildirin ve (çok) daha az bayt ile alternatif bir yaklaşımınız varsa, ayrı bir şey yapmaktan çekinmeyin İleti; Görmek isterim. Not: Şimdi 923 bayt. XD
Kevin Cruijssen 30:16

Her şeyi kontrol etmeye gerek yok , dizginize sadece bir miktar dolgu ekleyin. Muhtemelen tek bir çok satırlı dize kullanmak, bunu kolaylaştırır. Javascript'ten
yazılmış

1

PHP, 199 184 182 bayt

hala biraz golf potansiyeli olabilir

for($w=strpos($i=$argv[1],"
");;)for($y=++$n;$y--;)if($i[$p=$y*$w+$n-1]>" ")break 2;for($p-=$d=$w++;$d&&print$i[$p+=$e=$d];)foreach([-$w,-1,1,$w,0]as$d)if($d+$e&&" "<$i[$d+$p])break;

girdiyi komut satırından çok satırlı dizge olarak alır, linux stil satır çizgilerini bekler.
Çalıştır php -r '<code>' '<string>'; satırlardan kaçış.

Yıkmak

for(
    // find width
    $w=strpos($i=$argv[1],"\n")
    ;
    // find first character: initialize $p(osition)
    ;
)
    for($y=++$n             // increase distance
        ;$y--;)             // loop $y from (old)$n to 0
        if(" "<$i[$p=$y*$w+$n   // if character at $y*($width+1)+$x(=$d-$y) is no space
            -1                  // (adjust for the premature increment)
        ])
            break 2;                    // break loops

for(
    $p-=            // b) reverse the increment that follows in the pre-condition
    $d=             // a) initialize $d to anything!=0 to enable the first iteration
    $w++;           // c) increase $w for easier directions
    $d              // loop while direction is not 0 (cursor has moved)
    &&
    print$i[$p+=$e=$d]              // remember direction, move cursor, print character
    ;
)
    foreach([-$w,-1,1,$w,0]as$d)// loop through directions
        if($d+$e                    // if not opposite previous direction
            &&" "<$i[$d+$p]         // and character in that direction is not space
        )break;                     // break this loop

1

C #, 310

(Düzenleme: hata düzeltme)

Çok satırlı bir string parametresi olan ve bir dize döndüren bir işlev.

İstenen usingbayt sayısına dahil.

Bu, javascript cevabımın bir tasviridir.

using System.Linq;
string f(string s){int o=-~s.IndexOf('\n'),m=99;var r=new string(' ',o);(s=r+s+r).Select((c,i)=>{int n=2,e=0,p,w=i%o+i/o;if(c>' '&w<m&&new[]{-1,1,o,-o}.All(d=>(s[i+d]>' '?(e=d)*--n:n)>0))for(m=w,r=""+c+s[p=i+e];new[]{e,o/e,-o/e}.Any(d=>s[p+(e=d)]>' ');)r+=s[p+=e];return i;}).Max();return r;}

İdeone Testi

Boşlukları ile

    string f(string s)
    {
        int o = -~s.IndexOf('\n');
        var r = new string(' ', o);
        var m = 99;
        (s = r + s + r).Select((c, i) =>
        {
            int n = 2, e = 0, p, w = i % o + i / o;
            if (c > ' ' & w < m & new[] { -1, 1, o, -o }.All(d => (s[i + d] > ' ' ? (e = d) * --n : n) > 0))
                for (m = w, r = "" + c + s[p = i + e]; 
                     new[] { e, o / e, -o / e }.Any(d => s[p + (e = d)] > ' '); 
                     ) 
                   r += s[p += e];
            return i;
        }
        ).Max();
        return r;
    }

1

Python 2,251 bayt

w=s.find('\n')+1;q=' ';p=q*w+'\n';s=list(p+s+p);d=-w,1,w,-1
def r(x):c=s[x];s[x]=q;v=[c+r(x+o)for o in d if s[x+o]>q];return v[0]if v else c
e=[x for x in range(len(s))if s[x]>q and sum([s[x+o]>q for o in d])<2]
print r(e[e[0]/w+e[0]%w>e[1]/w+e[1]%w])

Veya, test vitrilerinizde lider yeni satırlar istiyorsanız, 257 bayt:

w=s.find('\n',1);q=' ';p=q*-~w+'\n';s=list(p+s[1:]+p);d=-w,1,w,-1
def r(x):c=s[x];s[x]=q;v=[c+r(x+o)for o in d if s[x+o]>q];return v[0]if v else c
e=[x for x in range(len(s))if s[x]>q and sum([s[x+o]>q for o in d])<2]
print r(e[e[0]/w+e[0]%w>e[1]/w+e[1]%w])

Tüm test durumlarını geçiyor.

s="""
  tSyrep    
  r    p    
  in Sli    
   g    Sile
   Snakes  n
Ser      ylt
a eh   ilS  
fe w   t    
   emo h    
     Sre    
"""

Sonuçlar:

SlipperyStringSnakesSilentlySlitherSomewhereSafe

3
Sanırım b.append(...)ile b+=[...]ve def n(x,y):return ...onunla değiştirebilirsinn=lambda x,y:...
akrolit

1
İçin bir değişken oluşturun ' '.
pacholik

1
ve ~-xyerine, x-1parantez kullanmak zorunda kalmazsınız.
pacholik

0

Japt -P , 106 bayt

K=U·ÌÊÄ ç iU ¬mx T=[-KJ1K]
ËÊ*Tm+E è@gX
[]V£YÃf@gXÃrQ@WpQ Tm+Q kW fZ Ì}V£[XYuK YzK]ÃkÈv ÉÃñx v rÈ+Y*K
W£gX

Çevrimiçi deneyin!

Bu ... um ... bir kötülük.

Ambalajsız ve Nasıl Çalışır?

K=UqR gJ l +1 ç iU q mx
  UqR gJ l +1            Split the input by newline, take last item's length +1
K=                       Assign to K
              ç iU       Generate a string of K spaces, and append to U
                   q mx  Split into chars, and trim whitespaces on each item
                         Implicit assign to U

T=[-KJ1K]  Assign an array [-K, -1, 1, K] to T (this represents 4-way movement)
           I could use implicit assignment, but then 4-argument function below is broken

UmDEF{Dl *Tm+E èXYZ{UgX
UmDEF{                   Map over the list of one- or zero-length strings...
      Dl *                 If the length is zero, return zero
          Tm+E             Add the index to each element of T
               èXYZ{UgX    Count truthy elements at these indices
                         The result is an array of 0(space/newline), 1(start/end), or 2(body)
                         Implicit assign to V

[]  Implicit assign to W

VmXYZ{Y} fXYZ{UgX} rQXYZ{WpQ Tm+Q kW fZ gJ }
VmXYZ{Y}                                      Map V into indices
         fXYZ{UgX}                            Filter the indices by truthiness of U's element
                   rQXYZ{                     Reduce on the indices... (Q=last item, Z=array)
                         WpQ                    Push Q to W
                             Tm+Q               Take 4-way movements from Q
                                  kW fZ gJ }    Exclude visited ones, take last one in Z

VmXYZ{[XYuK YzK]} kXYZ{Xv -1} ñx v rXYZ{X+Y*K  Starting point of reduce
VmXYZ{[XYuK YzK]}                              Convert elements of V to [elem, col, row]
                  kXYZ{Xv -1}                  Take the ones where elem(popped)=1
                              ñx v             Sort by row+col and take first one
                                   rXYZ{X+Y*K  Convert [row,col] back to the index

WmXYZ{UgX  Map indices back to chars

-P  Join with empty string

Dikkat çeken noktalardan biri, bazı satırları paketlemek ve kısayolu @( XYZ{) kullanılabilir kılmak için JS'deki atama ve virgül operatörleri arasındaki operatör önceliğini kullanmamdır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.