Pali-n-drome этот список


13

Задача здесь состоит в том, чтобы расширить реализацию палиндрома, учитывая следующее в качестве входных данных:

  • n > 1и список l.

Ваша программа должна палиндромировать список как по вертикали, так и по горизонтали, то есть сначала она должна палиндромировать сам список, а затем каждый элемент в списке; или наоборот. Перед палиндромизацией все элементы должны быть одинаковой длины. Затем действие палиндрома должно выполняться nпо порядку, пока не будет достигнут желаемый результат. Самый простой способ показать ожидаемые результаты - это всего лишь несколько примеров:


Одна итерация выполнена [123,456,789]:

Сначала вы палиндромизируете список [123,456,789,456,123].

  • Хотя это не палиндром, если соединить вместе, это палиндром с точки зрения списка.
  • [a,b,c]стал [a,b,c,b,a], поэтому СПИСОК был палиндромизирован.

Затем вы палиндромизируете каждый элемент списка [12321,45654,78987,45654,12321].

Так выполняется каждая итерация, по сути, это всенаправленный палиндром.


Дано n=1 and l=[123,456,789]:

12321
45654
78987
45654
12321

Данный n=2 and l=[123,456,789]

123212321
456545654
789878987
456545654
123212321
456545654
789878987
456545654
123212321

Дано n=1 and l=[3,2,1]:

3
2
1
2
3

Дано n=2 and l=["hat","mad"," a "]:

hatahatah
madamadam
 a a a a 
madamadam
hatahatah
madamadam
 a a a a 
madamadam
hatahatah

Дано n=2 and l=[" 3 ","2000"," 100"]:

 3   3 3   3 
2000002000002
100 00100 001
2000002000002
 3   3 3   3 
2000002000002
100 00100 001
2000002000002
 3   3 3   3 

Дано n=4 and l=["3 ","20","1 "]:

3 3 3 3 3 3 3 3 3
20202020202020202
1 1 1 1 1 1 1 1 1
20202020202020202
3 3 3 3 3 3 3 3 3
20202020202020202
1 1 1 1 1 1 1 1 1
20202020202020202
3 3 3 3 3 3 3 3 3
20202020202020202
1 1 1 1 1 1 1 1 1
20202020202020202
3 3 3 3 3 3 3 3 3
20202020202020202
1 1 1 1 1 1 1 1 1
20202020202020202
3 3 3 3 3 3 3 3 3
20202020202020202
1 1 1 1 1 1 1 1 1
20202020202020202
3 3 3 3 3 3 3 3 3
20202020202020202
1 1 1 1 1 1 1 1 1
20202020202020202
3 3 3 3 3 3 3 3 3
20202020202020202
1 1 1 1 1 1 1 1 1
20202020202020202
3 3 3 3 3 3 3 3 3
20202020202020202
1 1 1 1 1 1 1 1 1
20202020202020202
3 3 3 3 3 3 3 3 3

Дано n=3 and l=["_|__","__|_","___|"]:

_|___|_|___|_|___|_|___|_
__|_|___|_|___|_|___|_|__
___|_____|_____|_____|___
__|_|___|_|___|_|___|_|__
_|___|_|___|_|___|_|___|_
__|_|___|_|___|_|___|_|__
___|_____|_____|_____|___
__|_|___|_|___|_|___|_|__
_|___|_|___|_|___|_|___|_
__|_|___|_|___|_|___|_|__
___|_____|_____|_____|___
__|_|___|_|___|_|___|_|__
_|___|_|___|_|___|_|___|_
__|_|___|_|___|_|___|_|__
___|_____|_____|_____|___
__|_|___|_|___|_|___|_|__
_|___|_|___|_|___|_|___|_

Дано n=2 and l=["---|---","__|","___|","____|"]:

---|-----|-----|-----|---
  __|   |__   __|   |__  
 ___|   |___ ___|   |___ 
 ____| |____ ____| |____ 
 ___|   |___ ___|   |___ 
  __|   |__   __|   |__  
---|-----|-----|-----|---
  __|   |__   __|   |__  
 ___|   |___ ___|   |___ 
 ____| |____ ____| |____ 
 ___|   |___ ___|   |___ 
  __|   |__   __|   |__  
---|-----|-----|-----|---

правила

  • n всегда будет больше 1.
  • l всегда будет иметь более 1 элемента.
  • Все элементы lимеют одинаковую длину.
  • Это кратчайшее решение будет помечено как победитель.

9
Это было бы более сложной задачей, если бы нам не приходилось дополнять элементы.
mbomb007

2
@JonathanAllan это всенаправленный палиндром, или 2D палиндром, можно сказать. Я обновил описание; кроме того, заполнение предотвращает несколько странных случаев, когда меньшая строка уже является палиндромом.
Волшебный осьминог Urn

1
@JonathanAllan это с точки зрения списка, если вы смотрите на СПИСОК как на предмет, который нужно палиндромизировать. Точно так же, как [@ 1, @ 2, @ 1] также палиндром, если смотреть на него как на список, а не на элементы ...
Магический осьминог Urn

1
@JonathanAllan да, по сути, вы можете посмотреть на это так, если хотите.
Волшебная Осьминог Урна

1
Последний пример требует заполнения.
Джонатан Аллан

Ответы:


9

05AB1E , 4 байта

Обратите внимание, что если требуется только одна итерация (n=1 ), то программа будет палиндромом û€û.

Fû€û

Попробуйте онлайн

F       Do n times
 û      Palindromize the list
  €û    Palindromize each element in the list

Если заполнение входных данных все еще было обязательной частью программы (11 байт):

€R.B€RIFû€û

Я не мог найти более короткий путь, чтобы оправдаться. Выравнивание по левому краю и центрирование были простыми, но по некоторым причинам это было дольше. Использование Eили ²вместо Iтакже работает.


7

Python 2 , 71 63 байта

lambda x,n,f=lambda x:x+x[-2::-1]:eval('f(map(f,'*n+`x`+'))'*n)

Попробуйте онлайн!

Назначьте функцию палиндрома f, сгенерируйте и оцените следующий шаблон (для n=4)
f(map(f,f(map(f,f(map(f,f(map(f,<input>))))))))


1
Я думаю, что вы имеете в виду назначить . Я не думаю, что задница - это глагол, лол.
mbomb007

@ mbomb007 Ну что ж, пора выпить кофе ~
Род

6

Желе , 6 байт

ŒḄŒB$¡

Дядильная ссылка или полная программа, берущая список и n .

Попробуйте онлайн!

Использование обеих версий фантастического встроенного «отказов» Линн.

ŒḄŒB$¡ - Main link: l, n
     ¡ - repeat n times
    $  -     last two links as a monad (firstly with l then the result...)
ŒḄ     -         bounce ("palindromise") the list
  ŒB   -         bounce the elements

5

Python 2 , 64 байта

h=lambda a:a+a[-2::-1]
f=lambda a,n:n and f(h(map(h,a)),n-1)or a

Попробуйте онлайн! - нижний колонтитул печатает каждый из элементов результирующего списка, по одному на строку, «симпатичная печать».

h является функцией палиндомизации, она добавляет к входу все элементы списка от последнего, кроме одного, с индексом -2, до начала шагами размера -1.

fколичество вызовов hс результатом вызова hкаждого элемента поочередно уменьшается nна единицу и вызывает себя до тех пор, пока не nдостигнет 0, после чего aконечный продукт будет готов.


... и я все еще забываю f=для рекурсивных функций, однажды я буду помнить.
Джонатан Аллан

2

APL, 15 байт

(Z¨Z←⊢,1↓⌽)⍣⎕⊢⎕

Объяснение:

  • (... )⍣⎕⊢⎕: читать список и Nкак ввод, и Nвремя выполнения:
    • ⊢,1↓⌽: список, за которым следует хвост обратного списка
    • Z←: сохранить эту функцию в Z
    • : и применить его к каждому элементу списка

Тестовое задание:

          (ZZ ← ⊢, 1 ↓ ⌽) ⍣⎕⊢⎕ 
    ⎕:
          'шляпа' 'сумасшедшая' 'а'
    ⎕:
          2
    ┌─────────┬─────────┬─────────┬─────────┬───────── ┬─────────┬─────────┬─────────┬─────────┐
    Ataхатахатах│мадамадам│ аааа │мадамадам│хатахатах│мадамадам│ аааа │дамададам│хатахатах│
    └─────────┴─────────┴─────────┴─────────┴───────── ┴─────────┴─────────┴─────────┴─────────┘


1

Haskell, 51 байт

x%n=iterate((++)<*>reverse.init)x!!n
x?n=(%n)<$>x%n

Пример использования: ["123","456","789"] ? 1-> ["12321","45654","78987","45654","12321"]. Попробуйте онлайн! ,

(++)<*>reverse.initделает палиндром из списка, iterate(...)xповторяет это снова и снова и собирает промежуточные результаты в список, !!nвыбирает n-й элемент этого списка. (%n)<$>x%nделает n-палиндром каждого элемента из n-палиндрома x.


1

JavaScript (ES6), 87 байт

f=(n,l,r=l=>[...a].reverse().slice(1))=>n--?f(l.concat(r(l)).map(s=>s+r(s).join``),n):l

1

Пип , 25 байт

24 байта кода, +1 для -lфлага.

Lq{gM:_.@>RV_gAL:@>RVg}g

Принимает список в качестве аргументов командной строки и число n из стандартного ввода. Попробуйте онлайн!

объяснение

                          g is list of cmdline args (implicit)
Lq{                   }   Read a line of input and loop that many times:
      _.@>RV_             Lambda function: take all but the first character (@>) of the
                           reverse (RV) of the argument (_), and concatenate that (.) to
                           the argument (_)
   gM:                    Map this function to g and assign the result back to g
                 @>RVg    Take all but the first element of the reverse of g
             gAL:         Append that list to g and assign the result back to g
                       g  After the loop, print g (each item on its own line due to -l)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.