Де мені поставити дзеркало?


30

Це дзеркало: |. Я щойно з’ясував, що можна наклеїти дзеркало посередині струни, якщо струна може бути дзеркальною на собі! Наприклад, рядок abccba. Якщо розрізати його навпіл, дві половинки - це дзеркальні зображення один одного:

abc  <-->  cba

Отже, ми можемо приклеїти дзеркало в середину струни, і наша нова струна - це abc|cba. Іноді дзеркально відображається лише частина струни. Наприклад, рядок "дзеркало". Два дзеркальних дзеркальних дзеркальних, але решта рядка не є. Це нормально, ми просто видалимо частини рядка, які не дзеркально відображають одна одну, і отримаємо наступну рядок:

r|r

Деякі рядки можна відобразити в декількох місцях. Наприклад, "Hello World, xyzzyx". Мені подобається, що в дзеркалі відображено багато тексту, тому вам потрібно знайти найкраще місце, щоб поставити моє дзеркало. У цьому випадку вам слід вивести довгу дзеркальну рядок і, як і наш останній приклад, видалити все інше. Цей рядок стає:

xyz|zyx

Деякі струни виглядають так, ніби вони можуть бути дзеркальними, але насправді не можуть. Якщо рядок не можна відобразити ніде, ви нічого не повинні виводити.

Змагання:

З огляду на рядок, що містить лише друковані файли, знайдіть найкраще місце, щоб поставити своє дзеркало. Іншими словами,

Знайдіть найбільшу паліндромну підрядок парної довжини, а потім виведіть її з символом труби '|' посеред нього.

Вхід буде довжиною 1-50 символів.

Можна припустити, що вхід не буде містити дзеркала |чи нові рядки. Крім цього, всі символи для друку-ascii - це чесна гра. Якщо найдовша дзеркальна підрядка пов'язана між двома підрядками, ви можете вибрати, яку з них вивести. Наприклад, для рядка "abba ollo" ви повинні вивести "ab | ba" або "ol | lo", але не має значення, який ви виведете. Рядки відрізняються від регістру, наприклад, "ABba" не повинен виводити "AB | ba", він повинен виводити порожній рядок.

Зразок IO:

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

Як завжди, це код-гольф, тому застосовуються стандартні лазівки, і найкоротша відповідь у байтах виграє!


Чи є обмеження на довжину вводу?
Mego

@Mego Поки ваш алгоритм теоретично працює на будь-якому вході, мені все одно, скільки часу займає / скільки пам'яті потрібно.
DJMcMayhem

Я запитав, оскільки двигуни регексу ванілі здатні відповідати лише паліндромам довжини до заданого кінцевого значення (на відміну від довільно довгих паліндром), а можливість рішення на основі регулярних виразів залежатиме від того, чи є верхня частина обмежена довжиною вводу.
Mego

@Mego Ах, це має сенс. Скажімо, вхід може бути до 50 символів. Як це звучить?
DJMcMayhem

Відповіді:


9

Pyth - 19 17 15 13 байт

Завдяки @FryAmTheEggman за збереження мені двох байтів.

ARRGH - особливий випадок, коли немає відповіді. Вирішили це!

e_I#jL\|cL2.:

Test Suite .

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! Ніндзя до відповіді піта; _;
Downgoat

Пояснення будь ласка? : 3
Пуховик

@Downgoat він взяв усі підрядки і подрібнити на два, з'єднати кожну пару з |, відфільтрувати по симетрії, додати це до [k] і отримати останній елемент (який найдовший)
busukxuan

@Downgoat зроблено.
Мальтісен

2
:Q)= Bignose
gcampbell

8

05AB1E , 19 17 14 байт

Код:

Œévy2ä'|ý©ÂQi®

Пояснення:

Œ                # 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

Використовує кодування CP-1252 . Спробуйте в Інтернеті! .


5

Python 2, 102 97 байт

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)

Досить повільні та неефективні ... Перевірте менші тестові випадки на Ideone .


4

JavaScript, 100 99 байт

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:""')

або

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')

Просто цікаво, для чого eval?
gcampbell

@gcampbell evalуникатиreturn
edc65

Не можете використовувати оператор комами, щоб уникнути повернення?
МерМонті

@SpeedyNinja nope. forне є виразом, тому зазвичай потрібні дужки іreturn
jrich


2

Сітківка , 66 байт

Кількість байтів передбачає кодування ISO 8859-1.

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

Спробуйте в Інтернеті! (Перший рядок дозволяє перевірити одразу декілька тестових випадків, відокремлених підводними кодами.

Хм, набагато довше, ніж я хотів би ...


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

Менше гольфу

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

Тест

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 байт

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

Я просто хотів дати рекурсивні регекси. Потрібен -pваріант. Редагувати: збережено (закреслено 4) 7 байт завдяки @ msh210. (Відсутній байт пов'язаний із збереженням, яке було замінено останнім збереженням @ msh210.)


Я не перевіряв жодного з них, але, ймовірно, це можна скоротити різними способами, в тому числі: (1) @_=(@_,$1)може бути push@_,$1. (2) Опустіть нові рядки та фінал ;. (3) Я підозрюю , що є більш короткий умова сортування можна використовувати (якщо нічого іншого , то , по крайней мере --- можливо --- замінити -на <=>)
msh210

@ msh210 Дякую за перші два пункти, але я вже намагався, -і це не спрацювало (ймовірно, потрібні пароні для переваги, що перемагає збереження).
Ніл

Спробуйте y...c>>1або y...c/2замість цього length>>1. (Неперевірено.)
msh210

@ msh210 Я, очевидно, спершу повинен був прочитати поради щодо гольфу в Перлі ...
Ніл

Я здогадуюсь, що може піти і ваша остання пара паронів.
msh210

2

Python 2, 91 байт

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)

Замініть \x7fфактичним символом DEL, який є ASCII 127 (кредит Деннісу).

Це відповідає аналогічній стратегії відповіді Денніса щодо використання maxта рекурсивного розгалуження для пошуку найдовшого інтервалу паліндром. Але, натомість, вона знаходить ліву половину, перевіряючи, що відповідна дзеркальна права половина приходить відразу після неї, зробленою із власного виготовлення startwith .

Функція відгадує, чи знаходиться перший символ у дзеркальній лівій половині. Якщо ні, він просто скидає його і повторюється на залишок. Якщо він є, він додається до стеку pзворотних символів. Якщо рядок коли-небудь починається зі стека, дзеркальна рядок генерується і розглядається як можливе найдовше дзеркало. Щоб уникнути |як вихід, розглядаються лише непусті стеки.


2

Желе , 17 байт

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

Спробуйте в Інтернеті!

Зроблено за допомогою пана Xcoder та DJMcMayhem у чаті

Як це працює

ẆŒḂÐ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 байт

(!)=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 байт

Я жорстко кодував довжину до макс 99 байтів, це зберегло байти, але зробило це повільніше. Однак вона все ще має гідну продуктивність.

Гольф:

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

Безголовки:

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

Скрипка


1
Ви можете поголити 2 байти, якщо обмежите 99, оскільки останній приклад - це лише 99 символів
Алекс Карлсен

1
@VisualBean подякував, змінив сценарій на 99 символів, також змінив порівняння з Thai_CS_AS на thai_bin
t-clausen.dk

0

Python 2, 149 байт

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]

Спробуйте в Інтернеті

Ця програма знаходить першу половину найбільшої паліндромної підрядки рівної довжини, і друкує цю струну, а потім a |, а потім цю рядок перевернуто. Якщо немає відповідного рядка, tбуде порожнім рядком і '|'*(L(t)>0)буде оцінено до порожнього рядка.


0

Java 8, 294 283 232 байт

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

Пояснення:

Спробуйте тут.

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.