모두가 더 많은 것을 달성합니다


28

(관련 : 하나 , , )

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

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

곡예가 생성되는 경우 목록이 그 순서대로 표시됩니까?
Leaky Nun

짧은 mesostic testcase를 가질 수 있습니까?
Leaky Nun

1
추가 선행 공백이 허용됩니까?
PurkkaKoodari

입력이 올바르게 정렬되었다고 보장되지는 않지만 테스트 사례를 기준으로 판단됩니다. 그들이 있습니까?
aross

2
물론, 괜찮습니다. 중요한 것은 단어가 줄 지어 있다는 것입니다. 그 설명에서 편집하겠습니다.
AdmBorkBork

답변:



6

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


1
이 작업을 작성하는 데 약간의 노력이 필요한 것 같습니다 :) 아주 좋습니다!
Emigna

@TimmyD 고정, 감사합니다.
Leaky Nun

4

자바 스크립트 (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>


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 = 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문자열에서 문자를 대문자로 쓰는 매우 좋은 기능 을 찾았습니다 .


물론 함수는 여러 줄 문자열을 문자열 목록으로 반환 할 수 있습니다.
AdmBorkBork

2

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

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

존재하는 경우, 어떤 메소 스틱 앞에 곡예가 있는지 확인하기 위해 후보자 목록의 목록을 전치해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.