Jöle , 14 12 bayt
J’ƲœṗZ⁻¦µU⁼
Çevrimiçi deneyin!
Arka fon
Giriş dizesinin 0 tabanlı indekslerine bakarak başlıyoruz.
H H e H H e l e H H e l l l e H H e l l o l l e H
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
Üçgenin satırlarını elde etmek için, dizeyi 1 , 1 + 3 = 4 , 1 + 3 + 5 = 9 ve 1 + 3 + 5 + 7 = 16 dizinlerinden önce bölebiliriz . Yana (n + 1) ² = n² + (2n + 1) , bu meblağlar kesin olumludur, endeks listesinde mükemmel kareler. Yine daha önce de dize bölmek ise 0 , bu mükemmel kareler tüm 0 tabanlı endeksleri almadan önce ayrılmaya olarak basit gibidir.
Bölme işleminden sonra aşağıdaki dizeleri alırız.
""
"H"
"HeH"
"HeleH"
"HellleH"
"HellolleH"
Ardından, başlangıçtaki boş dizeyi ilk sütundaki tüm karakterlerle değiştiriyoruz.
"HHHHH"
"H"
"HeH"
"HeleH"
"HellleH"
"HellolleH"
Görev artık tüm dizeleri ters çevirmenin aynı dize dizisini verip vermediğini kontrol etmeye indirgenmiştir.
Nasıl çalışır
Önce J
giriş dizesinin tüm 1 tabanlı indekslerini oluşturur J
, ardından ’
0 tabanlı tüm indeksleri vermek için bunları azaltır . Ʋ
0 tabanlı tüm indeksleri karelik için test eder. Yukarıdaki örneğimiz için bu, aşağıdaki Boole dizisini verir.
1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
Ardından, œṗ
giriş dizesini bölümlemeye çağırıyoruz , ör.
H H e H H e l e H H e l l l e H H e l l o l l e H
Hepsi daha önce 1 's (aslında bütün truthy elemanları). Örneğimiz için bu, aşağıdaki dize dizisini verir.
['',
'H',
'HeH',
'HeleH',
'HellleH',
'HellolleH'
]
Z⁻¦
tartışmasız bu cevabın en ilginç kısmı. Önce daha basit olanı analiz edelim Z1¦
.
¦
olduğu seyrek çabuk. Yığından, özellikle 1
ve Z
bu durumda iki bağlantı tüketir . İlk Z
argümanına uygulanır: önceki dizeden dizi. Z
olan fermuar veren atom ve sütunlarla dize dizisi / 2D karakter dizisini okur
['HHHHH',
'eeee',
'Hlll',
'ell',
'Hlo',
'el',
'Hl',
'e',
'H'
]
Giriş dizesinin sol tarafında ve dize dizisinin ilk sütunu artık ilk dize olur .
Şimdi tek bir dizine göz ¦
atıyor 1
ve buluyor: 1 . Böylece, orijinal dize dizisindeki ilk dize, dönüş değerindeki ilk dize ile değiştirilir Z
; diğer endekslerdeki dizeler etkilenmez.
['HHHHH',
'H',
'HeH',
'HeleH',
'HellleH',
'HellolleH'
]
Bu diziye A diyelim .
Z⁻¦
Bunun yerine kullandık Z1¦
, ancak bu bir fark ⁻
yaratmaz : dize dizisini eşitsizlik için giriş dizesiyle karşılaştırır ve eşit olmadıkları için 1 verir . İkisi arasındaki fark olmasıdır Z⁻¦
çünkü diyadik olduğunu ⁻
bize yazmak için izin olduğunu œṗZ⁻¦
yerine œṗ¹Z1¦
. Bir iki atomlu (Bunun nedeni, œṗ
bir monad (ardından) œṗ¹Z1¦
) a, çatal (tek hücreli zinciri değişken / giriş dizeye uygulanır ve döndürülen değeri doğru bağımsız değişken olarak geçirilir œṗ
) bir iki atomlu bir ikilisi, ardından ise, (veya zincirin sonunda) bir kanca , yani doğru argümanı zincirin argümanıdır.
Tek yapmanız gereken palindromikliği kontrol etmektir. µ
argümanı A olan yeni (monadik) bir zinciri başlatır . Dikmek atomu U
tüm dizeleri ters A (ancak bir kendisini), daha sonra ⁼
ile karşılaştırır A eşitlik. Döndürülen Boole 1 , tamamen palindromik bir üçgeni belirtir; diğer dizeler 0 değerini döndürür .