ทุกคนอยู่ด้วยกันได้มากขึ้น


28

(ที่เกี่ยวข้อง: หนึ่ง , สอง , สาม )

โคลงกระทู้เป็นรูปแบบของบทกวี / เขียนที่ตัวละครเริ่มต้นของแต่ละบรรทัดเมื่ออ่านในแนวตั้งยังผลิตคำหรือข้อความ ตัวอย่างเช่น,

Together
Everyone
Achieves
More

ยังสะกดคำTEAMเมื่อคอลัมน์แรกอ่านในแนวตั้ง

Acrostics เป็นเซตย่อยของmesostic s ซึ่งคำแนวตั้งสามารถอยู่ที่ใดก็ได้ในคำแนวนอน ยกตัวอย่างเช่นตัวTEAMหนึ่งที่กล่าวมาข้างต้นนั้นยังสามารถเขียนเป็นหมอผีได้ดังต่อไปนี้

   togeTher
everyonE
       Achieves
       More

พร้อมกับความหลากหลายอื่น ๆ

ความท้าทายที่นี่จะเป็นการผลิตแบบอะโครสทิกหรือผู้รอบรู้จากรายการคำศัพท์ที่ป้อนเข้ามา

อินพุต

  • ชื่อของคำในใด ๆรูปแบบที่เหมาะสมใด
  • [a-z]รายการจะมีคำที่ทำจากตัวพิมพ์เล็ก
  • รายการรับประกันในรูปแบบ acrostic หรือผู้รอบรู้ (ไม่จำเป็นต้องจัดการอินพุตปลอม)
  • หนึ่งคำในอินพุตจะสร้างคำในแนวตั้งในขณะที่คำที่เหลือจะสร้างคำในแนวนอนซึ่งเป็นส่วนหนึ่งของความท้าทายที่นี่คือการค้นหาคำในแนวตั้งที่เหมาะสมดังนั้นจึงไม่สามารถแยกได้

เอาท์พุต

  • ASCII-art acrostic หรือ mesostic ที่เกิดขึ้นจากคำอินพุตเขียนไปยัง STDOUT หรือส่งคืนในรูปแบบที่เหมาะสม
  • คำในแนวตั้งที่เกี่ยวข้องจะต้องเป็นตัวพิมพ์ใหญ่ (ดังในตัวอย่าง)
  • ช่องว่างนำเพื่อให้ได้คำแนวตั้งเข้าแถวอย่างเหมาะสมจะต้อง ช่องว่างต่อท้ายและขึ้นบรรทัดใหม่ / นำหน้าต่อท้ายเป็นตัวเลือก ช่องว่างชั้นนำพิเศษนั้นใช้ได้เช่นกันตราบใดที่คำอยู่ในแนวที่ถูกต้อง
  • หากเป็นไปได้ทั้ง acrostic และ mesostic ให้ส่งออกเฉพาะ acrostic
  • หากเป็นไปได้มากกว่าหนึ่ง acrostic / 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

ดูเหมือนว่าในกรณีที่มีการผลิต Acrostic รายการจะอยู่ในลำดับนั้นหรือไม่
Leun Nun

คุณมี testcase ที่สั้นลงได้หรือไม่?
Leun Nun

1
อนุญาตให้มีช่องว่างนำหน้าหรือไม่
PurkkaKoodari

ไม่ได้บอกว่ามีการรับประกันอินพุตที่จะจัดเรียงอย่างถูกต้อง แต่ตัดสินจากกรณีทดสอบพวกเขาคือ ที่พวกเขา?
aross

2
@ Pietu1998 แน่นอนว่าเป็นเรื่องดี - สิ่งสำคัญคือคำเรียงกัน ฉันจะแก้ไขในการชี้แจงนั้น
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
ดูเหมือนว่าจะใช้ความพยายามในการเขียน :) ดีมาก!
Emigna

@ TimmyD แก้ไขขอบคุณ
Leun Nun

4

JavaScript (ES6), 255 263 269 286

แก้ไข 17 ไบต์ที่บันทึกเป็นจำนวนช่องว่างนำโดยพลการ
Edit2สับแบบบางส่วน, 6 ไบต์บันทึก
Edit3ส่งคืนรายการสตริงแทนสตริงเดี่ยวที่มีบรรทัดใหม่ (ความคิดเห็น OP ถึงคำตอบของ feersum), 8 ไบต์ที่บันทึกเพิ่มเติม

สำหรับแต่ละคำในรายการอินพุตฉันใช้ DFS แบบเรียกซ้ำเพื่อค้นหา mesostics / acrostics ที่เป็นไปได้ทั้งหมด แต่ละคนจะถูกเก็บไว้เป็นอาร์เรย์ที่มีคำและตำแหน่งตัวอักษรเป้าหมายภายในคำ ทุกผลลัพธ์ที่ค้นพบจะถูกบันทึกไว้ในอาร์เรย์ผลลัพธ์ระดับโลกที่ตำแหน่ง 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)))

น้อย golfed

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 bytes

ฟังก์ชั่นที่ไม่มีชื่อส่งคืนรายการบรรทัด:

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 @ {"ล่าช้า", "ห้องบอลรูม", "anvil", "ถึง", "หัว"} // คอลัมน์

 ... คำเตือนหลาย ๆ หน้า ... 

ออก [145] = baLlroom
            ทั่งตีเหล็กหรือตีทอง
            ไปยัง
           หัว

ฉันกำลังมองหาคำแนะนำเกี่ยวกับวิธีที่ดีกว่าในการใช้ประโยชน์จากตัวพิมพ์ใหญ่ ฉันพบฟังก์ชันที่ดีมาก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']

ส่งกลับผลลัพธ์แรกเท่านั้นและตรวจสอบตามลำดับที่มีการตรวจสอบ acrostics ทั้งหมดก่อน

ดูกรณีทดสอบทั้งหมดที่พิมพ์ในรูปแบบการแสดงผลบน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"))

การย้ายรายการของรายชื่อผู้สมัครเป็นสิ่งที่จำเป็นเพื่อให้แน่ใจว่ามีการทำโครมา (ถ้ามี) ถูกค้นพบก่อนที่ผู้มีสติใด ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.