모두가 더 많은 것을 달성합니다 중 하나가 세로

(관련 : 하나 , , )

아크로 스틱은 각 라인의 시작 문자, 수직으로 읽을 때, 또한 단어 나 메시지를 생성 곳 / 쓰기시의 스타일입니다. 예를 들어

Together
Everyone
Achieves
More

또한 TEAM첫 번째 열을 세로로 읽으면 단어의 철자가됩니다 .

곡예는 수직 단어가 가로 단어의 어느 위치 에나있을 수있는 mesostic 의 하위 집합입니다 . 예를 들어 TEAM위의 내용은 다음과 같이 mesostic으로 작성 될 수도 있습니다.

   togeTher
everyonE
       Achieves
       More

다른 여러 변형과 함께.

여기서 주어진 문제는 주어진 입력 단어 목록에서 곡예 또는 중간을 생성하는 것입니다.

입력

  • 적절한 형식 의 단어 목록 .
  • 이 목록에는 소문자로 작성된 단어 만 포함됩니다 [a-z].
  • 이 목록은 곡예 또는 중간체를 형성하도록 보장됩니다 (가짜 입력을 처리 할 필요가 없음).
  • 입력의 단어 중 하나가 세로 단어를 형성하고 나머지 단어는 가로 단어를 만듭니다. 여기서 도전의 일부는 적절한 세로 단어를 찾는 것이므로 별도로 가져올 수 없습니다 .

산출

  • ASCII 형식의 아크로 스틱 또는 메조 스틱은 입력 단어로 구성되며 STDOUT에 작성되거나 적절한 형식으로 반환됩니다.
  • 해당하는 세로 단어는 대문자로 표기해야합니다 (예와 같이).
  • 수직 단어를 적절하게 정렬 할 수있는 선행 공백이 필요합니다 . 후행 공백 및 선행 / 후행 개행은 선택 사항입니다. 단어가 올바르게 정렬되는 한 추가 선행 공백도 좋습니다.
  • 아크로 스틱과 메소 스틱 이 모두 가능한 경우 , 아크로 스틱 출력 하십시오.
  • 하나 이상의 곡예 / 중음이 가능한 경우 코드에서 일부 또는 전부를 출력 할 수 있습니다.

규칙

  • 전체 프로그램 또는 기능이 허용됩니다.
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

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


답변

Pyth, 52 49 47 46 바이트

jm++*;-lsQhAd<HGr>HG4hhMDfhhShMTm.b,xNYNtdhd.p

온라인으로 사용해보십시오.

이것은 아마도 매우 골프입니다. 선행 공백을 인쇄합니다.


답변

Brachylog , 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 분 반이 걸리므로 인내심을 가지십시오.)


답변

자바 스크립트 (ES6) 255 263 269 286

임의의 선행 공백으로 저장된 17 바이트 편집 가능
Edit2 일부 셔플 링, 6 바이트 저장
Edit3 줄 바꿈 (OP 주석에 대한 주석), 8 바이트 더 저장된 단일 문자열 대신 문자열 목록을 반환

입력 목록의 각 단어에 대해 재귀 DFS를 사용하여 가능한 모든 mesostics / acrostics를 찾습니다. 각 단어는 단어 안에 단어 및 대상 문자 위치가있는 배열로 저장됩니다. 찾은 모든 결과는 위치 1 (Acrostic 인 경우)의 전역 결과 배열에 저장되거나 Mesostic 인 경우 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>

답변

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}

답변

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 = Max [p = Min / @ Position @@@ ({z = {## 2}, #} ​​)], Array [ ""&, q- # 2 ] ToUpperCase ~ MapAt ~ ## & @@@ ({z, p} )} & @@@ Permutations @ Characters @ #] [[1,2]] &;

[145] : = f @ { "late", "ballroom", "anvil", "to", "head"} // 열

 ... 여러 페이지 경고 ... 

밖으로 [145] = baLlroom
            모루
            에
           머리

대문자를 사용하는 더 좋은 방법에 대한 제안을 찾고 있습니다. MapAt문자열에서 문자를 대문자로 쓰는 매우 좋은 기능 을 찾았습니다 .


답변

하스켈 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

답변

파이썬, 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:]
                       ]