Tam giác hoàn toàn palindromic


18

Hãy xem xét chuỗi 160615051. Nó có thể được "tam giác" như vậy:

  1
 606
15051

Sau đó, mỗi hàng là một bảng màu. Cũng lưu ý rằng mỗi bên trên chu vi cũng là một bảng màu:

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

Do đó, chuỗi này có thể được coi là một tam giác hoàn toàn palindromic. Đừng lo lắng về độ cao100 trong trường hợp này, nó không nhất thiết phải là palindromic.

Đầu vào: Một chuỗi các ký tự ASCII có thể in từ 0x20 đến 0x7E. Đây có thể là một mảng ký tự, một chuỗi đơn hoặc một mảng các điểm mã ASCII. Đầu vào của bạn sẽ luôn có thể được hình tam giác (nghĩa là chiều dài của nó sẽ luôn là một hình vuông hoàn hảo).

Đầu ra : Một giá trị trung thực nếu chuỗi là một tam giác hoàn toàn palindromic hoặc giá trị falsey khác.

Các trường hợp thử nghiệm

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

Câu trả lời:


10

Thạch , 14 12 byte

J’ƲœṗZ⁻¦µU⁼

Hãy thử trực tuyến!

Lý lịch

Chúng tôi bắt đầu bằng cách xem xét các chỉ số dựa trên 0 của chuỗi đầu vào.

 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

Để có được các hàng của tam giác, chúng ta có thể chia chuỗi trước các chỉ số 1 , 1 + 3 = 4 , 1 + 3 + 5 = 91 + 3 + 5 + 7 = 16 . Vì (n + 1) ² = n² + (2n + 1) , các khoản tiền này chính xác là các hình vuông dương, hoàn hảo trong danh sách chỉ mục. Nếu chúng ta cũng chia chuỗi trước 0 , thì điều này cũng đơn giản như chia tách trước tất cả các chỉ số dựa trên 0 là các ô vuông hoàn hảo.

Sau khi tách, chúng ta nhận được các chuỗi sau.

""
"H"
"HeH"
"HeleH"
"HellleH"
"HellolleH"

Tiếp theo, chúng tôi thay thế chuỗi trống ở đầu bằng tất cả các ký tự trong cột đầu tiên.

"HHHHH"
"H"
"HeH"
"HeleH"
"HellleH"
"HellolleH"

Bây giờ tác vụ được giảm xuống để kiểm tra xem việc đảo ngược tất cả các chuỗi có mang lại cùng một chuỗi chuỗi hay không.

Làm thế nào nó hoạt động

Đầu tiên Jtạo tất cả các chỉ mục dựa trên 1 của chuỗi đầu vào J, sau đó giảm chúng để tạo ra tất cả các chỉ mục dựa trên 0. Ʋkiểm tra tất cả các chỉ số dựa trên 0 cho độ vuông. Ví dụ của chúng tôi ở trên, điều này mang lại mảng Boolean sau.

 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

Tiếp theo, chúng tôi gọi œṗđể phân vùng chuỗi đầu vào, ví dụ,

 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

trước tất cả 1 (thực ra, tất cả các yếu tố trung thực). Ví dụ của chúng tôi, điều này mang lại mảng chuỗi sau.

['', 
 'H',
 'HeH',
 'HeleH',
 'HellleH',
 'HellolleH'
]

Z⁻¦được cho là phần thú vị nhất của câu trả lời này. Hãy phân tích đơn giản hơnZ1¦ .

¦là sự thưa thớt nhanh chóng. Nó tiêu thụ hai liên kết từ ngăn xếp, cụ thể 1Ztrong trường hợp này. Đầu tiên Zđược áp dụng cho đối số của nó: mảng chuỗi từ trước. Zlà nguyên tử zip và đọc mảng chuỗi / mảng ký tự 2D theo các cột, mang lại

['HHHHH',
 'eeee',
 'Hlll',
 'ell',
 'Hlo',
 'el',
 'Hl',
 'e',
 'H'
]

Những gì từng là bên trái của chuỗi đầu vào và cột đầu tiên của mảng chuỗi bây giờ trở thành chuỗi đầu tiên .

Bây giờ nhìn ¦trộm 1và tìm thấy một chỉ số duy nhất: 1 . Do đó, chuỗi đầu tiên trong mảng chuỗi gốc được thay thế bằng chuỗi đầu tiên trong giá trị trả về của Z; chuỗi tại các chỉ số khác vẫn không bị ảnh hưởng.

['HHHHH',
 'H',
 'HeH',
 'HeleH',
 'HellleH',
 'HellolleH'
]

Hãy gọi mảng này Một .

Chúng tôi đã sử dụng Z⁻¦thay vì Z1¦, nhưng điều này không có gì khác biệt: so sánh mảng chuỗi với chuỗi đầu vào cho bất đẳng thức, mang lại 1 vì chúng không bằng nhau. Sự khác biệt giữa hai là Z⁻¦dyadic bởi vì , cho phép chúng ta viết œṗZ⁻¦thay vì œṗ¹Z1¦. Điều này là do một dyad ( œṗ) theo sau là một monad (œṗ¹Z1¦ ) là một ngã ba (đơn vị được áp dụng cho đối số của chuỗi / chuỗi đầu vào và giá trị được trả về được chuyển thành đối số đúng œṗ), trong khi một dyad theo sau bởi một dyad khác (hoặc ở cuối chuỗi) là một cái móc , tức là, đối số đúng của nó là đối số của chuỗi.

Tất cả những gì còn lại phải làm là kiểm tra độ ngon miệng. µbắt đầu một (monadic) chuỗi mới, những người là đối số là Một . Nguyên tử upendU đảo ngược tất cả các chuỗi trong A (nhưng không phải chính A ), sau đó so sánh kết quả với A cho đẳng thức. Boolean 1 được trả về chỉ ra một tam giác hoàn toàn palindromic; các chuỗi khác sẽ trả về 0 .


Tôi thực sự nên học cách đọc Jelly. (Giải thích, làm ơn?)
CAD97

1
Tôi đã chỉnh sửa câu trả lời của mình.
Dennis

6

Japt , 25 21 17 byte

Đã lưu 2 byte nhờ @obarakon

ò@°T ¬v1
pUmg)eêP

Kiểm tra nó trực tuyến!

Làm thế nào nó hoạt động

 ò@  ° 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

Lưu ý rằng chúng ta không cần phải kiểm tra cả hai mặt; nếu các cạnh không giống nhau, Ít nhất một trong các hàng không phải là một bảng màu.


Đây có phải là một tính năng mới của Japt?
Luke

@Luke Vâng, tôi vừa thêm nó vào thứ ba. Đây là cơ hội đầu tiên của tôi để thể hiện điều đó :-)
ETHproductions

Đừng bận tâm đến mẹo chơi golf của tôi. Nó chỉ đơn giản là kiểm tra xem mọi dòng có phải là palindromic hay không, điều này cũng đã cho kết quả chính xác ...
Luke


4

Thạch , 18 16 byte

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

Hãy thử trực tuyến!

Cảm ơn Jonathan Allan vì sự tiết kiệm tầm thường nhưng không quá rõ ràng.


Sử dụng cấu trúc tam giác của tôi và lưu một byte:JƲ0;œṗ⁸ZḢ$ṭ$ŒḂ€Ạ
Jonathan Allan

... Trên thực tế, kết hợp ý tưởng đó với sự không trung thực và lưu một byte khác, vì phân vùng sẽ "zip ngắn nhất":J²‘Ṭœṗ⁸ZḢ$ṭ$ŒḂ€Ạ
Jonathan Allan

@Jonathan ALLan Umm ... tại sao tôi lại cần ½? Bây giờ Jcó ý nghĩa hơn ...
Erik the Outgolfer

3

JavaScript (ES6), 112 byte

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)

tuthu thập các mặt để chúng có thể được kiểm tra ở cuối.


2

C #, 184 byte

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

Nghĩ rằng giải pháp đã được tìm kiếm tốt cho đến khi tôi đến phần palindrom

Phiên bản bị đánh cắp:

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

Bạn có thể di chuyển e=..vào dòng vòng lặp for để lưu một byte không? Không cần phải đếm các dòng mới vào số byte vì vậy tôi cho rằng bạn không phải.
TheLethalCoder

Không, tôi không tính dòng mới, tôi không thể chuyển e vào vòng lặp vì tôi cần nó trong câu lệnh return.
LiefdeWen

Ý tôi là như thế này....; i < s;e = f.Substring(s - k)){c+=....
TheLethalCoder

2

Java 8, 358 301 byte

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

Đầu vào là một String, đầu ra là mộtboolean .

Giải trình:

Hãy thử nó ở đây.

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

Thạch ,  20  21 byte

+2 byte - Tôi đã phát hành mã lỗi :(
-1 byte - được chuyển từ việc tạo khuôn như các số nguyên lẻ sang phân vùng tại các chỉ mục vuông

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

Một liên kết đơn âm chấp nhận danh sách các nhân vật và trở về 1(Sự thật) hoặc0 (Falsey).
Lưu ý: điều này sử dụng một phần của đặc tả giới hạn đầu vào ở độ dài hình vuông.

Hãy thử trực tuyến!hoặc xem bộ thử nghiệm .

Điều này có thể được đơn giản hóa thành 17 byte bằng cách lưu ý rằng nếu tất cả các hàng là palindromes chỉ cần một "bên" cần kiểm tra ( JƲ0;œṗ⁸ZḢ$ṭ$ŒḂ€Ạ), tuy nhiên Erik Outgolfer đã nhận thấy thực tế này và đã sử dụng nó trong câu trả lời của họ vì vậy tôi đã đưa ra phương pháp xây dựng tam giác cho họ một byte ở đó.

Ngoài ra, điều đó có thể lần lượt được cải thiện thành 16 byte bằng cách lưu ý rằng phân vùng tại các chỉ mục trung thực không bận tâm nếu có dư thừa trong đối số bên trái ( J²‘Ṭœṗ⁸ZḢ$ṭ$ŒḂ€Ạ).

Làm sao?

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
Chết tiệt, tôi vừa định trả lời Jelly. Mặc dù về mặt kỹ thuật, tôi đã sai và thích gấp đôi ... công việc tốt :): P
HyperNeutrino

"Lưu ý rằng phân vùng tại các chỉ mục trung thực không bận tâm nếu có dư thừa trong đối số bên trái" cũng nhận thấy trước khi đọc.
Erik the Outgolfer

1

Toán học, 156 byte

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&


đầu vào

["1101"]


Bạn không thể thay thế If[<stuff>, True, False]chỉ <stuff>? Và tôi nghĩ And@@(...)là ngắn hơn Count[...,True]==s, điều đó cũng có nghĩa là bạn không phải định nghĩa slà một biến.
Không phải là một cái cây

Đợi đã, điều này thực sự kiểm tra các đường chéo? Tôi đang nhận được kết quả dương tính giả cho một vài trường hợp thử nghiệm ( "1202""160625052").
Không phải là một cái cây

tất cả các vấn đề đã được sửa
J42161217

1

PHP , 97 byte

for($t=1;~$s=substr($argn,$i**2,$i++*2+1);$d.=$s[0])$t&=strrev($s)==$s;$t&=strrev($d)==$d;echo$t;

Hãy thử trực tuyến!


Đợi đã, điều này thực sự kiểm tra các đường chéo? Tôi đang nhận được kết quả dương tính giả cho một vài trường hợp thử nghiệm ("1202" và "160625052").
J42161217

@Jenny_mathy bây giờ nó hoạt động
Jörg Hülsermann

1

Java, 136 byte

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

Sử dụng một MutableList<Character>từ các bộ sưu tập Eclipse

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 byte

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

Hãy thử trực tuyến!

Đầu ra undef(nghĩa là trống, null) cho đúng, bất kỳ số nào là sai


0

VBA Excel, 87 byte

Chức năng cửa sổ tức thời VBE ẩn danh lấy đầu vào từ ô [A1]và xuất ra cửa sổ ngay lập tức VBE

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.