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