ปรับลดเป็น Palindrome


47

รับสตริงsส่งคืนซับสตริงย่อยที่เล็กที่สุดที่คุณสามารถลบออกเพื่อสร้าง palindrome


ตัวอย่าง:

800233008   -> 2
racecarFOOL -> FOOL
abcdedcba   -> (empty string)
ngryL Myrgn -> "L " (or " M")
123456789   -> 12345678 (or 23456789)
aabcdbaa    -> c (or d)
[[]]        -> [[ (or ]])
a           -> (empty string)

คำแนะนำกรณีทดสอบจากผู้ใช้ (หากคุณพบกรณีขอบไม่อยู่ในรายการโปรดโพสต์ความคิดเห็น):

aabaab      -> b    | Suggested by Zgarb, some returned "aa".

กฎระเบียบ

  • เฉพาะอักขระ ASCII ที่พิมพ์ได้เท่านั้นที่จะปรากฏในอินพุต (ไม่มีการขึ้นบรรทัดใหม่ให้เรียบง่าย)
  • ไม่ได้จริงๆกฎ แต่โน้ต<>, /\, (), []และ{}ไม่ได้ palindromes

นี่คือ , จำนวนไบต์ที่น้อยที่สุดที่ชนะ


Adnan ได้รับการเรียกร้องค่าหัว +100 แล้ว


3
กรณีของ Tesf:aabaab
Zgarb

14
ฉันคิดว่ามันจะช่วยให้ผู้เข้าชมเข้าถึงคำถามได้มากขึ้นหากหลีกเลี่ยงการใช้คำศัพท์ภายในกลุ่มเช่น“ CMC” (มองขึ้นมาดูเหมือนว่าจะเป็น“ การแชทด้วยความท้าทายเล็ก ๆ ”) ซึ่งฉันคิดว่าหมายถึงความท้าทายเล็ก ๆ ไซต์นี้)
ShreevatsaR

ไม่ใช่[[]]palindrome หรือ
Carl

4
@Carl มันอาจมีลักษณะเช่นเดียว ]][[แต่เมื่อคุณกลับตัวอักษรที่คุณจะได้รับ พิจารณาว่าaabbเป็นสิ่งเดียวกันตัวละครที่แตกต่างกัน
Conor O'Brien

1
" (จะได้รับรางวัล 7/12) " เหรอ?
Erik the Outgolfer

คำตอบ:


8

เยลลี่ขนาด 16 ไบต์

Ḣ;Ṫµ=Ṛ
0,0jŒṖÇÞṪ

ลองออนไลน์!

มันทำงานอย่างไร

0,0jŒṖÇÞṪ  Main link. Argument: s (string)

0,0j       Join [0, 0], separating by s. This prepends and appends a 0 to s.
    ŒṖ     Build all partitions of the resulting array.
      ÇÞ   Sort the partitions by the helper link.
           As a side effect, this will remove the first and last element of each
           partition. The 0's make sure that not removing any characters from s
           will still remove [0] from both sides.
        Ṫ  Tail; extract the last one.


Ḣ;Ṫµ=Ṛ     Helper link. Argument: A (array/partition)

Ḣ          Head; yield and remove the first chunk of A.
  Ṫ        Tail; yield and remove the last chunk of A.
 ;         Concatenate head and tail.
   µ=Ṛ     Compare the result, character by character, with its reverse.
           A palindrome of length l will yield an array of l 1's, while a
           non-palindrome of length l will yield an array with at least one 0 among
           the first l/2 Booleans. The lexicographically largest result is the one
           with the longest prefix of 1's, which corresponds to the longest
           palindrome among the outfixes.

10

J , 24 ไบต์

(0{::(-:|.)\.#&,<\)~i.@#

ลองออนไลน์!

คำอธิบาย

(0{::(-:|.)\.#&,<\)~i.@#  Input: array of chars S
                       #  Length of S
                    i.@   Range, [0, 1, ..., len(S)-1]
(                 )~      Dyadic verb on range and S
           \.               For each outfix of S of size x in range
        |.                    Reverse
      -:                      Matches input (is palindrome)
                <\          Box each infix of S of size x in range
             #&,            Flatten each and copy the ones that match
 0{::                       Fetch the result and index 0 and return

บางทีคุณอาจต้องการที่จะเลือก(;&quote f)&>เป็นคำกริยาทดสอบเทียม?
Conor O'Brien

7

ภาษา Wolfram (Mathematica) , 53 51 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส CP-1252

±{a___,Shortest@b___,c___}/;PalindromeQ[a<>c]:={b}

ลองออนไลน์!

กำหนดผู้ประกอบการเอก±(หรือฟังก์ชั่นPlusMinus) อินพุตและเอาต์พุตเป็นรายการของอักขระ ชุดทดสอบทำการแปลงจากและเป็นสตริงจริงเพื่อความสะดวก


การReverseเปรียบเทียบนั้นย้อนกลับกับต้นฉบับที่สั้นกว่า PalindromeQ หรือไม่ ฉันไม่รู้ Mathematica ดังนั้นจึงไม่มีความคิด
Magic Octopus Urn

คำตอบที่ดี แต่ไม่ควรใช้บัญชีเดียวในการแยกสตริงและรวมเข้าด้วยกันในการนับตัวละครของคุณ? Characters@#/.{a___,Shortest@b___,c___}/;PalindromeQ[a<>c]:>b~~""&
Kelly Lowder

@MagicOctopusUrn Reverse[x={a,c}]==xยาวขึ้นสองไบต์ ฉันไม่รู้ว่ามีทางเลือกที่สั้นกว่านี้หรือไม่
Martin Ender

@KellyLowder รายการของตัวละครเป็นตัวแทนที่ถูกต้องของสตริงใน PPCG มันค่อนข้างงุ่มง่ามใน Mathematica ซึ่งปกติคุณจะไม่ใช้การแทนนั้น แต่ก็ยังใช้ได้ ฉันจะขุดเมตาโพสต์
Martin Ender

1
@ KellyLowder ฉันคิดว่านี่เป็นนโยบายที่ยอมรับได้ เหตุผลหลักที่ทำให้มันน่าอึดอัดใจใน Mathematica คือ Mathematica ไม่มีประเภทตัวอักษรที่แท้จริงดังนั้นตัวละครจึงกลายเป็นสตริงเดี่ยว
Martin Ender


5

05AB1E , 18 ไบต์

ā<Œ¯¸«ʒRõsǝÂQ}éнèJ

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


มีการใช้งานตัวกรองที่น่าสนใจ ... เราพยายามทำข้อตกลงแบบ "a ปราศจาก b" แต่ถ้ามีสตริงย่อยสองอินสแตนซ์เราจะได้รับผลกระทบเชิงลบ รู้สึกเหมือนว่าเรากำลังสับสนมากเกินไปตอนนี้ที่ฉันเห็นฮ่า ๆ ๆ เสียงดังฉันจะให้ 100 รางวัลใน 2 วัน
Magic Octopus Urn

ǝเป็นอัจฉริยะอย่างจริงจังแม้ว่า
Magic Octopus Urn


3

Python 2 , 116 ไบต์

def f(i):R=range(len(i)+1);print min([i[y:k+1]for y in R for k in R if(i[:y]+i[k+1:])[::-1]==i[:y]+i[k+1:]],key=len)

ลองออนไลน์!

บันทึกสองสามไบต์ด้วยความช่วยเหลือจากHalvard Hummel !



@ HalvardHummel ขอบคุณฉันวางแผนที่จะเปลี่ยนแปลงเช่นกัน แต่ไม่มีการเชื่อมต่ออินเทอร์เน็ตในช่วง 2 ชั่วโมงที่ผ่านมา
Mr. Xcoder


2

Bash , 108 ไบต์

for((j=0;;j++)){
for((i=0;i<${#1};i++)){
r=${1:0:i}${1:j+i}
[[ $r = `rev<<<$r` ]]&&echo "${1:i:j}"&&exit
}
}

รับอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่ง

ลองออนไลน์! ด้วยเครื่องหมายคำพูดที่พิมพ์รอบเอาท์พุทสำหรับการดูช่องว่างนำหน้า / ต่อท้าย


2

อารัมภบท 271 ไบต์

p([_]).
p([X,X]).
p([X|Y]):-append([P,[X]],Y),p(P).

s(P,M,S,R,N):-p(P),append([M,S],N).
s(P,M,S,S,N):-p(S),append([P,M],N).
s(P,M,S,P,M):-append([P,S],X),p(X).

d(Y,P,N):-
    findall([A,B,C],(append([R,M,X],Y),s(R,M,X,B,C),length(B,A)),S),
    sort(1,@>,S,[[_,P,N]|_]).

เมื่อถึงจุดหนึ่งฉันก็รู้ว่านี่จะเป็นเรื่องใหญ่ตามมาตรฐานรหัสกอล์ฟดังนั้นฉันจึงเก็บช่องว่างพิเศษไว้สองสามอันเพื่อรักษาความคล้ายคลึงกับเวอร์ชันที่ไม่ยุ่งเหยิง แต่ฉันก็ยังคิดว่ามันน่าสนใจเพราะมันเป็นวิธีการที่แตกต่างกับปัญหา

รุ่นที่ไม่ซับซ้อน:

palindrome([_]).
palindrome([X, X]).
palindrome([X | Xs]) :-
    append([Prefix, [X]], Xs),
    palindrome(Prefix).

palindrome_split(Prefix, Mid, Suffix, Prefix, N) :-
    palindrome(Prefix),
    append([Mid, Suffix], N).
palindrome_split(Prefix, Mid, Suffix, Suffix, N) :-
    palindrome(Suffix),
    append([Prefix, Mid], N).
palindrome_split(Prefix, Mid, Suffix, P, Mid) :-
    append([Prefix, Suffix], P),
    palindrome(P).

palindrome_downgrade(NP, P, N):-
    findall(
        [La, Pa, Na],
        (append([Prefix, Mid, Suffix], NP),
         palindrome_split(Prefix, Mid, Suffix, Pa, Na),
         length(Pa, La)),
        Palindromes),
    sort(1, @>, Palindromes, [[_, P, N] | _]).

2

C ++, 254 248 246 ไบต์

-6 ไบต์ขอบคุณZacharý -2 ไบต์ขอบคุณ Toby Speight

#include<string>
#define S size()
#define T return
using s=std::string;int p(s t){for(int i=0;i<t.S;++i)if(t[i]!=t[t.S-i-1])T 0;T 1;}s d(s e){if(!p(e))for(int i,w=1;w<e.S;++w)for(i=0;i<=e.S-w;++i){s t=e;t.erase(i,w);if(p(t))T e.substr(i,w);}T"";}

ดังนั้น...

  • ฉันใช้Tเป็นคำจำกัดความของแมโครเนื่องจากการทำR""เช่นนี้มีผลกับสตริงตัวอักษรอีกตัว (เป็นคำนำหน้าที่ใช้เพื่อกำหนดตัวอักษรสตริงดิบดูcppreferenceสำหรับข้อมูลเพิ่มเติม) ที่ไม่มีเมื่อฉันทำT""
  • ข้อกำหนดของตัวประมวลผลล่วงหน้าไม่สามารถอยู่ในบรรทัดเดียวกันและต้องมีช่องว่างอย่างน้อยหนึ่งช่องว่างระหว่างชื่อและเนื้อหาในคำจำกัดความ
  • 2 ฟังก์ชั่น: p(std::string)เพื่อทดสอบว่าสตริงเป็น Palindrome หรือไม่ ถ้าเป็นมันจะคืนค่า1ที่ปลดเปลื้องไปtrueมิฉะนั้นจะคืนค่า0ซึ่งปลดเปลื้องไปfalse
  • ห่วงขั้นตอนวิธีการที่ผ่านการทดสอบสตริงทั้งหากเป็น palindrome เมื่อลบในแต่ละครั้งที่ 1 องค์ประกอบแล้วทดสอบการลบ 2 องค์ประกอบ (ลูปมากกว่าที่ขนาดสูงสุดของสตริง) the last index - number of erased charจากดัชนีแรกที่ หากพบว่าการลบบางส่วนเป็น Palindrome จะส่งคืน ตัวอย่างเช่นเมื่อผ่านสตริง"aabcdbaa"เป็นพารามิเตอร์ทั้งคู่cและdเป็นคำตอบที่ถูกต้อง แต่รหัสนี้จะกลับมาcเพราะการลบและการทดสอบถ้ามันเป็น Palindrome มาก่อนการทดสอบว่าการลบdและการทดสอบถ้ามันเป็น Palindrome
  • นี่คือรหัสที่จะทดสอบ:

    std::initializer_list<std::pair<std::string, std::string>> test{
        {"800233008","2"},
        { "racecarFOOL","FOOL" },
        { "abcdedcba","" },
        { "ngryL Myrgn","L " },
        { "123456789","12345678" },
        { "aabcdbaa","c" },
        { "[[]]","[[" },
        { "a","" },
        { "aabaab","b" }
    };
    
    for (const auto& a : test) {
        if (a.second != d(a.first)) {
            std::cout << "Error on : " << a.first << " - Answer : " << a.second  << " - Current : " << d(a.first) << '\n';
        }
    }

สิ่งนี้จะใช้ได้กับบรรทัดสุดท้ายหรือไม่ using s=std::string;int p(s t){for(int i=0;i<t.S/2;++i)if(t[i]!=t[t.S-i-1])T 0;T 1;}s d(s e){if(!p(e))for(int i,w=1;w<e.S;++w)for(i=0;i<=e.S-w;++i){s t=e;t.erase(i,w);if(p(t))T e.substr(i,w);}T"";}
Zacharý

สามารถ/2ละเว้นได้หรือไม่ การวนซ้ำไปตามความยาวทั้งหมดจะเป็นการทำซ้ำการทดสอบที่เราทำซึ่งไม่เป็นอันตราย คุณอาจต้องการขยายความหมายของ "เอฟเฟ็กต์อื่น" ของR""(เช่นแยกวิเคราะห์เป็นตัวอักษรสตริงดิบ)
Toby Speight

ฉันได้มีการปรับเปลี่ยนและเพิ่มผลที่เป็นคำตอบของตัวเอง
Toby Speight


1

PHP 104 + 1 ไบต์

while(~($s=$argn)[$e+$i++]?:++$e|$i=0)strrev($t=substr_replace($s,"",$i,$e))==$t&&die(substr($s,$i,$e));

ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์


1

Haskell , 109 105 ไบต์

snd.minimum.([]#)
p#s@(a:b)=[(i,take i s)|i<-[0..length s],(==)<*>reverse$p++drop i s]++(p++[a])#b
p#_=[]

ลองออนไลน์!

แก้ไข: ขอบคุณ @ H.PWiz สำหรับการปิด 4 ไบต์! ฉันต้องดีขึ้นด้วยพระเหล่านั้น!


1

JavaScript, 90 ไบต์

a=>a.map((_,p)=>a.map((_,q)=>k||(t=(b=[...a]).splice(q,p),k=''+b==b.reverse()&&t)),k=0)&&k

ลองออนไลน์!



1

JavaScript (ES6), 91 78 ไบต์

(s,i=0,j=0,S=[...s],b=S.splice(i,j))=>S+''==S.reverse()?b:f(s,s[++i]?i:!++j,j)

อินพุตและเอาต์พุตเป็นรายการของอักขระ

เอาชิ้นที่ใหญ่ขึ้นและใหญ่ขึ้นซ้ำ ๆ ออกจากอินพุตจนกว่าจะพบ Palindrome

ตัวอย่างข้อมูล:


1

TSQL (2016) 349B

ไม่ใช่โซลูชันที่กะทัดรัด แต่ตรงไปตรงมาที่สุด:

DECLARE @i VARCHAR(255)='racecarFOOL'
;WITH DAT(v,i,l)AS(SELECT value,(ROW_NUMBER()OVER(ORDER BY value))-1,LEN(@i)FROM STRING_SPLIT(REPLICATE(@i+';',LEN(@i)+1),';')WHERE value<>'')
SELECT TOP 1C,S
FROM(SELECT LEFT(D.v, D.i)+SUBSTRING(D.v,D.i+E.i+1,D.l)C,SUBSTRING(D.v,D.i+1,E.i)S
FROM DAT D CROSS APPLY DAT E)C
WHERE C=REVERSE(C)
ORDER BY LEN(C)DESC

คุณสามารถใช้@เป็นตัวแปรสำหรับไม่กี่ไบต์ ใน CTE คุณสามารถใช้where''=value)อีกอันหนึ่งและคุณไม่จำเป็นต้องส่งคืนCผลลัพธ์
MickyT

1

Husk , 18 ไบต์

◄LfmS=↔†!⁰ṠM-Qŀ⁰Q⁰

ลองออนไลน์!

คำอธิบาย

◄LfmS=↔†!⁰ṠM-Qŀ⁰Q⁰  Input is a string, say s="aab"
              ŀ⁰    Indices of s: x=[1,2,3]
             Q      Slices: [[],[1],[1,2],[2],[1,2,3],[2,3],[3]]
          ṠM-       Remove each from x: [[1,2,3],[2,3],[3],[1,3],[],[1],[1,2]]
       †!⁰          Index into s: ["aab","ab","b","ab","","a","aa"]
   mS=↔             Check which are palindromes: [0,0,1,0,1,1,1]
  f             Q⁰  Filter the slices of s by this list: ["aa","aab","ab","b"]
◄L                  Minimum on length: "b"


1

C ++, 189 186 176 167 ไบต์

ฉันเริ่มต้นด้วยคำตอบของ HatsuPointerKunเปลี่ยนการทดสอบเพื่อเปรียบเทียบความเท่าเทียมกับสตริงที่ตรงกันข้าม จากนั้นฉันเปลี่ยนวิธีที่เราแจกแจงสตริงผู้สมัคร ติดตามสิ่งนี้มาโครใช้เพียงครั้งเดียวหรือสองครั้งและมันสั้นกว่าเพื่อแทรกเข้ามา

#include<string>
using s=std::string;s d(s e){for(int i,w=0;;++w){s t=e.substr(w);for(i=-1;++i<=t.size();t[i]=e[i])if(t==s{t.rbegin(),t.rend()})return e.substr(i,w);}}

คำอธิบาย

รหัสที่สามารถอ่านได้ที่เท่าเทียมกัน:

std::string downgrade(std::string e)
{
    for (int w=0; ; ++w) {
        std::string t = e.substr(w);
        for (int i=0;  i<=t.size();  ++i) {
            if (t == std::string{t.rbegin(),t.rend()})
                // We made a palindrome by removing w chars beginning at i
                return e.substr(i,w);
            t[i] = e[i];  // next candidate
        }
    }
}

การแจงนับของผู้สมัครเริ่มต้นด้วยการเริ่มต้นสตริงด้วยwอักขระตัวแรกที่ละเว้นและคัดลอกอักขระต่อเนื่องจากต้นฉบับเพื่อย้ายช่องว่าง ตัวอย่างเช่นกับสตริงfoobarและw== 2:

foobar
  ↓↓↓↓
  obar
foobar
↓
fbar
foobar
 ↓
foar
foobar
  ↓
foor
foobar
   ↓
foob

ผ่านครั้งแรก (พร้อม w == 0) เป็นแบบไม่มี op ดังนั้นสตริงทั้งหมดจะถูกพิจารณาซ้ำแล้วซ้ำอีก ไม่เป็นไร - ประสิทธิภาพการเล่นกอล์ฟสำคัญกว่า! การวนซ้ำครั้งสุดท้ายของการวนซ้ำนี้จะเข้าถึงดัชนีที่เกิดขึ้นครั้งสุดท้าย ฉันดูเหมือนจะหลบไปกับสิ่งนั้นด้วย GCC แต่อย่างเคร่งครัดนั่นคือพฤติกรรมที่ไม่ได้กำหนด

โปรแกรมทดสอบ

การยกโดยตรงจากคำตอบของ HatsuPointerKun :

static const std::initializer_list<std::pair<std::string, std::string>> test{
    { "800233008", "2" },
    { "racecarFOOL", "FOOL" },
    { "abcdedcba", "" },
    { "ngryL Myrgn", "L " },
    { "123456789", "12345678" },
    { "aabcdbaa", "c" },
    { "[[]]", "[[" },
    { "a","" },
    { "aabaab", "b" }
};

#include <iostream>
int main()
{
    for (const auto& a : test) {
        if (a.second != d(a.first)) {
            std::cout << "Error on: " << a.first
                      << " - Expected: " << a.second
                      << " - Actual: " << d(a.first) << '\n';
        }
    }
}

0

REXX, 132 ไบต์

a=arg(1)
l=length(a)
do i=1 to l
  do j=0 to l-i+1
    b=delstr(a,i,j)
    if b=reverse(b) & m>j then do
      m=j
      s=substr(a,i,j)
      end
    end
  end
say s

0

Ruby , 86 84 ไบต์

->s{l=i=0
(l+=(i+=1)/z=s.size-l+1
i%=z)while(w=s[0,i]+s[i+l..-1])!=w.reverse
s[i,l]}

ลองออนไลน์!

  • บันทึก 2 ไบต์ต้องขอบคุณ Cyoce

z=s.size-l+1คุณไม่จำเป็นต้องวงเล็บรอบ
Cyoce

@Cyoce ขอบคุณ ฉันมีช่วงเวลาที่ยากลำบากในการจดจำลำดับความสำคัญของโอเปอเรเตอร์ทั้งหมด
iamnotmaynard

0

C (gcc) , 307 ไบต์

#define T malloc(K)
P(S,i,y,z,k,u,L,K,V)char*S;{char*M,*R,*E;K=strlen(S);M=T;R=T;E=T;for(i=0;i<K;++i){for(y=0;y<=K-i;++y){strcpy(M,S);for(z=y;z<y+i;E[z-y]=M[z],++z);for(k=y;k+i<=K;M[k]=M[k+i],++k);V=strlen(M);strcpy(R,M);for(u=0;u<V/2;L=R[u],R[u]=R[V-u-1],R[V-u-1]=L,++u);if(!strcmp(M,R))puts(E),exit(0);}}}

ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.