완전 회문 삼각형


18

문자열을 고려하십시오 160615051. 다음과 같이 "삼각형 화"될 수 있습니다.

  1
 606
15051

그런 다음 각 행은 회문입니다. 또한 둘레의 각 측면은 회문입니다.

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

따라서이 줄은 완전한 회문 삼각형으로 간주 될 수 있습니다. 100이 경우 고도 에 대해 걱정하지 마십시오 . 회문이 될 필요는 없습니다.

입력 : 0x20에서 0x7E까지 인쇄 가능한 ASCII 문자 문자열. 문자 배열, 단일 문자열 또는 ASCII 코드 포인트 배열 일 수 있습니다. 입력은 항상 삼각 측량 될 수 있습니다 (즉, 길이는 항상 완벽한 정사각형입니다).

출력 : 문자열이 완전한 팔 각색 삼각형이면 참 값, 그렇지 않으면 거짓 값.

테스트 사례

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

답변:


10

젤리 , 14 12 바이트

J’ƲœṗZ⁻¦µU⁼

온라인으로 사용해보십시오!

배경

입력 문자열의 0부터 시작하는 인덱스를 살펴 보는 것으로 시작합니다.

 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

삼각형의 행을 얻기 위해 인덱스 1 , 1 + 3 = 4 , 1 + 3 + 5 = 91 + 3 + 5 + 7 = 16 전에 문자열을 분할 할 수 있습니다 . 이후 (N + 1) = n² ² + (2N + 1) ,이 합산 정확하게 긍정적 인덱스리스트의 완전한 사각형. 우리가 0 앞에 문자열을 나누면 , 이것은 완벽한 제곱 인 모든 0 기반 인덱스 앞에 나누는 것만 큼 간단합니다.

분할 후 다음 문자열을 얻습니다.

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

다음으로 시작 부분의 빈 문자열을 첫 번째 열의 모든 문자로 바꿉니다.

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

이제 모든 문자열을 되 돌리면 동일한 문자열 배열이 생성되는지 확인하는 작업으로 축소되었습니다.

작동 원리

먼저 J입력 문자열의 1 부터 시작 하는 모든 인덱스를 생성 J한 다음 0부터 시작하여 모든 0부터 시작하는 인덱스를 생성합니다. Ʋ0을 기준으로 모든 직각도를 테스트합니다. 위의 예제에서는 다음과 같은 부울 배열이 생성됩니다.

 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

다음으로 œṗ입력 문자열을 분할하기 위해 호출 합니다.

 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

모든 1 앞에 (실제로 모든 진실 요소). 이 예에서는 다음 문자열 배열이 생성됩니다.

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

Z⁻¦이 답변에서 가장 흥미로운 부분 일 것입니다. Z1¦먼저 더 간단하게 분석해 봅시다 .

¦는 IS 스파 스 빠른. 그것은 구체적으로, 스택에서 두 개의 링크를 소모 1하고 Z,이 경우. 먼저 Z인수에 적용됩니다 : 이전의 문자열 배열. Z는 IS 우편 수득 원자 및 열에 의한 문자열 배열 / 2D는 문자 배열을 읽어

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

입력 문자열의 왼쪽과 문자열 배열의 첫 번째 열이었던 것이 이제 첫 번째 문자열이 됩니다.

지금 ¦에이 피킹 1및 단일 인덱스를 찾습니다 1 . 따라서 원래 문자열 배열의 첫 번째 문자열은의 반환 값에서 첫 번째 문자열로 바뀝니다 Z. 다른 지수의 현은 영향을받지 않습니다.

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

이 배열을 A 라고합시다 .

Z⁻¦대신에 사용 Z1¦했지만 차이는 없습니다. 문자열 배열과 입력 문자열의 불평등을 비교하여 같지 않기 때문에 1을 산출 합니다. 이 둘의 차이점은 Z⁻¦이기 때문에 , œṗZ⁻¦대신 쓸 수 있다는 것입니다 œṗ¹Z1¦. 이는 dyad ( œṗ) 다음에 monad ( œṗ¹Z1¦)가 포크 (모나드가 체인의 인수 / 입력 문자열에 적용되고 반환 된 값이에 올바른 인수로 전달됨 œṗ)이고 dyad 다음에 다른 dyad 가 있기 때문입니다. (또는 체인의 끝에) 후크입니다 . 즉, 오른쪽 인수는 체인의 인수입니다.

남은 일은 회문을 확인하는 것입니다. µ인수가 A 인 새로운 (모나 딕) 체인을 시작합니다 . 업 엔드 아톰 UA의 모든 문자열 ( A 자체가 아님)을 반대로 한 다음 결과를 A 와 비교하여 동일합니다. 반환 된 부울 1 은 완전 회문 삼각형을 나타냅니다. 다른 문자열은 0 을 반환 합니다.


젤리 읽는 법을 배워야 해요. (설명, 제발?)
CAD97 2016 년

1
내 답변을 편집했습니다.
데니스

6

Japt , 25 21 17 바이트

@obarakon 덕분에 2 바이트 절약

ò@°T ¬v1
pUmg)eêP

온라인으로 테스트하십시오!

작동 원리

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

우리가 확인하지 않아도됩니다 양쪽 측면을; 측면이 동일하지 않은 경우, 행 중 하나 이상이 회문이 아닙니다.


이 여러 줄이 Japt의 새로운 기능입니까?
Luke

@Luke 예, 방금 화요일에 추가했습니다. 이 :-)을 과시 내 첫 번째 기회
ETHproductions

내 골프 팁을 신경 쓰지 마십시오. 그것은 단지 모든 선이 palindromic인지 여부를 점검하는데, 이것은 또한 올바른 결과를
Luke


4

젤리 , 18 16 바이트

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

온라인으로 사용해보십시오!

사소한 그러나 2 바이트 절약에 대한 Jonathan Allan 에게 감사드립니다 .


내 삼각형 구조를 사용하고 바이트를 저장하십시오.JƲ0;œṗ⁸ZḢ$ṭ$ŒḂ€Ạ
Jonathan Allan

... 파티션이 "최단 압축"되므로 실제로는 그 아이디어를 비진리와 결합하고 다른 바이트를 저장합니다.J²‘Ṭœṗ⁸ZḢ$ṭ$ŒḂ€Ạ
Jonathan Allan

@JonathanAllan Umm ... 왜 내가 왜 필요 ½합니까? 이제 J더 의미가 있습니다 ...
Outgolfer Erik

3

자바 스크립트 (ES6), 112 바이트

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)

t그리고 u그들이 마지막에 테스트 할 수 있도록 측면을 수집합니다.


2

C #, 184 바이트

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

회문 부분에 도달 할 때까지 솔루션이 좋아 보인다고 생각했습니다.

언 골프 버전 :

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=..바이트를 저장하기 위해 for 루프 라인으로 이동할 수 있습니까 ? 줄 바꿈을 바이트 수로 계산할 필요가 없으므로 그렇지 않다고 가정합니다.
TheLethalCoder

아니요 줄 바꿈을 세지 않고 있습니다. 반환 문에서 필요한 e를 루프 원인으로 옮길 수 없습니다.
LiefdeWen

나는 이런 식으로 의미했다....; i < s;e = f.Substring(s - k)){c+=....
TheLethalCoder

2

자바 8, 358301 바이트

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

입력은 a String이고 출력은 a boolean입니다.

설명:

여기에서 시도하십시오.

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

젤리 ,  20  21 바이트

+2 바이트-버그가있는 코드를 릴리스했습니다 :(
-1 바이트-홀수 정수와 같은 성형에서 정사각형 인덱스의 분할로 이동

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

문자 목록을 승인하고 1(Truthy) 또는 0(Falsey)를 반환하는 모나드 링크 .
참고 : 이것은 입력을 제곱 길이로 제한하는 사양 부분을 사용합니다.

온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오.

모든 행이 회 문인 경우 하나의 "측면"만 검사 할 필요가 있음을 지적 하여 17 바이트 로 단순화 할 수 JƲ0;œṗ⁸ZḢ$ṭ$ŒḂ€Ạ있지만, Outgolfer Erik은 이미이 사실을 알아 차리고 답에 사용 했으므로 삼각형 구성 방법을 제공했습니다. 거기에 바이트.

또한 왼쪽 인수 ( ) 가 과도 할 경우 실제 인덱스에서 분할하는 것이 중요하지 않다는 점을 지적 하면 16 바이트 로 향상 될 수 있습니다 J²‘Ṭœṗ⁸ZḢ$ṭ$ŒḂ€Ạ.

어떻게?

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
단, 젤리 대답을하려고 했어요 기술적으로 내 잘못하고 두 배로 길지만 ... 좋은 직업 :) : P
HyperNeutrino

읽기 전에 "왼쪽 인수가 과도 할 경우 진실한 인덱스에서 파티션을 나누는 것은 중요하지 않습니다."
아웃 골퍼 에릭

1

Mathematica, 156 바이트

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&


입력

[ "1101"]


당신 If[<stuff>, True, False]은 단지로 바꿀 수 없습니까 <stuff>? 그리고 나는 And@@(...)보다 짧아서 변수 Count[...,True]==s로 정의 할 필요가 없다는 것을 의미합니다 s.
나무가 아닙니다

잠깐, 이것은 실제로 대각선을 테스트합니까? 몇 가지 테스트 사례 ( "1202""160625052")에 대해 오 탐지를 얻고 있습니다.
나무가 아닙니다

모든 문제가
해결됨


1

자바, 136 바이트

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 컬렉션에서 사용

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


0

Excel VBA, 87 바이트

셀에서 입력 [A1]을 받고 VBE 즉시 창으로 출력하는 익명 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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.