Разом кожен досягає більше


28

(пов’язано: один , два , три )

Без цензури це стиль вірша / записи , де початковий символ кожного рядка, при читанні по вертикалі, а також виробляє слово або повідомлення. Наприклад,

Together
Everyone
Achieves
More

також пише слово, TEAMколи перший стовпець читається вертикально.

Акростики - це підмножина мезостики , де вертикальне слово може бути в будь-якому місці горизонтальних слів. Наприклад, те, що TEAMвище, також можна записати як мезостик наступним чином

   togeTher
everyonE
       Achieves
       More

разом з кількома іншими варіантами.

Завданням буде полягати в тому, щоб створити акростичний або мезостик із заданого списку вхідних слів.

Вхідні дані

  • Список слів у будь- якому підходящому форматі .
  • Список буде містити лише слова, написані з малих літер [a-z].
  • У цьому списку гарантовано утворюється акростик або мезостик (не потрібно обробляти хибні дані).
  • Одне зі вхідних слів формуватиме вертикальне слово, а решта - горизонтальні слова - частина завдання тут полягає у тому, щоб знайти відповідне вертикальне слово, тому його не можна сприймати окремо.

Вихідні дані

  • ASCII-арт-акростик або мезостик, сформований із вхідних слів, записаних у STDOUT або повернутих, у будь-якому розумному форматі.
  • Відповідне вертикальне слово має бути з великої літери (як у прикладах).
  • Необхідні провідні пробіли, щоб вертикальне слово було відповідним чином вирівняно . Проміжні місця та провідні / кінцеві нові рядки необов’язкові. Додаткові провідні пробіли також добре, якщо слова правильно вирівнюються.
  • Якщо як акростих і mesostic можливі, вихід тільки акростих.
  • Якщо можливо декілька акростичних / мезостичних, ваш код може виводити будь-який або всі з них.

Правила

  • Прийнятна або повна програма, або функція.
  • Стандартні лазівки заборонені.
  • Це тому діють усі звичайні правила гольфу, і найкоротший код (у байтах) виграє.

Приклади

['together', 'team', 'everyone', 'achieves', 'more']
Together
Everyone
Achieves
More

['aaa', 'aaa', 'aaa', 'aaa']
Aaa
Aaa
Aaa
# One output, or multiple (of the same) output is allowed

['aaa', 'aaa', 'aab', 'baa']
Aaa
Aaa
Baa
# This is the only allowed output, since others would be mesostic, which are lower priority

['live', 'every', 'love', 'very', 'ohio']
Live
Ohio
Very
Every
# Note that 'live' couldn't be the vertical word since then it would be a mesostic, which is lower priority output

['cow', 'of', 'fox']
cOw
 Fox
# A shorter mesostic test case

['late', 'ballroom', 'anvil', 'to', 'head']
anviL
   bAllroom
    To
   hEad

Здається, що у випадках, коли виробляється акростик, список буде в такому порядку?
Leaky Nun

Чи можете у вас коротший мезостичний тест?
Leaky Nun

1
Чи дозволені додаткові провідні місця?
PurkkaKoodari

Це не говорить про те, що вхід гарантовано сортується правильно, але, судячи з тестових випадків, вони є. Чи вони?
1616

2
@ Pietu1998 Звичайно, це добре - важливо, щоб слова вишикувалися. Я відредагую це пояснення.
AdmBorkBork

Відповіді:



6

Брахілог , 145 байт

p~c[A:B:C],Bl1,A:CcP@pz:cahgB,P:1a~@nw|lL,?:laot:" "rjg:Ljb:sa:?z:cap~c[A:B:C],Bl1,A:Cc@pz:caZ:LmgB,Zl-yM,Z:M:Lz:2az:ca~@nw
bB,?h@u:Bc
b#=,?h@u|h

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

(Займає півхвилини, тож будьте терплячі.)


1
Схоже, для цього знадобилося певних зусиль, щоб написати :) Дуже приємно!
Емінья

@TimmyD Виправлено, дякую.
Leaky Nun

4

JavaScript (ES6), 255 263 269 286

Редагувати 17 байтів, збережених як довільну кількість провідних пробілів, дозволено
Edit2 деякий перетасування, 6 байт збережено
Edit3 повернення списку рядків замість однієї рядка з новими рядками (коментар ОП до відповіді Feersum), ще 8 байтів збережено

Для кожного слова в списку вводу я використовую рекурсивний DFS, щоб знайти всі можливі мезостики / акростики. Кожна з них зберігається у вигляді масиву із положенням слова та цільової літери всередині слова. Кожен знайдений результат зберігається у глобальному масиві результатів у позиції 1 (якщо це акростик) або 0, якщо це мезостик.

Після повного сканування всіх слів я отримую результат на останньому місці в масиві і будую і повертаю його представлення мистецтва ascii.

l=>(l.map((w,i)=>(r=(p,v,i,a)=>(l[i]='.',w[p]?l.map((v,i)=>~(j=v.search(w[p]))&&r(p+1,v,i,a|j,m[p]=[j,v])):l[p+1]?0:s[+!a]=[...m],l[i]=v))(0,w,i,m=[]),s=[]),m=s.pop(),m.map(([j,v])=>' '.repeat((l+0).length-j)+v.slice(0,j)+v[j].toUpperCase()+v.slice(j+1)))

Менше гольфу

f=l=>(
  l.map((w,i)=>
    // r: recursive DFS function
    // defined here as it uses local w variable
    (r = (p,v,i,a) => (
     l[i] = '.'
     , w[p] 
     ? l.map(
       (v,i) => ~(j=v.search(w[p])) && 
                r(p+1, v, i, a|j, m[p] = [j,v])

     )
     : l[p+1] ? 0 // invalid if there are still unused words
              : s[+!a]=[...m] // a is 0 if acrostic
     , l[i] = v) 
    )(0, w, i, m=[])
  , s=[]),
  m = s.pop(), // get last result
  // m.map(([j]) => o = o<j ? j : o, o=0), // find offset for alignment
  // no need to find the optimal offset as leading blanks are allowed
  m.map(([j,v]) => ' '.repeat((l+0).length-j) 
                   + v.slice(0,j) 
                   + v[j].toUpperCase()
                   + v.slice(j+1)
  )
)

Тест

f=l=>(l.map((w,i)=>(r=(p,v,i,a)=>(l[i]='.',w[p]?l.map((v,i)=>~(j=v.search(w[p]))&&r(p+1,v,i,a|j,m[p]=[j,v])):l[p+1]?0:s[+!a]=[...m],l[i]=v))(0,w,i,m=[]),s=[]),m=s.pop(),m.map(([j,v])=>' '.repeat((l+0).length-j)+v.slice(0,j)+v[j].toUpperCase()+v.slice(j+1)))

console.log=x=>O.textContent+=x+'\n\n'

;[
 ['together', 'team', 'everyone', 'achieves', 'more']
,['aaa', 'aaa', 'aaa', 'aaa']
,['aaa', 'aaa', 'aab', 'baa']
,['live', 'every', 'love', 'very', 'ohio']
,['cow', 'of', 'fox']
,['late', 'ballroom', 'anvil', 'to', 'head']
].forEach(l=>console.log(f(l).join`\n`))
<pre id=O></pre>


3

Perl6, 287 277 269 ​​байт

my @w=$*IN.words;my ($q,$r)=gather for ^@w {my @v=@w.rotate($_);my \d=@v.shift;for @v.permutations {my @o=flat($_ Z d.comb).map:{$^a.index: $^b};take $_,@o if @o>>.defined.all}}.sort(*[1].sum)[0];for @$q Z @$r ->(\a,\b){say " "x($r.max -b)~a.substr(0,b)~a.substr(b).tc}

3

Mathematica 10,0, 139 байт

Безіменна функція, що повертає список рядків:

Sort[{q=Max[p=Min/@Position@@@({z={##2},#})],Array[" "&,q-#2]<>ToUpperCase~MapAt~##&@@@({z,p})}&@@@Permutations@Characters@#][[1,2]]&

Приклад використання:

У [144]: = f = Сортувати [{q = Макс [p = Мін / @ Позиція @@@ ({z = {## 2}, #} ​​)], масив ["" &, q- # 2 ] ToUpperCase ~ MapAt ~ ## & @@@ ({z, p} )} & @@@ Перестановки @ Символи @ #] [[1,2]] &;

В [145]: = f @ {"пізно", "бальний зал", "ковадло", "до", "голова"} // Стовпець

 ... кілька сторінок попереджень ... 

Вихід [145] = бал
            Наковальня
            До
           голова

Я шукаю пропозиції щодо кращих способів капіталізації. Я знайшов дуже гарну функцію MapAtдля написання великої літери в рядку.


Звичайно, функції можуть повертати багаторядкові рядки як список рядків.
AdmBorkBork

2

Haskell, 214 206 204 202 байт

import Data.List
z=zipWith
h i j t|(u,v:w)<-splitAt j t=([1..sum i-j]>>" ")++u++toEnum(fromEnum v-32):w
f x=uncurry(z=<<h)$sort[(head<$>z elemIndices w l,l)|w:l<-permutations x,(True<$w)==z elem w l]!!0

Повертає список прокладених пробілом рядків, наприклад f ["late","ballroom","anvil","to","head"]-> [" baLlroom"," Anvil"," To"," hEad"]або більше дружнього до дисплея:

*Main> mapM_ putStrLn $ f ["late", "ballroom", "anvil", "to", "head"]
 baLlroom
   Anvil
   To
  hEad

fвибирає слова, які записуються горизонтально разом зі списком зрушень. hпрошиває кожне слово відповідно до відповідного зміщення та вставляє велику літеру. Детально:

                permutations x       -- for each permutation of the input list x
         w:l<-                       -- bind w to the first word and l to the rest
             (True<$w)==z elem w l   -- keep it if the list of other words
                                     -- containing the next letter of w
                                     -- equals (length w) times True, i.e. we have
                                     -- as many matching letters as letters in w.
                                     -- This rules out combinations shortcut by zipWith

                                     -- for all the remaining w and l make a pair
         head<$>z elemIndices w l    -- the first element of the list of list of
                                     -- indices where the letter appears in the word 
                                l    -- and l itself
   sort                              -- sort the pairs (all 0 indices, i.e. acrostics
                                     -- go first)
                               !!0   -- pick the first
                                     -- now we have a pair like
                                     -- ([2,0,0,1],["ballroom","anvil","to","head"])
 uncurry(z=<<h)                      -- loop over (index,word) and 
                                     -- provide the third parameter for h 



 h i j t                             -- h takes the list of indices and
                                     -- an index j and a word t
       (u,v:w)<-splitAt j t          -- split the word at the index and bind
                                     --   u: part before the split
                                     --   v: letter at the split
                                     --   w: part after the split
         [1..sum i-j]>>" "           -- the spaces to pad
           ++ u                      -- followed by u
           ++ toEnum(fromEnum v-32)  -- and uppercase v
           :                         -- and w 

2

Пітон, 249 байт

Напевно, все ще дуже гольфуючий

from itertools import*;e=enumerate;lambda l:[[[' ']*(max(j for k,(j,c)in o[1:])-i)+l[k][:i]+[c.upper()]+l[k][i+1:]for k,(i,c)in o[1:]]for p in product(*[list(e(w))for w in l])for o in permutations(list(e(p)))if[c for k,(i,c)in o[1:]]==l[o[0][0]]][0]

Бере та повертає список списків символів.
- наприклад " bAllroom"є[' ',' ',' ','b','A','l','l','r','o','o','m']

Тільки коли-небудь повертає перший результат і перевіряє в такому порядку, щоб усі акростики були перевірені першими.

Перегляньте всі тестові приклади, надруковані у форматі відображення на ideone


Ось більш читаема функціональна форма, яка робить те саме (за винятком того, що повертає перший результат відразу, а не оцінюючи, а потім повертаючи перший результат):

from itertools import*
def f(l):
    for p in product(*[list(enumerate(w)) for w in l]):
        for o in permutations(list(enumerate(p))):
            if [c for k,(i,c) in o[1:]] == l[o[0][0]]:
                return [ [' '] * (max(j for k,(j,c) in o[1:]) - i)
                       + l[k][:i]
                       + [c.upper()]
                       + l[k][i+1:]
                       for k, (i, c) in o[1:]
                       ]

1

Perl 6, 177 байт

->\a{for first({.[0] eq[~] .[1]»[1]},map |*,[Z] map {.[0]X [X] map {.comb[(^$_,$_,$_^..* for ^.chars)]},.[1..*]},a.permutations)[1] ->$/ {say [~] " "x a.comb-$0,|$0,$1.uc,|$2}}

Жорстоке рішення.

Як це працює

-> \a {
    for first({.[0] eq[~] .[1]»[1]},          # For the first valid candidate
            map |*, [Z]                       # among the transposed
            map {                             # lists of candidates
                .[0] X [X] map {
                    .comb[(^$_,$_,$_^..* for ^.chars)]
                }, .[1..*]
            },
            a.permutations                    # for all permutations of the input:
        )[1] ->$/ {
        say [~] " "x a.comb-$0,|$0,$1.uc,|$2  # Print the candidate as ASCII art.
    }
}

Кожен кандидат виглядає так:

"of", (("c"),"o",("w")), ((),"f",("o","x"))

Перенесення списків списків кандидатів необхідно для того, щоб акростик, якщо він існує, знаходився перед будь-яким мезостиком.

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