大家一起成就更多


28

(相关:

一个离合词是诗的风格/写,其中每行的开始字符,当垂直读取,还产生一个字或消息。例如,

Together
Everyone
Achieves
More

TEAM垂直阅读第一列时也会拼出单词。

离合诗是的一个子集mesostic s,其中所述垂直字可以是在水平字的任何地方。例如,TEAM上面的代码也可以写成如下

   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

您可以使用较短的介晶测试用例吗?
Leaky Nun

1
是否允许多余的前导空格?
PurkkaKoodari

并不是说可以保证对输入进行正确的排序,但是从测试用例来看,它们是正确的。是吗
2016年

2
@ Pietu1998当然,这很好-重要的是单词要排成一行。我将在澄清中进行编辑。
AdmBorkBork,2016年

Answers:


2

Pyth,52 49 47 46字节

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

在线尝试。

这可能非常适合打高尔夫球。它打印了一堆前导空格。


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
看起来这花了点力气:)非常好!
Emigna '16

@TimmyD固定,谢谢。
Leaky Nun

4

JavaScript(ES6),255 263 269 286

编辑 17个字节,允许保存任意数量的前导空格
Edit2进行一些改组,保存6个字节
Edit3返回一个字符串列表,而不是带有换行符的单个字符串(feersum的答案为OP注释),还保存了8个字节

对于输入列表中的每个单词,我使用递归DFS来查找所有可能的介晶/腐蚀性。每个单词都存储为一个数组,单词和目标字母在单词内部的位置。找到的每个结果都保存在全局结果数组中的位置1(如果是acrostic)或0(如果是mesostic)中。

在对所有单词进行完全扫描之后,我得到数组中最后一个位置的结果,并构建并返回其ascii art表示形式。

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]]&;

In [145]:= f @ {“ late”,“ ballroom”,“ anvil”,“ to”,“ head”} //列

 ...多页警告... 

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

Python,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"))

必须对候选列表进行转置,以确保在出现任何杂音之前都找到了杂音(如果存在)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.