Dizeleri palindromizing


30

Giriş

Bilmeyenler için bir palindrom, bir dize, dizeye geri eşit olduğundadır (birleşim, boşluklar, vs. hariç). Bir palindromun bir örneği:

abcdcba

Bunu tersine çevirirseniz, sona erersiniz:

abcdcba

Aynı olan. Dolayısıyla biz buna bir palindrom diyoruz. Bir şeyleri palindromize etmek için, bir dize örneğine bakalım:

adbcb

Bu bir palindrom değil. Bunu palindromize etmek için, tersine çevrilmiş dizeyi ilk dizenin sağındaki ilk dizeye birleştirmemiz ve her iki sürümü de aynı tutmamız gerekir . Daha kısa, daha iyi.

Deneyebileceğimiz ilk şey şudur:

adbcb
bcbda
^^ ^^

Tüm karakterler eşleşmez, bu nedenle ters dizge için doğru konum bu değildir. Sağa bir adım gideriz:

adbcb
 bcbda
 ^^^^

Bu aynı zamanda tüm karakterlerle eşleşmiyor. Sağa doğru bir adım daha atıyoruz:

adbcb
  bcbda

Bu sefer, tüm karakterler eşleşiyor . Biz yapabilirsiniz birleştirme hem dize zedelemeden . Nihai sonuç:

adbcbda

Bu palindromize dizedir .


Görev

Yalnızca küçük harf içeren (veya daha iyi olursa büyük harf ) bir dize verildiğinde , palindromize dizenin çıktısını alın .


Test durumları

Input     Output

abcb      abcba
hello     hellolleh
bonobo    bonobonob
radar     radar
hex       hexeh

Bu , bu yüzden en az sayıda bayt olan gönderim kazanıyor!



6
Tersine çevrilen dizenin, orijinal dizeye sağ tarafta ters çevrilmiş olanla birleştirilmesi gerektiğini belirtmelisiniz. Sola gidebilirse obonobo, test durumuna daha iyi bir çözüm olacaktır.
Seviye River St


2
+1 @LevelRiverSt sadece "obonobo" böyle muhteşem kelime olduğu
Nathaniel

1
@Nathaniel Teşekkürler ama bono b o nobbir cümle. Tanrı ve Bono arasındaki fark nedir? Tanrı, Dublin’de Bono gibi davranarak dolaşmıyor ;-)
Level River St

Yanıtlar:


5

Jöle, 11 10 bayt

ṫỤfU$Ḣœ^;U

Çevrimiçi deneyin!

Nasıl çalışır

ṫỤfU$Ḣœ^;U  Main link. Argument: s (string)

 Ụ          Yield all indices of s, sorted by their corr. character values.
ṫ           Tail; for each index n, remove all characters before thr nth.
            This yields the list of suffixes of s, sorted by their first character,
            then (in descending order) by length.
    $       Combine the two links to the left into a chain:
   U        Upend; reverse all suffixes.
  f         Filter; only keep suffixes that are also reversed suffixes.
            This gives the list of all palindromic suffixes. Since all of them
            start with the same letter, they are sorted by length.
     Ḣ      Head; select the first, longest palindromic suffix.
      œ^    Multiset symmetric difference; chop the selected suffix from s.
         U  Upend; yield s, reversed.
        ;   Concatenate the results to the left and to the right.

15

Pyth (b93a874 işleme), 11 bayt

.VkI_IJ+zbB

Test odası

Bu kod, geçerli Pyth sürümündeki bir hatayı kullanır, b93a874'ü kabul eder . Hata yani _IJ+zbo sanki ayrıştırılır q_J+zbJ+zbeşdeğer olan _I+zb+zb, bu (Pyth tasarım niyeti ile) olarak çözümlenen gerekirkenq_J+zbJ eşdeğer olan _I+zb. Bu bir bayt kaydetmeme izin veriyor - hata giderildikten sonra doğru kod olacak .VkI_IJ+zbJB. Bunun yerine bu kodu açıklayacağım.

Temel olarak, code brute, bir palindrome oluşturmak için girdiye eklenebilecek en kısa dizeyi bulana kadar tüm olası dizgileri zorlar ve birleştirilmiş dizeyi çıkarır.

.VkI_IJ+zbJB
                z = input()
.Vk             For b in possible strings ordered by length,
       +zb      Add z and b,
      J         Store it in J,
    _I          Check if the result is a palindrome,
   I            If so,
          J     Print J (This line doesn't actually exist, gets added by the bug.
          B     Break.

Böyle bir kodla nasıl ortaya çıkıyor? Pyth ile tanışmayan biri tarafından zar zor okunabilir ve kesinlikle anlaşılmaz. Böyle bir dilin amacı nedir.
anukul,

5
@momo Dilin amacı eğlence için kısa kod yazmaktır. Bu bir eğlence etkinliğidir. Bunu yazabilirim çünkü çok fazla pratik yaptım ve dili icat ettiğim için. Dili bilmeyen birisinin anlaşılmaz olmadığını biliyorum, bu yüzden açıklamayı ekledim.
isaacg

13

Python, 46 bayt

f=lambda s:s*(s==s[::-1])or s[0]+f(s[1:])+s[0]

Dize bir palindrom ise, geri döndürün. Aksi halde, ilk harfi, ipin geri kalanı için özyinelemeli sonuç etrafında sandviçleyin.

Örnek arıza:

f(bonobo)
b  f(onobo) b
b o f(nobo) o b 
b o n f(obo) n o b
b o n obo n o b

Ben tersi koşulunu kullanırsanız bir bayt kaydedebilirsiniz ( s!=s[::-1])
aditsu

@ditsu Bu çalışır ancak bir çarpma kullanarak henüz daha kısadır.
xnor

9

Haskell, 36 bayt

f s|s==reverse s=s|h:t<-s=h:f t++[h]

Daha okunaklı:

f s
 |s==reverse s = s
 |(h:t)<-s     = h:(f t)++[h]

Dize bir palindrom ise, geri döndürün. Aksi takdirde, ilk harfi, ipin kuyruğu için özyinelemeli sonuç etrafında sandviçleyin.

Dize s, h:tikinci koruyucu içine bölünerek 1>0bu durum için bir dolgu maddesi oluşturur. Bu, s@(h:t)giriş için yapmaktan daha kısa .



5

Brachylog , 16 6 5 bayt ( Yarışmıyor )

:Ac.r

Çevrimiçi deneyin!

İlk cevabımı gönderdiğimde, hala Java'daki eski uygulamadaydı. Prolog'daki her şeyi yeniden programladığımdan beri, ilk başta olması gerektiği gibi çalışıyor.

açıklama

(?):Ac.        Output is the concatenation of Input with another unknown string A
      .r(.)    The reverse of the Output is the Output

Backpropagation, onu Abulacağı ilk geçerli değerin bir palindrom yapmak için Girdi ile birleştirebileceğiniz en kısa değer olmasını sağlar.

Alternatif çözüm, 5 bayt

~@[.r

Bu, kabaca yukarıdaki cevabın aynısıdır; "Çıktı, Girdi'nin bir dizeyle birleşimidir" ifadesi yerine, "Çıktı, Girdi'nin AÇıktının öneki olduğu bir dizedir" ifadesini belirtiriz .


4

JavaScript (ES6), 92 bayt

(s,a=[...s],r=a.reverse().join``)=>s.slice(0,a.findIndex((_,i)=>r.startsWith(s.slice(i))))+r

Orijinal dize ile ters çevrilmesi arasındaki çakışmayı hesaplar ve keser.


4

Retina, 29 25

$
¶$_
O^#r`.\G
(.+)¶\1
$1

Çevrimiçi deneyin!

Martin'e 11 bayt için büyük teşekkürler !

Bu sadece dizenin ters bir kopyasını oluşturur ve bunları birlikte düzeltir. Bunun gerçekten şık bir kısmı, O^#r`.\Gsıralama modu kullanılarak yapılan tersine çevirme yöntemidir . İkinci dizginin harflerini (yeni satırlar olmayan ve dizgenin sonundan itibaren art arda gelenler \G) sayısal değerlerine göre sıralıyoruz, sayı yok çünkü 0. ^seçeneği ile bu istikrarlı sıralama sonuçlarının sırası . Süslü kullanım için tüm kredi \GMartin'e aittir :)


3

CJam, 18

q__,,{1$>_W%=}#<W%

Çevrimiçi deneyin

Açıklama:

q         read the input
__        make 2 copies
,,        convert the last one to a range [0 … length-1]
{…}#      find the first index that satisfies the condition:
  1$>     copy the input string and take the suffix from that position
  _W%=    duplicate, reverse and compare (palindrome check)
<         take the prefix before the found index
W%        reverse that prefix
          at the end, the stack contains the input string and that reversed prefix

3

Lua, 89 88 Bayt

Javascript'i yendim! \ o / @LeakyNun ^^ ile 1 bayt kaydedildi

Bu tam bir programdır, girişini komut satırı argümanı olarak alır.

i=1s=...r=s:reverse()while s:sub(i)~=r:sub(0,#r-i+1)do i=i+1 end print(s..r:sub(#r-i+2))

ungolfed

i=1                             -- initialise i at 1 as string are 1-indexed in lua
s=...                           -- use s as a shorthand for the first argument
r=s:reverse()                   -- reverse the string s and save it into r
while(s:sub(i)~=r:sub(0,#r-i+1))-- iterate while the last i characters of s
do                              -- aren't equals to the first i characters of r
  i=i+1                         -- increment the number of character to skip
end
print(s..r:sub(#r-i+2))         -- output the merged string

Yakın parantezin whileçıkarılabileceğine inanıyorum ?
Leaky Nun

@LeakyNun emin olabilirler ^^
Katenkyo

Yapamaz i=i+1endmısın?
Outgolfer Erik,

1
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Ne yazık ki yapamam. 1endOnaltılık bir sayı olarak değerlendirmeye çalışacaktı . Genellikle, [abcdef]onaltılık sayılmadan doğrudan bir sayıdan sonra kullanamazsınız . Bir istisna daha var 0x.
Katenkyo

3

Prolog, 43 bayt

a(S):-append(S,_,U),reverse(U,U),writef(U).

Bu girdi olarak bir kod dizesini beklemektedir, örneğin SWI-Prolog 7'de: a(`hello`).

açıklama

Bu temelde Brachylog cevabımın bir limanı.

a(S) :-               % S is the input string as a list of codes
    append(S,_,U),    % U is a list of codes resulting in appending an unknown list to S
    reverse(U,U),     % The reverse of U is U
    writef(U).        % Write U to STDOUT as a list of codes

3

Octave, 78 75 bayt

Eʀɪᴋ ᴛʜᴇ Gᴏʟғᴇʀ! Sayesinde 3 bayt kurtarıldı!

function p=L(s)d=0;while~all(diag(s==rot90(s),d++))p=[s fliplr(s(1:d))];end

ideone, adlandırılmış işlevler için hala başarısız oluyor, ancak burada bir program olarak kodun bir deneme çalışması.


2

Perl, 37 bayt

Xnor'ın cevabına göre.

İçin +2 içerir -lp

STDIN'deki giriş ile çalıştırın, örn.

palindromize.pl <<< bonobo

palindromize.pl:

#!/usr/bin/perl -lp
s/.//,do$0,$_=$&.$_.$&if$_!~reverse



1

J, 20 bayt

,[|.@{.~(-:|.)\.i.1:

Bu monadik bir fiildir. Burada dene. Kullanımı:

   f =: ,[|.@{.~(-:|.)\.i.1:
   f 'race'
'racecar'

açıklama

I palindromization gerçeğini kullanıyorum S olduğu ters S + (P) , P kısa öneki S kaldırma bir palindrom sonuçlanır. J'de, bir yüklemeyi karşılayan bir dizinin ilk elemanı için arama yapmak biraz zor; bu nedenle indeksleme.

,[|.@{.~(-:|.)\.i.1:  Input is S.
        (    )\.      Map over suffixes of S:
         -:             Does it match
           |.           its reversal? This gives 1 for palindromic suffixes and 0 for others.
                i.1:  Take the first (0-based) index of 1 in that array.
 [   {.~              Take a prefix of S of that length: this is P.
  |.@                 Reverse of P.
,                     Concatenate it to S.

1

Haskell, 68 bayt

import Data.List
f i=[i++r x|x<-inits i,i++r x==x++r i]!!0
r=reverse

Kullanım örneği: f "abcb"-> "abcba".

Üzerinde Arama initsgirdi i(örn inits "abcb"-> ["", "a", "ab", "abc", "abcb"]) size ters eklenen olanlardan birini bulana kadar ibir palindrom oluşturur.


Daha r=reverseönce gitmek zorunda değil f i=mi?
Outgolfer Erik,

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ: Hayır, herhangi bir sipariş kullanabilirsiniz.
nimi

46 baytta başardım. Bahse girerim daha iyi yapılabilir.
theonlygusti

@theonlygusti: bkz XNOR cevabını .
nimi

1

MATL , 17 16 bayt

Gevşek bir şekilde @ aditsu'nın CJam cevabından ilham aldı .

`xGt@q:)PhttP=A~

Çevrimiçi deneyin!

açıklama

`        % Do...while loop
  x      %   Delete top of stack, which contains a not useful result from the
         %   iteration. Takes input implicitly on first iteration, and deletes it
  G      %   Push input
  t      %   Duplicate
  @q:    %   Generate range [1,...,n-1], where n is iteration index. On the  first
         %   iteration this is an empty array
  )      %   Use that as index into copy of input string: get its first n elements
  Ph     %   Flip and concatenate to input string
  t      %   Duplicate. This will be the final result, or will be deleted at the
         %   beginning of next iteration
  tP     %   Duplicate and flip
  =A~    %   Compare element-wise. Is there some element different? If so, the
         %   result is true. This is the loop condition, so go there will be a 
         %   new iteration. Else the loop is exited with the stack containing
         %   the contatenated string
         % End loop implicitly
         % Display stack contents implicitly


1

Oracle SQL 11.2, 195 bayt

SELECT MIN(p)KEEP(DENSE_RANK FIRST ORDER BY LENGTH(p))FROM(SELECT:1||SUBSTR(REVERSE(:1),LEVEL+1)p FROM DUAL WHERE SUBSTR(:1,-LEVEL,LEVEL)=SUBSTR(REVERSE(:1),1,LEVEL)CONNECT BY LEVEL<=LENGTH(:1));

Un-golfed

SELECT MIN(p)KEEP(DENSE_RANK FIRST ORDER BY LENGTH(p))
FROM (
       SELECT :1||SUBSTR(REVERSE(:1),LEVEL+1)p 
       FROM   DUAL 
       WHERE  SUBSTR(:1,-LEVEL,LEVEL)=SUBSTR(REVERSE(:1),1,LEVEL)
       CONNECT BY LEVEL<=LENGTH(:1)
     );

1

Cidden, 34 bayt

╩╜lur`╜╨"Σ╜+;;R=*"£M`MΣ;░p╜;;R=I.

Son karakter, bölünmeyen bir alandır (ASCII 127 veya 0x7F).

Çevrimiçi deneyin!

Açıklama:

╩╜lur`╜╨"Σ╜+;;R=*"£M`MΣ;░p╜;;R=I.<NBSP>
╩                                        push inputs to registers (call the value in register 0 "s" for this explanation)
 ╜lur                                    push range(0, len(s)+1)
     `              `M                   map (for i in a):
      ╜╨                                   push all i-length permutations of s
        "        "£M                       map (for k in perms):
         Σ╜+                                 push s+''.join(k) (call it p)
            ;;R=                             palindrome test
                *                            multiply (push p if palindrome else '')
                      Σ                  summation (flatten lists into list of strings)
                       ;░                filter truthy values
                         p               pop first element (guaranteed to be shortest, call it x)
                          ╜;;R=I         pop x, push s if s is palindromic else x
                                .<NBSP>  print and quit

1

C #, 202 bayt

Denedim.

class P{static void Main(string[]a){string s=Console.ReadLine(),o=new string(s.Reverse().ToArray()),w=s;for(int i=0;w!=new string(w.Reverse().ToArray());){w=s.Substring(0,i++)+o;}Console.WriteLine(w);}}

Ungolfed:

class P
{
    static void Main(string[] a)
    {
        string s = Console.ReadLine(), o = new string(s.Reverse().ToArray()), w = s;
        for(int i = 0; w!=new string(w.Reverse().ToArray());)
        {
            w = s.Substring(0, i++) + o;
        }
        Console.WriteLine(w);
        Console.ReadKey();
    }

}

Biri bana iki çağrıyı gruplama konusunda herhangi bir fikir verebilir mi? Ayrı bir yöntem daha fazla bayttır.


0

QBIC , 41 bayt

;_FA|C=A{a=a+1~C=_fC||_XC\C=A+right$(B,a)

Açıklama:

;_FA|    Read A$ from the cmd line, then flip it to create B$
C=A      Set C$ to be A$
{        Start an infinite DO-loop
a=a+1    Increment a (not to be confused with A$...)
~C=_fC|  If C$ is equal to its own reversed version
|_XC     THEN end, printing C$
\C=A+    ELSE, C$ is reset to the base A$, with
right$(B the right part of its own reversal
,a)      for length a (remember, we increment this each iteration
         DO and IF implicitly closed at EOF

0

Haskell, 46 bayt

f l|l==reverse l=l|(h:t)<-l=l!!0:(f$tail l)++[l!!0]

Parantezi çıkarmanın bir yolu olup olmadığını merak ediyorum (f$tail l)++[l!!0].

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.