สามเหลี่ยม Palindromic เต็ม


18

160615051พิจารณาสตริง มันอาจเป็น "triangulated" เช่น:

  1
 606
15051

จากนั้นแต่ละแถวจะมีลักษณะสีทึบ นอกจากนี้โปรดทราบว่าแต่ละด้านของเส้นรอบวงก็มีลักษณะเป็นสีน้ำตาล:

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

ดังนั้นสตริงนี้ถือได้ว่าเป็นรูปสามเหลี่ยม palindromic ไม่ต้องกังวลเกี่ยวกับระดับความสูง100ในกรณีนี้มันไม่จำเป็นต้องเป็น Palindromic

อินพุต:สตริงอักขระ ASCII ที่พิมพ์ได้จาก 0x20 ถึง 0x7E นี่อาจเป็นอาเรย์ตัวอักษรสตริงเดี่ยวหรืออาเรย์ของจุดรหัส ASCII การป้อนข้อมูลของคุณจะสามารถถูกวิเคราะห์แบบสามเหลี่ยมได้ (นั่นคือความยาวของมันจะเป็นรูปสี่เหลี่ยมจัตุรัสที่สมบูรณ์แบบเสมอ)

เอาท์พุท : ค่าความจริงถ้าสตริงเป็นรูปสามเหลี่ยม Palindromic เต็มหรือค่าเท็จเป็นอย่างอื่น

กรณีทดสอบ

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 = 9และ1 + 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 ทั้งหมดเพื่อหาค่ากำลังสอง สำหรับตัวอย่างของเราจากด้านบนนี่ให้ผลแบบอาร์เรย์บูลีนต่อไปนี้

 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¦ก่อน

¦เป็นเบาบางอย่างรวดเร็ว ใช้สองลิงก์จากสแต็กโดยเฉพาะ1และZในกรณีนี้ อันดับแรกZจะนำไปใช้กับอาร์กิวเมนต์: อาร์เรย์ของสตริงจากก่อนหน้า Zคือzip atom และอ่านอาร์เรย์สตริง / อาร์เรย์อักขระ 2D ตามคอลัมน์โดยให้ผลลัพธ์

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

สิ่งที่เคยเป็นทางด้านซ้ายของสายป้อนและคอลัมน์แรกของอาร์เรย์สตริงตอนนี้กลายเป็นคนแรกที่สตริง

ตอนนี้¦แอบที่และพบว่าดัชนีเดียว:1 1 ดังนั้นสตริงแรกในอาร์เรย์สตริงเดิมจะถูกแทนที่ด้วยสตริงแรกในค่าส่งคืนของ; สตริงที่ดัชนีอื่น ๆ ยังคงไม่ได้รับผลกระทบZ

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

ขอเรียกอาร์เรย์นี้

เราใช้Z⁻¦แทนZ1¦แต่สิ่งนี้ไม่สร้างความแตกต่าง: เปรียบเทียบอาร์เรย์สตริงกับสตริงอินพุตสำหรับความไม่เท่าเทียมกันโดยให้ผลลัพธ์1เนื่องจากมีค่าไม่เท่ากัน ความแตกต่างระหว่างทั้งสองก็คือว่าZ⁻¦เป็นเพราะ dyadic คือช่วยให้เราสามารถเขียนแทนœṗZ⁻¦ œṗ¹Z1¦นี่เป็นเพราะ dyad ( œṗ) ตามด้วย monad ( œṗ¹Z1¦) คือfork (monad ถูกนำไปใช้กับอาร์กิวเมนต์ของ chain / สตริงอินพุตและค่าที่ส่งคืนจะถูกส่งผ่านเป็นอาร์กิวเมนต์ที่ถูกต้องไปœṗ) ในขณะที่ dyad ตามด้วย dyad อื่น (หรือที่ส่วนท้ายของห่วงโซ่) คือตะขอคืออาร์กิวเมนต์ที่ถูกต้องคืออาร์กิวเมนต์ของห่วงโซ่

สิ่งที่เหลืออยู่ที่ต้องทำคือการตรวจสอบความรุนแรง µเริ่มต้นใหม่ (เอก) ห่วงโซ่ที่เป็นอาร์กิวเมนต์เป็น คว่ำอะตอมกลับสตริงทั้งหมดใน( แต่ไม่ตัวเอง) แล้วเปรียบเทียบผลที่ได้กับเพื่อความเท่าเทียมกัน บูลีนที่ส่งคืน1ระบุว่าเป็นสามเหลี่ยม Palindromic สายอื่น ๆ จะกลับ0U


ฉันควรเรียนรู้วิธีอ่านเยลลี่จริงๆ (คำอธิบายได้โปรด?)
CAD97

1
ฉันแก้ไขคำตอบของฉันแล้ว
Dennis

6

Japt , 25 21 17 ไบต์

บันทึก 2 ไบต์ขอบคุณ @obarakon

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

โปรดทราบว่าเราไม่จำเป็นต้องตรวจสอบทั้งสองด้าน หากด้านข้างไม่เหมือนกันอย่างน้อยหนึ่งแถวจะไม่เป็นแบบ palindrome


นี่เป็นคุณสมบัติใหม่ของ Japt หรือไม่ multiline
ลุค

@ ลุคใช่ฉันเพิ่งเพิ่มเข้าไปในวันอังคาร นี่เป็นโอกาสครั้งแรกของฉันที่จะอวดมัน :-)
ETHproductions

ไม่ต้องสนใจเคล็ดลับการตีกอล์ฟของฉัน มันก็ตรวจสอบว่าทุกบรรทัดเป็น palindromic ซึ่งยังเกิดขึ้นที่จะให้ผลลัพธ์ที่ถูกต้อง ...
ลุค

4

05AB1E , 18 ไบต์

gÅÉ£õÜÐíQs€¬āÈÏÂQ*

ใช้การเข้ารหัส05AB1E ลองออนไลน์!


คุณสามารถบันทึกหนึ่งไบต์ด้วยการแก้ไขเล็กน้อยgÅÉ£ÐíQs€¬āÈÏJÂQ*
kalsowerus

gÅÉ£เจ้าเล่ห์เจ้าเล่ห์ ... ข้าประเมินต่ำไปเลยlist-commands.py
Magic Octopus Urn

4

เยลลี่ , 18 16 ไบต์

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

ลองออนไลน์!

ขอบคุณJonathan Allanสำหรับการประหยัดเล็กน้อย แต่ไม่ชัดเจน -2 ไบต์


ใช้โครงสร้างสามเหลี่ยมของฉันและบันทึก byte:JƲ0;œṗ⁸ZḢ$ṭ$ŒḂ€Ạ
Jonathan Allan

... ในความเป็นจริงรวมความคิดนั้นกับความจริงและบันทึกไบต์อื่นเนื่องจากการแบ่งจะ "zip shortest":J²‘Ṭœṗ⁸ZḢ$ṭ$ŒḂ€Ạ
Jonathan Allan

@JanathanAllan อืมม ... ทำไมฉันต้องทำอะไร½เลย? ตอนนี้Jสมเหตุสมผลมากขึ้น ...
Erik the Outgolfer

3

JavaScript (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 for line เพื่อบันทึก byte ได้หรือไม่? ไม่จำเป็นต้องนับบรรทัดใหม่เป็นจำนวนไบต์ดังนั้นฉันจึงถือว่าคุณไม่ได้
TheLethalCoder

ไม่ฉันไม่นับบรรทัดใหม่ฉันไม่สามารถย้าย e เข้าสู่ลูปได้เพราะฉันต้องการในคำสั่ง return
LiefdeWen

ฉันหมายถึงเช่นนี้....; i < s;e = f.Substring(s - k)){c+=....
TheLethalCoder

2

Java 8, 358 301 ไบต์

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

การป้อนข้อมูลเป็นเอาท์พุทเป็นStringboolean

คำอธิบาย:

ลองที่นี่

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Ḣ$ṭ$ŒḂ€Ạ

ลิงก์ monadic ยอมรับรายการของอักขระและส่งคืน1(Truthy) หรือ0(Falsey)
หมายเหตุ: ใช้ส่วนของข้อมูลจำเพาะที่ จำกัด อินพุตให้มีความยาวจตุรัส

ลองออนไลน์! หรือดูชุดทดสอบ

นี่อาจจะง่ายขึ้นถึง17 ไบต์โดยสังเกตว่าหากทุกแถวเป็น palindromes เพียงหนึ่ง "ด้าน" จำเป็นต้องตรวจสอบ ( JƲ0;œṗ⁸ZḢ$ṭ$ŒḂ€Ạ) อย่างไรก็ตาม Erik the Outgolfer สังเกตเห็นความจริงนี้แล้วและใช้มันในคำตอบของพวกเขาดังนั้นฉันจึงให้วิธีการสร้างสามเหลี่ยม ไบต์ที่นั่น

นอกจากนี้ในทางกลับกันอาจได้รับการปรับปรุงเป็น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

"การสังเกตว่าการแบ่งที่ดัชนีความจริงไม่ได้สนใจหากมีอาร์กิวเมนต์ส่วนที่เกิน" สังเกตเห็นก่อนอ่าน
Erik the Outgolfer

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")
ไม่ใช่ต้นไม้

แก้ไขปัญหาทั้งหมดแล้ว
J42161217

1

PHP , 97 ไบต์

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

ลองออนไลน์!


เดี๋ยวก่อนนี่เป็นการทดสอบเส้นทแยงมุมหรือไม่? ฉันได้รับผลบวกปลอมสำหรับกรณีทดสอบสองสามกรณี ("1202" และ "160625052")
J42161217

@Jenny_mathy ตอนนี้ใช้ได้
JörgHülsermann

1

Java, 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 ไบต์

ฟังก์ชันหน้าต่าง VBE แบบไม่ระบุชื่อทันทีที่รับอินพุตจากเซลล์[A1]และเอาต์พุตไปยังหน้าต่างทันที 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.