Tamamen palindromik üçgenler


18

Dizeyi düşünün 160615051. Bu şekilde "üçgenleştirilebilir":

  1
 606
15051

Sonra, her satır bir palindrom olur. Ayrıca çevre üzerindeki her iki tarafın da bir palindrom olduğuna dikkat edin:

  1  |   1   |   
 6   |    6  |      
1    |     1 | 15051 

Bu nedenle, bu dize tamamen palindromik bir üçgen olarak kabul edilebilir. 100Bu durumda yükseklik hakkında endişelenmeyin , palindromik olması gerekmez.

Girdi: 0x20 - 0x7E arası yazdırılabilir ASCII karakter dizisi. Bu bir karakter dizisi, tek bir dize veya ASCII kod noktaları dizisi olabilir. Girdileriniz her zaman üçgenleştirilebilir (yani uzunluğu her zaman mükemmel bir kare olacaktır).

Çıktı : Dize tamamen palindromik bir üçgense doğruluk değeri veya aksi halde bir falsey değeri.

Test senaryoları

input => output

1 => true
A => true
AAAA => true
nope => false
{{}} => false
1101 => true
1011 => false
1202 => false
111110001 => true
160615051 => true
160625052 => false
1111111111111111 => true
1121123211234321123454321 => true
HHeHHeleHHellleHHellolleH => true
HellolleHHellleHHeleHHeHH => false
111111111111111111111111111111111111 => true
abcbdefeddefgfedbcdefedcbabcdefedcba => true

Yanıtlar:


10

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 Jgiriş 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 1ve Zbu durumda iki bağlantı tüketir . İlk Zargümanına uygulanır: önceki dizeden dizi. Zolan 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 1ve 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 Utü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 .


Gerçekten Jelly'i okumayı öğrenmeliyim. (Açıklama, lütfen?)
CAD

1
Cevabımı düzenledim.
Dennis

6

Japt , 25 21 17 bayt

@Obarakon sayesinde 2 bayt kaydedildi

ò@°T ¬v1
pUmg)eêP

Çevrimiçi test edin!

Nasıl çalışır

 ò@  ° T ¬ v1   // Implicit: U = input string, T = 0
UòXY{++T q v1}  // First line; reset U to the result of this line.
UòXY{        }  // Partition U at indices where
     ++T q      //   the square root of T incremented
           v1   //   is divisible by 1.
                // This breaks U at square indices, giving rows of 1, 3, 5, ... chars.
 pUmg)eêP
UpUmg)eêP
  Umg           // Take the first char of every item of U.
Up   )          // Append this to U.
      e         // Check that every item in the resulting array
       êP       // is a palindrome.
                // Implicit: output result of last expression

Her iki tarafı da kontrol etmemize gerek olmadığını unutmayın ; kenarlar aynı değilse, satırlardan en az biri palindrom değildir.


Bu çok satırlı şey Japt'un yeni bir özelliği mi?
Luke

@ Luke Evet, az önce Salı ekledim. Bu göstermek için ilk şansım :-)
ETHproductions

Golf ipucunu boş ver. Her hattın palindromik olup olmadığını kontrol eder, bu da doğru sonuçlar verir ...
Luke


4

Jöle , 18 16 bayt

J²‘Ṭœṗ⁸ZḢ$ṭ$ŒḂ€Ạ

Çevrimiçi deneyin!

Önemsiz ama çok açık olmayan -2 bayt tasarruf için Jonathan Allan'a teşekkürler .


Üçgen yapımı kullan ve bir bayt kaydet:JƲ0;œṗ⁸ZḢ$ṭ$ŒḂ€Ạ
Jonathan Allan

... aslında bu fikri gerçeği birleştirin ve başka bir bayt kaydedin, çünkü bölümleme "en kısa" J²‘Ṭœṗ⁸ZḢ$ṭ$ŒḂ€Ạ
Jonathan Allan

@JonathanAllan Umm ... neden hiç ihtiyacım var ½? Şimdi Jdaha mantıklı ...
Outgolfer Erik

3

JavaScript (ES6), 112 bayt

f=(s,n=1,t='',u='',g=([...a])=>''+a==a.reverse())=>s?g(s.slice(0,n))&f(s.slice(n),n+2,t+s[0],u+s[n-1]):g(t)&g(u)

tve sonunda utoplanabilmeleri için kenarları toplayın.


2

C #, 184 bayt

using System.Linq;
b=a=>string.Concat(a.Reverse())==a
f=>{string c=f[0]+"",d=c,e="";for(int i=1,k=1,s=f.Length;i<s;)
{c+=f[i];d+=f[(i+=k+=2)-1];e=f.Substring(s-k);}return b(c)&b(d)&b(e);}

Palindrom kısmına gelene kadar çözümün iyi göründüğünü düşündüm

Ungolfed sürümü:

Func<string, bool> b = a => string.Concat(a.Reverse()) == a;
        Func<string, bool> func = f => {

            string c = f[0] + "", d = c, e = "";

            for (int i = 1, k = 1, s = f.Length; i < s;) {
                c += f[i];
                d += f[(i += k += 2) - 1];
                e = f.Substring(s - k);
            }

            return b(c) & b(d) & b(e);
        };

e=..Bir bayt kaydetmek için for döngüsü satırına geçebilir misiniz ? Yeni satırları bayt sayısına dahil etmeye gerek yok, bu yüzden olmadığını varsayıyorum.
TheLethalCoder

Hayır, yeni satırları saymıyorum, dönüş döngüsüne ihtiyacım olduğu için döngü içine e taşıyamıyorum.
LiefdeWen

Ben böyle demek ....; i < s;e = f.Substring(s - k)){c+=....
istedim

2

Java 8, 358301 bayt

import java.util.*;s->{List<String>l=new Stack();for(int i=0,p=1,t=1;p<=s.length();p+=t+=2)l.add(s.substring(i,i=p));String a="",b=a;for(String q:l){a+=q.charAt(0);b+=q.charAt(q.length()-1);}return p(a)&p(b)&p(l.get(l.size()-1));}boolean p(String s){return s.equals(new StringBuffer(s).reverse()+"");}

Giriş bir String, çıkış bir boolean.

Açıklama:

Burada deneyin.

import java.util.*;               // Required import for List and Stack

s->{                              // Method (1) with String parameter and boolean return-type
  List<String>l=new Stack();      //  Create a String-list
  for(int i=0,p=1,t=1;            //  Initialize some index/counter integers
      p<=s.length();              //  Loop (1) over the String in sections
      p+=t+=2)                    //    And increase `p` like this after every iteration: 1,4,9,16,25,etc.
    l.add(s.substring(i,i=p));    //   And add a substring-section to the list (0,1 -> 1,4 -> 4,9 -> 9,16 -> etc.)
                                  //  End of loop (1) (implicit / single-line body)
  String a="",b=a;                //  Two temp Strings
  for(String q:l){                //  Loop (2) over the list
    a+=q.charAt(0);               //   And append the first character to String `a`
    b+=q.charAt(q.length()-1);    //   And the last character to String `b`
  }                               //  End of loop (2)
  return p(a)                     //  Return if String `a` is a palindrome
        &p(b)                     //   as well as String `b`
        &p(l.get(l.size()-1));    //   as well as the last String in the list
}                                 // End of method (1)

boolean p(String s){              // Method (2) with String parameter and boolean return-type
  return s.equals(new StringBuffer(s).reverse()+"");
                                  //  Return if this String is a palindrome
}                                 // End of method (2)

1

Jöle ,  20  21 bayt

+2 bayt - Buggy kodu yayınladım :(
-1 bayt - tek tamsayılar gibi kalıplamadan kare dizinlerde bölümlemeye taşındı

JƲ0;œṗ⁸ZḢ$ṭ$ŒḂ€Ạ

Karakterlerin listesini kabul eden ve 1(Doğruluk) veya 0(Falsey) döndüren monadik bir bağlantı .
Not: Bu, belirtimin girişi kare uzunluğuyla sınırlayan kısmını kullanır.

Çevrimiçi deneyin! veya bakın test takımına bakın .

Bu, tüm satırların palindromlar olması durumunda yalnızca bir "tarafın" kontrol edilmesi ( ) gerektiğini belirterek 17 bayta basitleştirilebilir JƲ0;œṗ⁸ZḢ$ṭ$ŒḂ€Ạ, ancak Outgolfer Erik bu gerçeği zaten fark etmiş ve cevaplarında böylece onlara üçgen inşaat yöntemini verdim. orada bir bayt.

Ayrıca, bu da 16 bayta kadar iyileştirilebilir doğruluk indekslerinde bölümlemenin sol argümanda ( J²‘Ṭœṗ⁸ZḢ$ṭ$ŒḂ€Ạ) fazlalık olup olmadığını önemsemediğini belirterek .

Nasıl?

JƲ0;œṗµ2BịЀ⁸Z;⁸ŒḂ€Ạ - Link: list, a      e.g. "abcbazxza"
J                     - range of length of a  = [1,2,3,4,5,6,7,8,9]
 Ʋ                   - is square? (vectorises) [1,0,0,1,0,0,0,0,1]
   0;                 - prepend a zero        [0,1,0,0,1,0,0,0,0,1]
     œṗ               - partition a at 1s     ["a","bcb","azxza"]
       µ              - monadic chain separation, call that t
        2B            - 2 in binary = [1,0]
             ⁸        - chain's left argument, t
          ịЀ         - map with index into    ["aa","bb","aa"] (1st and last of each of t)
              Z       - transpose              ["aba","aba"] (left and right "sides" of t)
               ;⁸     - concatenate t          ["aba","aba","a","bcb","azxza"]
                 ŒḂ€  - palindromic? for €ach  [1,1,1,1,1]
                    Ạ - all?                   1

1
Lanet olsun, Jelly'e cevap vermek üzereydim. Teknik olarak benimki yanlış olsa ve iki kat daha uzun ... güzel iş :): P
HyperNeutrino

"Doğru argümanlarda bölümlemenin, sol argümanda fazlalık olup olmadığını önemsemediğine dikkat edin."
Outgolfer Erik

1

Mathematica, 156 bayt

B=StringTake;Count[PalindromeQ/@Join[A=Table[B[#,{i^2+1,(i+1)^2}],{i,0,(s=Sqrt@StringLength@#)-1}],{StringJoin@Table[B[A[[i]],1],{i,Length@A}]}],True]==s+1&


giriş

[ "1101"]


If[<stuff>, True, False]Sadece yerine koyamaz <stuff>mısın? Ve bence And@@(...)bundan daha kısa Count[...,True]==s, bu da sbir değişken olarak tanımlamanız gerekmediği anlamına geliyor .
Bir ağaç değil

Bekle, bu çaprazları gerçekten test ediyor mu? Birkaç test vakası ( "1202"ve "160625052") için yanlış pozitifler alıyorum .
Bir ağaç değil

tüm sorunlar giderildi
J42161217


1

Java, 136 bayt

l->{for(int i=0,j,k=1;i<l.size();i=j,k+=2)if(!l.subList(i,j=i+k).equals(l.subList(i,j).asReversed().toList()))return false;return true;}

MutableList<Character>Eclipse koleksiyonlarından a kullanır

Function<MutableList<Character>, Boolean> func = l->{
   for(int i=0,j,k=1;i<l.size();i=j,k+=2)  // `i` is the start index, `j` is the end index, `k` increments by 2
       if(!l.subList(i,j=i+k).equals( //Check that the first partition equals
           l.subList(i,j).asReversed().toList())  // The same sublist reversed
       )
       return false;
   return true;
};

1

Perl 5 , 81 + 1 ( -p) = 82 bayt

$a[0].=$1while($a[++$q]=substr$_,0,($#i+=2),'')=~/(.)/;$\||=$_ ne reverse for@a}{

Çevrimiçi deneyin!

Çıktılar undef(ör. Boş, boş), yanlış için herhangi bir sayı


0

Excel VBA, 87 Bayt

Hücreden girdi alan [A1]ve VBE anında penceresine çıkış sağlayan anonim VBE anında pencere işlevi

k=1:For i=1To[Len(A1)^.5]:s=Mid([A1],j+1,i*2-1):j=j+i*2-1:k=k*(s=StrReverse(s)):Next:?k

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.