Où dois-je mettre mon miroir?


30

Ceci est un miroir: |. Je viens de découvrir que vous pouvez coller un miroir au milieu d'une chaîne si la chaîne peut être mise en miroir sur elle-même! Par exemple, la chaîne abccba. Si vous le coupez en deux, les deux moitiés sont des images miroir l'une de l'autre:

abc  <-->  cba

Donc, nous pouvons coller un miroir au milieu de la chaîne, et notre nouvelle chaîne est abc|cba. Parfois, seule une partie de la chaîne peut être mise en miroir sur elle-même. Par exemple, la chaîne "miroir". Les deux r sont en miroir, mais pas le reste de la chaîne. C'est OK, nous allons simplement supprimer les parties de la chaîne qui ne se reflètent pas et nous obtenons la chaîne suivante:

r|r

Certaines chaînes peuvent être mises en miroir à plusieurs endroits. Par exemple, "Bonjour tout le monde, xyzzyx". J'aime que beaucoup de texte se reflète dans mon miroir, vous devez donc trouver le meilleur endroit pour placer mon miroir. Dans ce cas, vous devez sortir la chaîne en miroir plus longue et, comme dans notre dernier exemple, supprimer tout le reste. Cette chaîne devient:

xyz|zyx

Certaines chaînes semblent pouvoir être mises en miroir, mais ne le peuvent pas. Si une chaîne ne peut être mise en miroir nulle part, vous ne devez rien produire.

Le défi:

Étant donné une chaîne contenant uniquement ascii imprimable, trouvez le meilleur endroit pour mettre mon miroir. En d'autres termes,

Trouvez la plus grande sous-chaîne palindromique de longueur paire, puis affichez-la avec un caractère de tuyau '|' au milieu.

L'entrée comprendra de 1 à 50 caractères.

Vous pouvez supposer que l'entrée ne contiendra pas de miroirs |ou de nouvelles lignes. Au-delà de cela, tous les caractères ascii imprimables sont du jeu équitable. Si la sous-chaîne en miroir la plus longue est liée entre deux sous-chaînes, vous pouvez choisir celle à afficher. Par exemple, pour la chaîne "abba ollo", vous devez sortir "ab | ba" ou "ol | lo", mais peu importe celle que vous sortez. Les chaînes sont sensibles à la casse, par exemple "ABba" ne doit pas sortir "AB | ba", il doit sortir la chaîne vide.

Exemple d'E / S:

"Hello World"     --> "l|l"
"Programming Puzzles and Code-Golf"     --> Either "m|m" or "z|z"
"abcba"           --> ""
"Hulluh"          --> "ul|lu"
"abcdefggfedcba"  --> "abcdefg|gfedcba"
"abcdefggfabc"    --> "fg|gf"
"AbbA"            --> "Ab|bA"
"This input is a lot like the last one, but with more characters that don't change the output. AbbA" --> "Ab|bA"

Comme d'habitude, il s'agit de code-golf, donc les failles standard s'appliquent et la réponse la plus courte en octets l'emporte!


Y a-t-il une limite à la longueur de l'entrée?
Mego

@Mego Tant que votre algorithme fonctionne théoriquement sur n'importe quelle entrée, peu m'importe combien de temps cela prend / combien de mémoire cela prend.
DJMcMayhem

J'ai demandé parce que les moteurs de regex vanilla ne sont capables de faire correspondre les palindromes de longueur jusqu'à une valeur finie spécifiée (par opposition aux palindromes arbitrairement longs), et la possibilité d'une solution basée sur les regex dépendrait de l'existence ou non d'une lié à la longueur de l'entrée.
Mego

@Mego Ah, c'est logique. Supposons que l'entrée puisse contenir jusqu'à 50 caractères. Comment ça sonne?
DJMcMayhem

Réponses:


9

Pyth - 19 17 15 13 octets

Merci à @FryAmTheEggman de m'avoir sauvé deux octets.

ARRGH le cas spécial pour aucune réponse. Résolu ça!

e_I#jL\|cL2.:

Suite de tests .

e                Last element in list, this works out to longest one
  _I             Invariance under reverse, this detect palindrome
   #             Filter
   jL            Map join
    \|           By "|"
    cL2          Map chop in two pieces
     .:Q)        Substrings. Implicit Q). ) makes it do all substrings.

2
Nooooo! Ninja'd à la réponse pyth; _;
Downgoat

Explication s'il vous plait? : 3
Downgoat

@Downgoat, il a pris toutes les sous-chaînes et les couper en deux, joindre chaque paire avec |, filtrer par symétrie, ajouter cela à [k] et obtenir le dernier élément (qui est le plus long)
busukxuan

@Downgoat done.
Maltysen

2
:Q)= Bignose
gcampbell

8

05AB1E , 19 17 14 octets

Code:

Œévy2ä'|ý©ÂQi®

Explication:

Œ                # Get all substrings of the input
 é               # Sort by length (shortest first)
  vy             # For each element...
    2ä           # Split into two pieces
      '|ý        # Join by "|"
         ©       # Copy this into the register
          Â      # Bifurcate, pushing a and reversed a
           Q     # Check if it's a palindrome
            i®   # If so, push that string again
                 # Implicit, the top element is outputted

Utilise l' encodage CP-1252 . Essayez-le en ligne! .


5

Python 2, 102 97 octets

def f(s):h=len(s)/2;r=s[:h]+'|'+s[h:];return s and max(r*(r==r[::-1]),f(s[1:]),f(s[:-1]),key=len)

Plutôt lent et inefficace ... Vérifiez les plus petits cas de test sur Ideone .


4

JavaScript, 100 à 99 octets

s=>eval('for(O=i=0;s[i++];O=O[j+j]?O:o)for(o="|",j=0;(S=s[i-1-j])&&S==s[i+j++];o=S+o+S);O[1]?O:""')

ou

s=>eval('for(O="",i=0;s[i++];O=O[j+j]||j<2?O:o)for(o="|",j=0;(S=s[i-1-j])&&S==s[i+j++];o=S+o+S);O')

Juste curieux, à quoi ça sert eval?
gcampbell

@gcampbell evalà éviterreturn
edc65

Vous ne pouvez pas utiliser l'opérateur virgule pour éviter le retour?
MayorMonty

@SpeedyNinja non. forn'est pas une expression, donc il faudrait normalement des accolades et unreturn
jrich


2

Rétine , 66 octets

Le nombre d'octets suppose un codage ISO 8859-1.

M!&`(.)+(?<-1>\1)+(?(1)¶)
O$#`.+
$.&
A-2`
^(.)+?(?=(?<-1>.)+$)
$&|

Essayez-le en ligne! (La première ligne permet de tester simultanément plusieurs cas de test séparés par un saut de ligne.)

Hmmm, beaucoup plus longtemps que je ne le souhaiterais ...


2

JavaScript (ES6), 91

s=>[...s].map((d,i)=>{for(a='|',j=0;d=s[i-j],d&&d==s[i-~j];r=r[j+++j]?r:a)a=d+a+d},r='')&&r

Moins golfé

f=s=>
  [...s].map(
    (d,i) => {
    for(a='|', j=0; d=s[i-j], d&&d==s[i-~j]; r = r[j++ +j]? r : a)
      a = d+a+d
    }, r=''
  ) && r

Tester

F=
s=>[...s].map((d,i)=>{for(a='|',j=0;d=s[i-j],d&&d==s[i-~j];r=r[j+++j]?r:a)a=d+a+d},r='')&&r

;[["Hello World", "l|l"]
,["Programming Puzzles and Code-Golf", "m|m"]
,["abcba", ""]
,["Hulluh", "ul|lu"]
,["abcdefggfedcba", "abcdefg|gfedcba"]
,["abcdefggfabc", "fg|gf"]
,["AbbA", "Ab|bA"]
,["This input is a lot like the last one, but with more characters that don't change the output. AbbA", "Ab|bA"]]
.forEach(t=>{
  var i=t[0],k=t[1],r=F(i)
  console.log(k==r?'OK ':'KO ',i+' -> '+r,k!=r?'(check '+k+')':'')
})  


2

Perl 5, 105 100 98 + 1 = 106 101 99 octets

/(?=((.)(?1)?\2)(?{[push@_,$1})(?!))/;($_)=sort{length$b<=>length$a}@_;substr($_,length>>1,0)='|'if$_

Je voulais juste essayer les expressions rationnelles récursives. A besoin de l' -poption. Edit: Sauvegardé (barré 4) 7 octets grâce à @ msh210. (L'octet manquant est dû à une sauvegarde qui a été remplacée par la dernière sauvegarde de @ msh210.)


Je n'ai testé aucun de ceux-ci, mais cela peut probablement être abrégé de différentes manières, notamment: (1) @_=(@_,$1)peut l'être push@_,$1. (2) Omettez les nouvelles lignes et la finale ;. (3) Je pense qu'il ya une condition de tri plus courte , vous pouvez utiliser (si rien d' autre, du moins peut - être --- --- substitut -pour <=>)
msh210

@ msh210 Merci pour les deux premiers points, mais j'ai déjà essayé -et cela n'a pas fonctionné (a probablement besoin de parens pour la priorité, ce qui annule la sauvegarde).
Neil

Essayez y...c>>1ou y...c/2au lieu de length>>1. (Non testé.)
msh210

@ msh210 J'aurais évidemment dû lire les conseils pour jouer au golf à Perl en premier ...
Neil

Je suppose que votre dernière paire de parens peut aussi aller.
msh210

2

Python 2, 91 octets

f=lambda s,p='':s and max((''<p<=s<p+'\x7f')*(p[::-1]+'|'+p),f(s[1:]),f(s[1:],s[0]+p),key=len)

Remplacez-le \x7fpar le caractère réel DEL, qui est ASCII 127 (crédit à Dennis).

Cela suit une stratégie similaire à la réponse de Dennis d'utiliser maxet de ramifier récursivement pour trouver l'intervalle palindrome le plus long. Mais, à la place, il trouve la moitié gauche, vérifiant que la moitié droite miroir correspondante vient juste après avec un démarrage par soi-même .

La fonction devine si le premier caractère se trouve dans la moitié gauche en miroir. Sinon, il le laisse tomber et revient sur le reste. Si c'est le cas, il est ajouté à la pile pde caractères inversés. Si la chaîne commence par la pile, la chaîne miroir est générée et considérée comme un miroir le plus long possible. Pour éviter |en sortie, seules les piles non vides sont prises en compte.


2

Gelée , 17 octets

ẆŒḂÐfṪœs2j”|µẋLḂ$

Essayez-le en ligne!

Fait avec l'aide de M. Xcoder et DJMcMayhem dans le chat

Comment ça marche

ẆŒḂÐfṪœs2j”|µẋLḂ$ - Main link. Argument s  e.g.    ; 'AbbA'

Ẇ                 - All contiguous sublists
   Ðf             - Keep elements that are...
 ŒḂ               -  Palindromic                   ; [['A'], ['b'], ['b'], ['A'], ['bb'], ['AbbA']]
     Ṫ            - Final element                  ; 'AbbA'
      œs2         - Split into 2 chunks            ; ['Ab', 'bA']
         j”|      - Join with "|"                  ; 'Ab|bA'
            µ     - New link with ^ as argument
              LḂ$ - Is the length odd?             ; 1
             ẋ    - Repeat the string ^ many times ; 'Ab|bA'

1

Haskell, 126 111 octets

(!)=drop
f s|n<-length s=last$"":[a++'|':b|k<-[1..n],t<-map(!s)[1..n-k],let[a,b]=take k<$>[t,k!t],a==reverse b]

1

TSQL 227 223 octets

J'ai codé en dur la longueur jusqu'à 99 octets max, cela a sauvé des octets mais l'a rendu plus lent. Il a quand même une performance décente.

Golfé:

DECLARE @t varchar(99)='AbccbA'

,@z char(99)='',@a INT=0,@ INT=0WHILE @a<LEN(@t)SELECT
@z=IIF(LEN(x)>LEN(@z)/2and @t LIKE'%'+x+REVERSE(x)+'%'COLLATE
Thai_bin,x+'|'+REVERSE(x),@z),@=IIF(@=50,1,@+1),@a+=IIF(@=1,1,0)FROM(SELECT
SUBSTRING(@t,@a,@)x)x PRINT @z

Non golfé:

DECLARE @t varchar(99)='AbccbA'

,@z char(99)='',
@a INT=0,
@ INT=0
WHILE @a<LEN(@t)
  SELECT
    @z=IIF(LEN(x)>LEN(@z)/2and @t LIKE'%'+x+REVERSE(x)+'%'COLLATE Thai_bin,x+'|'
       +REVERSE(x),@z),
    @=IIF(@=99,1,@+1),
    @a+=IIF(@=1,1,0)
  FROM
    (SELECT SUBSTRING(@t,@a,@)x)x

PRINT @z

Violon


1
Vous pouvez raser 2 octets si vous limitez à 99 car le dernier exemple ne fait que 99 caractères
Alex Carlsen

1
@VisualBean thankyou, a changé le script pour n'autoriser que 99 caractères, a également changé le classement de Thai_CS_AS à thai_bin
t-clausen.dk

0

Python 2, 149 octets

R,L,s=range,len,input()
t=max([s[i:j/2+i/2]for i in R(L(s))for j in R(L(s)+1)if s[i:j]==s[i:j][::-1]and(j-i)%2<1],key=L)
print t+'|'*(L(t)>0)+t[::-1]

Essayez-le en ligne

Ce programme trouve la première moitié de la plus grande sous-chaîne palindromique de longueur paire et imprime cette chaîne, suivie d'un |, puis de cette chaîne inversée. S'il n'y a pas de chaîne appropriée, tsera la chaîne vide et '|'*(L(t)>0)sera évaluée comme la chaîne vide.


0

Java 8, 294 283 232 octets

s->{int l=s.length(),i=0,j,z,y=0;String a,b="";for(;i<l;i++)for(j=0;j<=l-i;)if((a=s.substring(i,i+j++)).equals(new StringBuffer(a).reverse()+"")&(z=a.length())%2<1&z>y){y=z;b=a;}return y>0?b.substring(0,y/=2)+"|"+b.substring(y):"";}

Explication:

Essayez-le ici.

s->{                               // Method with String as both parameter and return-type
  int l=s.length(),                //  Length of the input-String
      i=0,j,                       //  Index-integers
      z,y=0;                       //  Temp-integers
  String a,b="";                   //  Temp-Strings
  for(;i<l;i++)                    //  Loop (1) from 0 to `l` (exclusive)
    for(j=0;j<=l-i;                //   Inner loop (2) from 0 to `l-i` (inclusive)
      if((a=s.substring(i,i+j++))  //    Set the current substring to `a`
          .equals(new StringBuffer(a).reverse()+"")
                                   //    If `a` is a palindrome
         &(z=a.length())%2<1       //    And the length of `a` is even
         &z>y){                    //    And the length of `a` is larger than `y`
        y=z;                       //     Change `y` to `z`
        b=a;}                      //     Change `b` to `a`
                                   //   End of inner loop (2) (implicit / single-line body)
                                   //  End of loop (1) (implicit / single-line body)
  return y>0?                      //  If the result-length is not 0:
    b.substring(0,y/=2)+"|"+b.substring(y)
                                   //   Return the result
   :                               //  Else:
    "";                            //   Return an empty String
}                                  // End of method
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.