Hạ cấp xuống một Palindrom


47

Đưa ra một chuỗi s, trả về chuỗi con liền kề nhỏ nhất mà bạn có thể loại bỏ để tạo một bảng màu.


Ví dụ:

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

Kiểm tra đề xuất trường hợp từ người dùng (nếu bạn tìm thấy một trường hợp cạnh không được liệt kê, xin vui lòng gửi bình luận):

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

Quy tắc

  • Chỉ các ký tự ASCII có thể in sẽ xuất hiện trong đầu vào (không có dòng mới, giữ cho nó đơn giản).
  • Không thực sự là một quy luật, nhưng lưu ý <>, /\, (), []{}không palindromes.

Đây là , byte nhỏ nhất.


+100 tiền thưởng đã được yêu cầu bởi Adnan


3
Trường hợp Tesf:aabaab
Zgarb

14
Tôi nghĩ rằng nó sẽ giúp giữ cho các khách truy cập có thể tiếp cận được nhiều câu hỏi hơn nếu tránh được những câu nói khó hiểu như Trò chơi điện tử (tìm kiếm nó, nó xuất hiện để thử thách trò chuyện mini Trò chuyện, mà tôi tưởng tượng có nghĩa là một thử thách nhỏ được đăng trong phòng trò chuyện liên quan đến trang web này).
ShreevatsaR

Không phải là [[]]một palindrom?
Carl

4
@Carl Nó có thể trông giống như một, nhưng khi bạn đảo ngược các ký tự, bạn sẽ nhận được ]][[. Hãy coi đó aabblà điều tương tự, chỉ là các nhân vật khác nhau.
Conor O'Brien

1
" (Sẽ được thưởng 7/12) " hả?
Erik the Outgolfer

Câu trả lời:


8

Thạch , 16 byte

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

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

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

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 byte

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

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

Giải trình

(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

Có lẽ bạn có thể muốn chọn (;&quote f)&>làm động từ khai thác thử nghiệm?
Conor O'Brien

7

Ngôn ngữ Wolfram (Mathicala) , 53 51 byte

Số lượng byte giả định mã hóa CP-1252.

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

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

Xác định một toán tử đơn nguyên ±(hoặc một hàm PlusMinus). Đầu vào và đầu ra là danh sách các ký tự. Bộ kiểm tra thực hiện chuyển đổi từ và sang chuỗi thực tế để thuận tiện.


Có phải Reversesau đó so sánh ngược lại với bản gốc ngắn hơn PalindromeQ? Tôi không biết Mathicala, nên không biết.
Bạch tuộc ma thuật Urn

Câu trả lời hay, nhưng không nên là một tài khoản cho việc chia chuỗi và nối chúng lại với nhau trong số lượng ký tự của bạn? Characters@#/.{a___,Shortest@b___,c___}/;PalindromeQ[a<>c]:>b~~""&
Kelly Lowder

@MagicOctopusUrn Reverse[x={a,c}]==xdài hơn hai byte. Tôi không biết liệu có bất kỳ thay thế ngắn hơn.
Martin Ender

@KellyLowder Danh sách các ký tự là biểu diễn hợp lệ của chuỗi trên PPCG. Có một chút lúng túng trong Mathematica, nơi bạn thường không sử dụng đại diện đó, nhưng nó vẫn hợp lệ. Tôi sẽ đào một bài meta.
Martin Ender

1
@KellyLowder Tôi nghĩ đây là chính sách được chấp nhận . Lý do chính tại sao nó khó xử trong Mathematica là Mathicala không có kiểu ký tự thực tế, vì vậy các ký tự cuối cùng là các chuỗi đơn.
Martin Ender


5

05AB1E , 18 byte

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

Sử dụng mã hóa 05AB1E . Hãy thử trực tuyến!


Việc sử dụng bộ lọc thú vị ở đó ... Chúng tôi đã cố gắng thực hiện loại thỏa thuận "không có b", nhưng nếu có hai trường hợp của chuỗi con, chúng tôi sẽ nhận được phủ định sai. Cảm giác như chúng tôi đã quá phức tạp khi tôi thấy lol này. Noice, tôi sẽ cho bạn 100 tiền thưởng sau 2 ngày.
Bạch tuộc ma thuật Urn

ǝlà thiên tài nghiêm túc mặc dù.
Bạch tuộc ma thuật Urn




2

Bash , 108 byte

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

Lấy đầu vào làm đối số dòng lệnh.

Hãy thử trực tuyến! với các trích dẫn được in xung quanh đầu ra để xem các không gian hàng đầu / dấu.


2

Prolog , 271 byte

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]|_]).

Tại một số thời điểm, tôi nhận ra rằng điều này sẽ rất lớn theo tiêu chuẩn golf-code, vì vậy tôi đã giữ thêm một vài khoảng trống để duy trì sự tương đồng với phiên bản không bị che khuất. Nhưng tôi vẫn nghĩ nó có thể thú vị vì đó là một cách tiếp cận vấn đề khác.

Phiên bản không bị xáo trộ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 byte

-6 byte nhờ Zacharý -2 byte nhờ 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"";}

Vì thế...

  • Tôi đã sử dụng Tnhư một định nghĩa vĩ mô vì thực hiện R""như một hiệu ứng khác trên chuỗi ký tự (đó là tiền tố được sử dụng để xác định các chuỗi ký tự thô, xem cppreference để biết thêm thông tin) không có ở đó khi tôi làmT""
  • Các định nghĩa tiền xử lý không thể nằm trên cùng một dòng và phải có ít nhất một khoảng trắng giữa tên và nội dung trong định nghĩa
  • 2 hàm: p(std::string)để kiểm tra xem chuỗi có phải là palindrom không. Nếu có, nó trả về 1phôi truenào, nó trả về 0, phôi nàofalse
  • Thuật toán lặp trên toàn bộ chuỗi kiểm tra nếu đó là một bảng màu khi xóa mỗi lần 1 phần tử, sau đó kiểm tra xóa 2 phần tử (vòng lặp trên đó đến kích thước tối đa của chuỗi), từ chỉ mục đầu tiên đến the last index - number of erased char. Nếu nó tìm thấy xóa một số phần là một palindrom, sau đó, nó trở lại. Ví dụ: khi truyền chuỗi "aabcdbaa"dưới dạng tham số, cả hai cdđều là câu trả lời hợp lệ, nhưng mã này sẽ trả về cvì xóa nó và kiểm tra nếu đó là một palindrom xuất hiện trước khi kiểm tra nếu xóa dvà kiểm tra nếu đó là palindrom
  • Đây là mã để kiểm tra:

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

Điều này sẽ làm việc cho dòng cuối cùng? 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ý

Có thể /2được bỏ qua? Lặp lại trên toàn bộ chiều dài sẽ chỉ đơn giản lặp lại các thử nghiệm chúng tôi đã thực hiện, điều này sẽ vô hại. Bạn có thể muốn mở rộng ý của bạn bằng "hiệu ứng khác" của R""(nghĩa là nó được phân tích cú pháp dưới dạng một chuỗi ký tự thô).
Toby Speight

Tôi đã sửa đổi điều này và thêm kết quả như một câu trả lời của riêng tôi .
Toby Speight


1

PHP 104 + 1 byte

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

Chạy như ống với -nRhoặc thử trực tuyến .



1

JavaScript, 90 byte

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

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



1

JavaScript (ES6), 91 78 byte

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

Đầu vào và đầu ra là danh sách các ký tự.

Đệ quy loại bỏ một lát lớn hơn và lớn hơn từ đầu vào cho đến khi tìm thấy một palindrom.

Đoạn trích:


1

TSQL (2016) 349B

Không phải là giải pháp nhỏ gọn nhất nhưng đơn giản nhất:

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

Bạn có thể sử dụng @như một biến cho một vài byte. Trong CTE, bạn có thể sử dụng where''=value)cho một số khác và bạn không cần phải trả lại Ckết quả.
MickyT

1

Husk , 18 byte

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

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

Giải trình

◄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 byte

Tôi bắt đầu với câu trả lời của HatsuPulumKun , thay đổi bài kiểm tra để đơn giản so sánh sự bình đẳng với chuỗi đảo ngược; sau đó tôi đã thay đổi cách chúng ta liệt kê các chuỗi ứng cử viên. Theo đó, các macro chỉ được sử dụng một hoặc hai lần mỗi macro và nó ngắn hơn để nội tuyến chúng.

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

Giải trình

Mã tương đương có thể đọc được:

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

Việc liệt kê các ứng cử viên bắt đầu bằng cách khởi tạo một chuỗi với các wký tự đầu tiên được bỏ qua, sau đó sao chép các ký tự liên tiếp từ bản gốc để di chuyển khoảng cách. Ví dụ: với chuỗi foobarw== 2:

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

Vượt qua đầu tiên (với w== 0) là không có op, vì vậy chuỗi đầy đủ sẽ được xem xét lại nhiều lần. Đó là tốt - hiệu quả hơn so với golf! Lặp lại cuối cùng của vòng lặp này sẽ truy cập vào chỉ mục một quá khứ; Tôi dường như thoát khỏi điều đó với GCC, nhưng nghiêm túc, đó là Hành vi không xác định.

Chương trình kiểm tra

Thang máy trực tiếp từ câu trả lời của HatsuPulumKun :

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 byte

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 byte

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

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

  • Đã lưu 2 byte nhờ Cyoce

Bạn không cần dấu ngoặc đơn xung quanh z=s.size-l+1.
Cyoce

@Cyoce Cảm ơn bạn. Tôi có một thời gian khó nhớ tất cả các ưu tiên điều hành.
iamnotmaynard

0

C (gcc) , 307 byte

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

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

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.