Gra w punkty Conwaya!
Spoczywaj w pokoju, Johnie Hortonie Conway
Istnieje mnóstwo różnych tłumaczy Game of Life! Ton !
Obecnie dla Ciebie znalezienie tłumacza to zaledwie kilkanaście typów i kilka kliknięć.
Ale czekaj, czy zauważysz coś powszechnego u tłumaczy? Każdy interpreter jest graficzny , tzn. Są tylko obrazy i nie ma tekstu ASCII!
Problem
Ciekawostka: podczas pisania tego pytania byłem w trakcie tworzenia interpretera 2DF w moim ulubionym praktycznym języku programowania . 2DF ma polecenie, które wykonuje krok Gry w Życie na swoim polu pamięci. Musiałem zaimplementować to polecenie w moim kodzie. Jeszcze tego nie zrobiłem, więc to pytanie jest technicznie bardziej aktualnym pytaniem niż wyzwaniem.
Mam listę punktów lub współrzędnych na płaszczyźnie kartezjańskiej . Każdy punkt ma wartość X i Y. To jest twój wkład! Dane wejściowe mogą być sformatowane w jakikolwiek sposób (możesz użyć dowolnego typu formatowania, więc określ swój format w odpowiedziach).
Przykładowy format wejściowy:
[[0, 0], [1, 0], [2, 0], [2, 1], [1, 2]]
To jest przedstawienie okresu Glider (Logo Hakera). Narysuj punkty na siatce, a zobaczysz kształt podobny do tego:
To, czego chcę, to ta sama lista, ale zmodyfikowana! To są kroki modyfikacji.
- Nowy punkt jest dodawany, jeśli ma dokładnie trzech istniejących sąsiadów.
- Istniejący punkt jest usuwany, jeśli ma więcej niż trzech lub mniej niż dwóch istniejących sąsiadów.
Co to jest sąsiad?
Sąsiad punktu X definiuje się jako punkt sąsiadujący z X w poziomie, w pionie lub po przekątnej. Sąsiedzi punktu \$(2, 3)\$ są:
- \$(1, 3)\$
- \$(1, 2)\$
- \$(2, 2)\$
- \$(3, 2)\$
- \$(3, 3)\$
- \$(3, 4)\$
- \$(2, 4)\$
- \$(1, 4)\$
W takim przypadku wynik powinien wyglądać podobnie do tego:
[[1, 0], [2, 0], [2, 1], [0, 1], [1, -1]]
Zadanie
Napisz program lub zaimplementuj funkcję, która pobiera listę punktów i drukuje lub zwraca listę punktów, która wyświetla zmodyfikowaną listę zgodnie z powyższymi regułami modyfikacji (kolejność listy wyników nie ma znaczenia).
Aha, i postaraj się, aby kod był jak najkrótszy! ( code-golf)
PS Byłoby wspaniale, gdybyś zawarł w odpowiedzi wyjaśnienie swojego programu!
Niektóre przykładowe przypadki testowe
Example STDIN Example STDOUT
[[0, 0]] => []
[[0, 0], [0, 1]] => []
[[0, 0], [0, 1], [1, 0]] => [[0, 0], [0, 1], [1, 0], [1, 1]]
[[0, 0], [0, 1], [1, 0], [1, 1]] => [[0, 0], [0, 1], [1, 0], [1, 1]]
[[0, 0], [0, 1], [0, -1]] => [[0, 0], [1, 0], [-1, 0]]
[[1, 0], [1, 1], [1, 2]] => [[2, 1], [1, 1], [0, 1]]
Powodzenia! :)
Odpowiedzi
APL (Dyalog Extended) , 34 32 bajty ( SBCS )
Anonimowa funkcja milczącego prefiksu. Wymaga ⎕IO←0(indeksowanie od zera).
⌊/{⍺-1-⍸⌂life 0,∘⌽∘⍉⍣4⍸⍣¯1∧⍵-⍺}⊢
Wypróbuj online!
⌊/{… }⊢ Wywołaj następującą anonimową lambdę z najmniejszymi istniejącymi współrzędnymi xiy jako lewy argument ( ⍺) i pełną listą jako prawy argument ( ⍵):
⍵-⍺ odejmij najmniejszy punkt od wszystkich punktów (skala, aby każda liczba była nieujemna)
∧ sortuj rosnąco
⍸⍣¯1 wygenerować macierz boolowską z 1 w tych pozycjach (dosł. odwrotność „ ɩ ndices of 1s”)
0… ⍣4 Powtórz cztery razy z zerem jako lewym argumentem:
… ∘⍉ Więc transponuj
… ∘⌽ Zwierciadło (co stanowi obrót o 90 ° w prawo)
… , Połącz zera do lewej krawędzi
⌂life obliczyć następną generację Game of Life
⍸ ɩ ndices of 1s
1- odejmij te od 1
⍺- odejmij je od przesunięcia najniższych współrzędnych x i y
Łuska , 17 bajtów
uṠfo≈6#-¹×z+π2ṡ1D
Wypróbuj online! Zauważ, że interpreter nie lubi dodatkowych spacji w danych wejściowych.
Wyjaśnienie
uṠfo≈6#-¹×z+π2ṡ1D Input is a list of lists, e.g. L=[[0,0],[1,0],[2,1]]
D Repeat twice: X=[[0,0],[1,0],[2,1],[0,0],[1,0],[2,1]]
ṡ1 Symmetric range to 1: [-1,0,1]
π2 Cartesian second power: [[-1,-1],[-1,0],…,[1,1]]
× Pick all elements from this and X and combine with
z+ zipping by addition: [[-1,-1],[0,-1],…,[3,2]]
-¹ Remove one occurrence of each element of L.
Call the result Y.
f Filter by condition:
Ṡ # number of occurrences in Y
o≈6 is close to 6 (so 5, 6 or 7).
u Remove duplicates: [[1,1],[1,0]]
R , 164156 bajtów
Uwaga: teraz pokonane w R przez moją własną inną odpowiedź
function(p){m=matrix(F,u<-max(p)-(r=min(p)-2)+1,u)
m[t(p-r)]=T
t(which(m[]<-(s=sapply(1:u^2,function(j)sum(m[(j+-3:5%/%3*u+-2:0)%%u^2+1])))==3|m&s==4,T))+r}
Wypróbuj online!
Funkcja, która akceptuje i zwraca współrzędne jako kolumny dwuwierszowej macierzy.
Działa, tworząc macierz i wypełniając ją w określonych współrzędnych, a następnie obliczając następną generację i wyprowadzając indeksy wypełnionych elementów.
W jaki sposób?
gol_points=
function(p){ # p = matrix with coords in columns
m=matrix(F, # create a matrix, filled with FALSE...
u<-diff( # with row number u equal to the difference...
r<-range(p))+3, # between the range r of values in p, plus 3,
u) # and the same number of columns
# (so it's a square matrix with dimensions 1 bigger
# than the largest range of p)
m[t(p-r[1]+2)]=T # Now, set the elements of m at coordinates p + offset to TRUE
t(which( # Then, return the coordinates of elements that satisfy...
m[]<-(s= # m, filled with...
sapply(1:u^2, # the results for each of 1..u^2 (each element of m)...
function(j) # of a function taking argument j...
sum(m[(j+ # and returning the sum of elements of m at position j...
-3:5%/%3*u+-2:0 # plus the elements at all adjacent positions...
)%%u^2 # (modulo the matrix size u^2 to wrap-around the edges)
+1]) # +1 (R uses 1-based indices),
))==3 # is equal to 3 (3 neighbours, or filled cell with 2 neighbours)
|m&s==4, # or is itself TRUE and sum is equal to 4 (filled cell with 3 neighbours)
T)) # (arr.ind=TRUE = return coordinates, rather than linear indices),
+r[1]-2} # minus the offset used in the first place.
Julia 1.0 , 121 91 bajtów
f=g->[v for v=Set(h+[j,k] for h=g,j=-1:1,k=-1:1)if 2<sum(i->all(abs.(v-i).<2),g)<4+in(v,g)]
Wypróbuj online!
Wyjaśnienie
f=g->[v for v= # Array Comprehension of final result
Set(h+[j,k] for h=g,j=-1:1,k=-1:1) # Set Comprehension of all neighboring cells
# of occupied cells, including self
if 2<
sum(i->all(abs.(v-i).<2),g) # Count the number of neighbors, including self.
# For i in g, count iff the distance
# between v and i is less than 2
# for all dimensions
<4+in(v,g) # <4 if cell is empty, <5 if occupied
]
Język Wolfram , 92 bajty
CellularAutomaton["GameOfLife",{SparseArray[#+1-Min@#->(1&/@#)],0}][[1]]~Position~1-2+Min@#&
#+1-Min@#->(1&/@#)konwertuje dane wejściowe na reguły dla SparseArray : #+1-Min@#generuje odpowiednie przesunięcie, aby indeksy były dodatnie i (1&/@#)tworzy listę indeksów o odpowiedniej długości.
To jest następnie wprowadzane do CellularAutomaton, aby wygenerować krok Conway's Game of Life. Wynik jest wyodrębniany i wprowadzany do pozycji Position, aby znaleźć pozycje żywych komórek, a następnie przesunięcie indeksu jest odwracane z -2+Min@#( wynosi minus 2 zamiast minus 1, ponieważ CellularAutomaton dodaje wypełnienie, aby objąć wszystkie komórki, na które może mieć wpływ).
Wypróbuj online!
J , 59 bajtów
(([(~.#~3=#/.~)@-.~[:,+/),[#~3 4 e.~[:+/[e."1+/)&(,j./~i:1)
Wypróbuj online!
Wyjaśnienie później.
Python 3 , 215 \$\cdots\$ 129 127 bajtów
Zaoszczędzono aż 36 bajtów dzięki att !!!
Zapisano 2 bajty dzięki OVS !!!
lambda l:{(a+c,b+d)for c in(-1,0,1)for d in(-1,0,1)for a,b in l if((a+c,b+d)in l)+4>sum(abs(a+c-e+(b+d-f)*1j)<2for e,f in l)>2}
Wypróbuj online!
Wprowadza listę punktów i zwraca następną generację jako listę punktów.
Wyjaśnienie (przed niektórymi golfami)
def f(z): # input a list of complex numbers
n={ # create a set of neighbouring complex numbers
p+ # by adding to every point
a+b*1j # a vector of
for a in(-1,0,1) # one left, 0, one right: all combined with each of
for b in(-1,0,1) # one down, 0, one up
for p in z}; # for all the input points
g=lambda # create a function
p: # mapping a point
sum( # to the sum...
0<abs(a-p)<2 # if the distance between them
# is either 1 or root 2
for a in z) # ...of the live points
return[(p # return a list of complex numbers
for p in n # for all the points in the neighborhood
if g[p]==3 # if it has 3 neighbors
or g[p]==2and p in z]# or 2 neighbors and is alive
Galaretka , 25 bajtów
-r1ṗ2⁸+€Ẏċ€@Ḅe6,7,9ʋƇ,¥⁸Q
Monadyczny Link akceptujący listę współrzędnych, która daje to samo po iteracji Game Of Life.
Wypróbuj online!
W jaki sposób?
-r1ṗ2⁸+€Ẏċ€@Ḅe6,7,9ʋƇ,¥⁸Q - Link: list of coordinates, A
-r1 - -1 inclusive range 1 -> [-1,0,1]
ṗ2 - Cartesian power two -> [0,0] and its the eight neighbours
⁸+€ - add to each of A -> list of lists of an existing cell + its neighbours
Ẏ - tighten -> list of all existing cells and their neighbours
call this B
¥⁸ - last two links as a dyad - f(B, A):
, - pair -> [B, A]
Ƈ - filter keep those c in B for which:
ʋ - last four links as a dyad - f(c, [B, A])
ċ€@ - count occurrence of c in each of [B, A]
-> i.e. X = [n_neighbours + is_existing, is_existing]
Ḅ - convert from binary -> 2×n_neighbours+3×is_existing
6,7,9 - [6,7,9]
e - exists in? -> i.e. is X in [[3,0],[3,1],[4,1]]?
Q - deduplicate
Scala , 151 118 bajtów
Używa rzeczy z odpowiedzi Julii autorstwa @Vole . Głosuj na to!
g=>for{x->y<-g
r= -1 to 1
a<-r
b<-r
n=(for(i<-r;j<-r)yield(x+a+i,y+b+j))count g
if n==3|g(x+a,y+b)&n==4}yield(x+a,y+b)
Wypróbuj online!
TIO mówi 119 bajtów, ale to dlatego, że muszę użyć (x,y)do wyodrębnienia Tuple2 zamiast po prostu x->y, co zostało dodane po Scali 2.10 (wersja używana przez TIO).
Dotty, 117 bajtów
g=>for{x->y<-g;r= -1 to 1;a<-r;b<-r;n=g.count((i,j)=>math.hypot(x+a-i,y+b-j)<2)if n==3|g(x+a,y+b)&n==4}yield(x+a,y+b)
Wypróbuj online
Wyjaśnienie
g =>
for {
x -> y <- g //For every point in the grid,
r = -1 to 1 //Create range from -1 to 1 to use later
a <- r //For every a in r
b <- r //For every b in r ((x+a, y+b) is a neighbor of (x,y) or (x,y) itself)
n = (for(i <- r; j <- r)
yield (x + a + i, y + b + j) //(x+a, y+b) and all its neighbors
) count g //How many of them are in g?
if n == 3 | g(x + a, y + b) & n == 4 //Filter the cells that'll be live next round
//If n=3, it's live and has 2 neighbors, or it's not live and has 3 neighbors, so it'll be live next round.
//Otherwise, check if it's live and has 3 neighbors
} yield (x + a, y + b) //Yield every such point
R , 132 125 122 bajty
function(x,y,n=rep(q<-x+1i*y,e=9)+-3:5%/%3+1i*-1:1,s=rowSums(outer(n,n,`==`)))list(Re(c<-unique(n[s>2&s-n%in%q<4])),Im(c))
Wypróbuj online!
Zupełnie inne podejście do mojej innej odpowiedzi R, więc publikowanie osobno.
Manipuluje złożonymi współrzędnymi zamiast wypełniać macierz.
Dane wejściowe to 2 wektory zawierające współrzędne x i y punktów. Wynik to lista zawierająca 2 wektory o współrzędnych x i y.
W jaki sposób?
gol_points=
function(x,y,
q=x+1i*y, # convert x and y into complex coordinates q;
d=-3:5%/%3+1i*-1:1, # create vector d of all differences to neighbouring cells:
# (so, d = -1-i, -1, -1+i, -i, 0, i, 1-i 1, and 1+i)
n=q+rep(d,e=ncol(p)), # n = coordinates of neighbouring cells,
# by adding d to each element of q
s=rowSums(outer(n,n,`==`)), # s = the number of copies of each element in n
# and, therefore, the number of live neighbours it has (including itself)
i=(s==3|s==4&n%in%q), # i = indices in n of new generation of cells:
# TRUE if neighbours (including self) ==3,
# or if neighbours (including self) ==4 AND it's a living cell (so: in q)
c=unique(n[i])) # c = unique set of new generation of cells
list(Re(c),Im(c)) # output list containing Real & Imaginary parts of c
Galaretka , 39 bajtów
żIAṀo-4×<2$$ 3Ḷ’p`+þẎẎQçⱮ³$SṪe-2,-,3Ʋ$Ƈ
Wypróbuj online!
To prawdopodobnie jest naprawdę złe
Język Wolfram (Mathematica) , 70 bajtów
l#&@@@Cases[Tally@Array[l+#+I#2&,{3,3},-1,Join],{_,3}|{#|##&@@l,4}]
Wypróbuj online!
Pobiera i zwraca listę liczb zespolonych.
JavaScript (ES10), 156 152 bajty
a=>a.flatMap(a=>g(a,b=[])+.5|0?b:[...b,a],g=(B,b,k=9)=>k--?g(B,b,k,g[A=[B[0]+k%3-1,B[1]+~-(k/3)]]|a.some(a=>k=a+''==A)|!b||g(B=A)?0:g[B]=b.push(B))-k:3)
Wypróbuj online!
W jaki sposób?
Funkcja pomocnicza \$g\$liczy liczbę \$N\$komórek wokół pozycji odniesienia B[] = [x,y]. Ze względów golfowych liczona jest również pozycja odniesienia. Wartość zwrócona przez \$g\$jest \$3-N\$. W związku z tym:
- \$g\$zwraca \$0\$lub \$-1\$dla komórki otoczonej \$2\$lub \$3\$ odpowiednio inne komórki, które charakteryzuje się
(g() + 0.5 | 0) == 0 - \$g\$zwraca \$0\$dla pustej pozycji otoczonej dokładnie \$3\$ komórki
Kiedy jest wywoływana z drugim argumentem b[], \$g\$ wypycha również do tej tablicy współrzędne wszystkich komórek, które są obecnie wyłączone i muszą być włączone, pod warunkiem, że jest to pierwsze ich napotkanie.
Skomentowano
a => // a[] = input array
a.flatMap(a => // for each coordinate pairs a[] in a[]:
g(a, b = []) // invoke g with an empty array b[]
+ .5 | 0 ? // if the result is neither -1 or 0:
b // return b[] without a[]
: // else:
[...b, a], // return b[] with a[]
g = ( // g is a recursive function taking:
B, // B[] = [x, y]
b, // b[] = list of coordinate pairs
k = 9 // k = counter
) => //
k-- ? // decrement k; if it was not 0:
g( // recursive call:
B, b, k, // pass B[], b[] and k unchanged
g[ //
A = [ // define the coordinates A[] of the neighbor:
B[0] + k % 3 - 1, // x' = x + (k mod 3) - 1
B[1] + ~-(k / 3) // y' = y + floor(k / 3) - 1
] //
] | // abort if g[A] is already defined
a.some(a => // or A[] exists in a[]
k = a + '' == A // (in which case k is set to true)
) //
| !b // or b is not defined
|| g(B = A) // otherwise, invoke g with B = A and without
? // the 2nd argument; if the result is not 0:
0 // do nothing
: // else:
g[B] = b.push(B) // append B[] to b[] and set g[B]
) - k // end of recursive call; subtract k
: // else:
3 // return 3 and stop the recursion
) // end of flatMap()
05AB1E , 30 bajtów
2и2Ý<©ãδ+€`D€»DI€»õ.;s¢®6+såÏê
Odpowiedź Port of @Zgarb Husk , więc pamiętaj, aby go również zagłosować.
Powód, dla którego jest o wiele dłuższy, wynika z mniej wygodnych wbudowanych elementów. Jednym z nich jest to, że nie ma wbudowanej funkcji remove_first, więc zamiast niej użyjemy wbudowanej funkcji replace_first. Ponadto liczba nie wektoryzuje się na liście par, więc musimy połączyć każdy ciąg z ogranicznikiem nowej linii zarówno dla funkcji wbudowanych replace_first i count.
Wypróbuj online lub zweryfikuj wszystkie przypadki testowe .
Wyjaśnienie:
2и # Repeat the (implicit) input-list twice
# i.e. [[0,0],[1,0],[2,1]] → [[0,0],[1,0],[2,1],[0,0],[1,0],[2,1]]
2Ý # Push list [0,1,2]
< # Decrease each by 1: [-1,0,1]
© # Store this list in variable `®` (without popping)
ã # Take the cartesian product of this list with itself
# → [[-1,-1],[-1,0],[-1,1],[0,-1],[0,0],[0,1],[1,-1],[1,0],[1,1]]
δ # Apply double vectorized on the two lists:
+ # Add the values at the same positions in the pairs together
# → [[[-1,-1],[-1,0],[-1,1],[0,-1],[0,0],[0,1],[1,-1],[1,0],[1,1]],
# [[0,-1],[0,0],[0,1],[1,-1],[1,0],[1,1],[2,-1],[2,0],[2,1]],
# [[1,0],[1,1],[1,2],[2,0],[2,1],[2,2],[3,0],[3,1],[3,2]],
# [[-1,-1],[-1,0],[-1,1],[0,-1],[0,0],[0,1],[1,-1],[1,0],[1,1]],
# [[0,-1],[0,0],[0,1],[1,-1],[1,0],[1,1],[2,-1],[2,0],[2,1]],
# [[1,0],[1,1],[1,2],[2,0],[2,1],[2,2],[3,0],[3,1],[3,2]]]
€` # Flatten it one level down to a list of pairs
D # Duplicate this list of pairs
€» # Join each inner pair together with a newline delimiter
# → ["1\n1","1\n0","1\n-1","0\n1","0\n0","0\n-1","-1\n1","-1\n0",
# "-1\n-1","2\n1","2\n0","2\n-1","1\n1","1\n0","1\n-1","0\n1",
# "0\n0","0\n-1","3\n2","3\n1","3\n0","2\n2","2\n1","2\n0",
# "1\n2","1\n1","1\n0","1\n1","1\n0","1\n-1","0\n1","0\n0",
# "0\n-1","-1\n1","-1\n0","-1\n-1","2\n1","2\n0","2\n-1","1\n1",
# "1\n0","1\n-1","0\n1","0\n0","0\n-1","3\n2","3\n1","3\n0",
# "2\n2","2\n1","2\n0","1\n2","1\n1","1\n0"]
D # Duplicate this list of strings
I # Push the input list of pairs
€» # Join each inner pair with a newline delimiter as well
# → ["0\n0","1\n0","2\n1"]
õ.; # Replace every first occurrence of the input-pair with an empty string
# → ["1\n1","","1\n-1","0\n1","","0\n-1","-1\n1","-1\n0",
# "-1\n-1","","2\n0","2\n-1","1\n1","1\n0","1\n-1","0\n1",
# "0\n0","0\n-1","3\n2","3\n1","3\n0","2\n2","2\n1","2\n0",
# "1\n2","1\n1","1\n0","1\n1","1\n0","1\n-1","0\n1","0\n0",
# "0\n-1","-1\n1","-1\n0","-1\n-1","2\n1","2\n0","2\n-1","1\n1",
# "1\n0","1\n-1","0\n1","0\n0","0\n-1","3\n2","3\n1","3\n0",
# "2\n2","2\n1","2\n0","1\n2","1\n1","1\n0"]
s # Swap so the other list of strings is at the top of the stack again
¢ # Count the amount of occurrences of each item
# → [6,3,4,4,3,4,2,2,2,3,4,2,6,5,4,4,3,4,2,2,2,2,3,4,2,6,5,6,5,4,4,
# 3,4,2,2,2,3,4,2,6,5,4,4,3,4,2,2,2,2,3,4,2,6,5]
® # Push list [-1,0,1] from variable `®`
6+ # Add 6 to each: [5,6,7]
s # Swap so the list of counts are at the top of the stack
å # Check for each count if it occurs in the [5,6,7] list
# → [1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,
# 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1]
Ï # Only keep the pairs at the truthy indices
# → [[1,1],[1,1],[1,0],[1,1],[1,0],[1,1],[1,0],[1,1],[1,0],[1,1],[1,0]]
ê # Sort and uniquify the remaining pairs
# → [[1,0],[1,1]]
# (after which the result is output implicitly)
Węgiel , 80 75 48 43 bajty
F³F³F⊕⌈↔⊖⟦ικ⟧Fθ⊞υ⊖Eμ⁺ν⎇ξκιIΦυ∧⁼κ⌕υι›²↔⁻⁶№υι
Wypróbuj online! Link prowadzi do pełnej wersji kodu. Po prostu nudny port odpowiedzi Husk @ Zgarb. Wyprowadza punkty przy użyciu domyślnego formatu Węgiel drzewny, w którym każda współrzędna znajduje się w osobnym wierszu z punktami oddalonymi od siebie podwójnie. Wyjaśnienie:
F³F³
Przejrzyj wszystkie okolice.
F⊕⌈↔⊖⟦ικ⟧
Przepętaj sąsiednie komórki dwukrotnie, ale samą komórkę tylko raz.
Fθ⊞υ⊖Eμ⁺ν⎇ξκι
Wypchnij wszystkie wynikowe komórki na wstępnie zdefiniowaną pustą listę.
IΦυ∧⁼κ⌕υι›²↔⁻⁶№υι
Wydrukuj pierwszy wygląd tych komórek, które pojawiają się od 5 do 7 razy.
Poprzednie 80 75 bajtów więcej Rozwiązanie z węglem drzewnym:
≔E²Eθ§λιηUMη…·⊖⌊ι⊕⌈ιFθ«J⊟ι⊟ιUMKMI⌊⟦⁹⁺²Σκ⟧I⊕ΣKK»F⊟ηF§η⁰«Jικ¿№567KK⊞υ⟦κι⟧»⎚Iυ
Wypróbuj online! Link prowadzi do pełnej wersji kodu. Wyprowadza punkty przy użyciu domyślnego formatu Węgiel drzewny, w którym każda współrzędna znajduje się w osobnym wierszu z punktami oddalonymi od siebie podwójnie. Wyjaśnienie:
≔E²Eθ§λιη
Uzyskaj transponowaną kopię punktów.
UMη…·⊖⌊ι⊕⌈ι
Zastąp każdy wiersz transpozycji rozszerzonym zakresem.
Fθ«
Pętla nad każdym punktem.
J⊟ι⊟ι
Przejdź do tego punktu.
UMKMI⌊⟦⁹⁺²Σκ⟧
Dwukrotnie zwiększaj każdego z sąsiadów, ograniczony do 9.
I⊕ΣKK
Zwiększ komórkę.
»F⊟ηF§η⁰«
Pętla nad wyściełanymi zakresami.
Jικ
Przejdź do tego punktu.
¿№567KK
Jeśli jest między 5 a 7, to ...
⊞υ⟦κι⟧
... zapisz ten punkt na predefiniowanej pustej liście.
»⎚Iυ
Wyczyść kanwę i wypisz nowe punkty.