ต่อต้านการคาดเดาโดยอัตโนมัติประกอบเพลงที่มีพยัญชนะ


15

ขอบคุณ @ComradeSparklePony สำหรับชื่อเรื่อง

ความท้าทายนี้น่าจะง่ายมาก คุณจะได้รับสามรายการ

แรกคือรายการของชื่อในกรณีชื่อ

ที่สองคือรายการของคำคุณศัพท์ในกรณีที่ต่ำกว่า

ที่สามคือรายการของคำนามในกรณีที่ต่ำกว่า

<Name>'s <adjective> <noun>กรุณาสุ่มเลือกชื่อคำคุณศัพท์ตัวเลือกและคำนามและเอาท์พุท อย่างไรก็ตามแต่ละคำจะต้องเริ่มต้นด้วยตัวอักษรเดียวกัน คุณสามารถสันนิษฐานได้ว่าทุกคำขึ้นต้นด้วยตัวอักษร นอกจากนี้คุณยังสามารถสมมติ (แต่จดบันทึกคำตอบของคุณหากทำ):

  • คำทั้งหมดนั้นประกอบด้วยตัวอักษรแบบตัวอักษรเท่านั้น
  • มีคำนามอย่างน้อยหนึ่งชื่อสำหรับแต่ละชื่อ
  • มีอย่างน้อยหนึ่งชื่อสำหรับแต่ละคำนาม

อย่างไรก็ตามคุณไม่สามารถสันนิษฐานได้ว่ามีคำคุณศัพท์สำหรับคู่ของชื่อและคำนามเนื่องจากคำคุณศัพท์เป็นตัวเลือกดังนั้นผลลัพธ์จะยังคงใช้ได้

คุณไม่จำเป็นต้องเลือกจดหมายที่ใช้ร่วมกันอย่างสม่ำเสมอแม้ว่าตัวอักษรที่มีทั้งหมดจะต้องมีโอกาสที่ไม่เกิดขึ้น อย่างไรก็ตามคุณจะต้องตรวจสอบให้แน่ใจว่าผลลัพธ์ทั้งหมดสำหรับจดหมายที่ให้นั้นมีโอกาสใกล้เคียงกันที่จะเกิดขึ้นมากที่สุดเท่าที่จะทำได้ภายในขอบเขตของตัวสร้างตัวเลขสุ่มของภาษาของคุณ ในกรณีของคำคุณศัพท์สิ่งนี้เทียบเท่ากับการมีคำศัพท์พิเศษหมายถึง "ไม่มีคำคุณศัพท์สำหรับจดหมายฉบับนี้" ซึ่งมีโอกาสเช่นเดียวกับคำคุณศัพท์ทั้งหมดสำหรับจดหมายฉบับนั้น

ตัวอย่างรายการอินพุต:

Joan Neil Nicola Oswald Sherman Stephanie
new novel old original second silent
jeep noun novel output second sheep snake

ตัวอย่างเอาต์พุตสำหรับอินพุตเหล่านี้ (แต่ละบรรทัดเป็นตัวอย่างแยกต่างหาก):

Stephanie's second second
Sherman's silent snake
Oswald's original output
Nicola's novel novel
Neil's noun
Joan's jeep

หมายเหตุไม่มีช่องว่างพิเศษระหว่างคำในสองตัวอย่างสุดท้าย

นี่คือดังนั้นรหัสที่สั้นที่สุดที่ทำลายช่องโหว่มาตรฐานไม่ชนะ!

ในเหตุการณ์ที่ไม่น่าเป็นไปได้ที่จะช่วยให้คุณสามารถป้อนข้อมูลทุกอย่างเป็นตัวพิมพ์ใหญ่ แต่คุณยังต้องส่งออกเป็นตัวพิมพ์ใหญ่


เราถูกต้องหรือไม่ที่จะถือว่าโปรแกรมควรกลับมา: 1 ชื่อ 1 คำคุณศัพท์ (ถ้าตรงกับชื่อ) 1 คำนาม? หรือคุณขอให้สร้างผลลัพธ์สำหรับแต่ละชื่อ
DavidC

1
บางทีคุณควรเพิ่ม 'Joan' และ 'jeep' ในตัวอย่างของคุณเพื่ออธิบายความจริงที่ว่าอาจไม่มีคำคุณศัพท์สำหรับจดหมายที่ระบุ
Arnauld

เมื่อใส่ตัวอย่างของคุณโอกาสที่จะไม่มีคำคุณศัพท์ 1 ใน 3 (เนื่องจากคำคุณศัพท์ทั้งหมด "รายการ" ยาว 2)? ... และถ้า 'Joan' และ 'Jeep' อยู่ที่นั่นโดยไม่jคาดเดาโอกาสที่จะกลายเป็น 4 ใน 9 หรือไม่ อาจคุ้มค่าที่จะวางความน่าจะเป็นกับเอาท์พุทหรือแจกแจงเอาท์พุททั้งหมด - เพราะฉันเข้าใจว่าไม่เพียง "เอาท์พุททั้งหมดสำหรับจดหมายที่กำหนด ... " แต่ยังเอาท์พุทที่แตกต่างกันทั้งหมดควรมีโอกาสเท่ากัน
Jonathan Allan

@DavidC ขออภัยฉันทราบดีว่าการเพิ่มตัวอย่างพิเศษทำให้ชัดเจน คุณสร้างเอาต์พุตเพียงบรรทัดเดียวสำหรับแต่ละการเรียกใช้
Neil

1
@JonathanAllan การเพิ่ม "Joan" และ "jeep" จะไม่ส่งผลกระทบต่อโอกาสในการแสดงผล "นามของ Neil" เทียบกับตัวเลือกอื่น ๆ ที่มี "Neil" และ "นาม"
Neil

คำตอบ:


5

เยลลี่ ,  27 25  24 ไบต์

-1 ต้องขอบคุณ Erik the Outgolfer (ใช้ศูนย์แทนอักขระเว้นวรรค)

Ż€2¦Œpḟ€0ZḢŒuEƲƇXż“'s“”K

โปรแกรมเต็มรูปแบบยอมรับการโต้แย้งในรูปแบบของรายการที่จัดรูปแบบ Python ของรายการของสตริงที่พิมพ์ผลลัพธ์ไปยัง STDOUTt

ลองออนไลน์!

อย่างไร?

Ż€2¦Œpḟ€0ZḢŒuEƲƇXż“'s“”K - Main Link: list of lists of lists of characters
 € ¦                     - sparse application...
  2                      - ...to indices: [2]
Ż                        - ...action: prepend a zero (place holder for no adjective)
    Œp                   - Cartesian product (all choices, including invalid ones)
       €                 - for each:
      ḟ 0                -   filter out any zeros
               Ƈ         - filter keep those for which:
              Ʋ          -   last four links as a monad:
         Z               -     transpose
          Ḣ              -     head
           Œu            -     upper-case
             E           -     all equal?
                X        - random (uniform) choice  e.g. [['B','o','b'],['b','l','u','e'],['b','a','g']]
                 ż       - zip with:
                  “'s“”  -   list [["'", 's'], []]       [[['B','o','b'],["'", 's']],[['b','l','u','e'],[]],['b','a','g']]
                       K - join with spaces              [['B','o','b'],["'", 's'],' ',['b','l','u','e'],[],' ','b','a','g']
                         - implicit (smashing) print     Bob's blue bag

24 ไบต์
Erik the Outgolfer

อ่าใช่แล้ว :)
Jonathan Allan

5

05AB1E ,  24 23  21 ไบต์

ถือว่ามีคำนามสำหรับแต่ละชื่อตามที่อนุญาตโดยการท้าทาย

„'s«I¯ªâI‘ʒl€нË}Ωðý

ลองออนไลน์!

คำอธิบาย

„'s«                    # append "'s" to all names in the name-list
    I¯ª                 # append an empty list to the adjective-list
       â                # cartesian product between the lists
        Iâ              # cartesian product with the noun-list
          €˜            # deep flatten each sublist
            ʒ    }      # filter, keep only lists that when
             l          # converted to lowercase
              €н        # with only heads kept
                Ë       # have all elements equal
                  Ω     # pick a valid list uniformly at random
                   ðý   # and join by spaces

โอ้¯ªและ€˜เป็นสมาร์ท! ผมมีคำตอบที่ 26 ไบต์ แต่มีปัญหาในการแก้ไขสองครั้งพื้นที่เมื่อไม่มีคำคุณศัพท์ ..
เควิน Cruijssen

@KevinCruijssen: ใช่นั่นคือส่วนที่ฉันมีปัญหามากที่สุดเช่นกัน เอาฉันสักครู่เพื่อตระหนักว่าฉันสามารถใช้¯แทนการกรอกด้วยสตริงว่างเปล่าฉันต้องทำความสะอาดด้วยตนเองในภายหลัง
Emigna

4

R , 155 148 ไบต์

-7 ไบต์ขอบคุณ Giuseppe (ใช้*สำหรับsample)

function(x,y,z){`*`=sample
while(T)T=length(unique(c(tolower(substr(c(a<-x*1,b<-c(y,"")*1,c<-z*1),1,1)),"")))-2
paste0(a,"'s ",b,if(nchar(b))" ",c)}

ลองออนไลน์!

ใช้การสุ่มตัวอย่างการปฏิเสธ: วาดที่ชื่อสุ่มคำคุณศัพท์ (อาจเป็นสตริงว่าง) และคำนามจนกระทั่งตัวอักษรตัวแรกตรงกัน เงื่อนไขนี้จะถูกตรวจสอบโดยการนับถ้าจำนวนองค์ประกอบที่ไม่ซ้ำกันในเวกเตอร์ที่เกิดขึ้นจากตัวอักษรตัวแรกรวมทั้งสตริงที่ว่างเปล่ามีความยาว 2 - นี้ช่วยให้คำคุณศัพท์ที่ว่างเปล่า

จากนั้นพิมพ์ผลลัพธ์โดยมีช่องว่างเพิ่มเติมหากคำคุณศัพท์ไม่ว่างเปล่า

ความเป็นไปได้ต่าง ๆ ที่เริ่มต้นด้วยตัวอักษรเดียวกันนั้นมีความน่าจะเป็นที่เท่ากันเนื่องจากsampleดึงออกมาจากการแจกแจงแบบเดียวกัน วิธีที่ง่ายที่สุดในการดูสิ่งนี้คือการกำหนดเงื่อนไขในกรณีที่ชื่อและคำนามเริ่มต้นด้วยตัวอักษรเดียวกัน (ซึ่งก็ดี: ถ้าไม่มีเราจะปฏิเสธ) ตอนนี้มีเงื่อนไขกับเหตุการณ์ที่เรายอมรับนั่นหมายความว่าเราวาดคำคุณศัพท์ว่างเปล่าหรือคำคุณศัพท์ที่เริ่มต้นด้วยตัวอักษรเดียวกัน ความเป็นไปได้แต่ละอย่างเหล่านี้ยังคงมีความน่าจะเป็นที่เท่ากัน

105


สิ่งนี้มีโอกาสเท่ากันในการที่คุณจะได้คำคุณศัพท์ว่างเปล่าสำหรับจดหมายฉบับแรกที่ให้หรือไม่?
Nick Kennedy

@NickKennedy ใช่ตั้งแต่sampleดึงออกมาจากการกระจายเครื่องแบบ วิธีที่ง่ายที่สุดในการดูสิ่งนี้คือการกำหนดเงื่อนไขในกรณีที่ชื่อและคำนามเริ่มต้นด้วยตัวอักษรเดียวกัน (ซึ่งก็ดี: ถ้าไม่มีเราจะปฏิเสธ) ตอนนี้มีเงื่อนไขกับเหตุการณ์ที่เรายอมรับนั่นหมายความว่าเราวาดคำคุณศัพท์ว่างเปล่าหรือคำคุณศัพท์ที่เริ่มต้นด้วยตัวอักษรเดียวกัน ความเป็นไปได้แต่ละอย่างเหล่านี้ยังคงมีความน่าจะเป็นที่เท่ากัน
Robin Ryder

ขอบคุณอธิบายได้ดี
Nick Kennedy

@NickKennedy ขอบคุณฉันจะเพิ่มคำอธิบายที่โพสต์พร้อมกับลิงค์เพื่อตรวจสอบประจักษ์ว่าน่าจะเป็นเท่ากับ
Robin Ryder


3

JavaScript (ES6),  139 124 122  120 ไบต์

บันทึก 2 ไบต์ด้วย @Neil

(names,adjectives)(nouns)จะเข้าเป็น

(N,a)=>F=n=>/^(.)\S+( \1\S+)+$/i.test(s=(g=a=>a[Math.random()*a.length|0])(N)+"'s "+[(o=g([,...a]))&&o+' ']+g(n))?s:F(n)

ลองออนไลน์!

หรือตรวจสอบการกระจาย 5 ล้านจับ

อย่างไร?

ก.

g = a => a[Math.random() * a.length | 0]

ก.s

s = g(N) + "'s " +
    [(o = g([, ...a])) && o + ' '] +
    g(n)

จากนั้นเราตรวจสอบว่าตัวอักษรเริ่มต้นทั้งหมดเหมือนกันกับนิพจน์ทั่วไปต่อไปนี้:

/^(.)\S+( \1\S+)+$/i

s


+[(o=g([,...a]))&&o+' ']+บันทึก 2 ไบต์ฉันคิดว่า?
Neil

@ Neil Ah ใช่ ทำได้ดีนี่.
Arnauld

3

Python 3 , 161 154 151 147 145 ไบต์

( ขอบคุณ ArBo, EmbodimentOfIgnorance, Neil ผู้มีส่วนร่วม 2, 3 และ 4 ไบต์กับกอล์ฟครั้งแรกของฉัน! )

from random import*
c=choice
def f(N,a,n):
 s=c(N);w=s[0].lower();o=N
 while o[0]!=w:o=c(n)
 print(s+"'s",c([x+" "for x in a if x[0]==w]+[""])+o)

ลองออนไลน์! (ด้วยการประหารชีวิต 500k)

  • ใช้สามรายการเป็นอินพุต

  • ถือว่าคำนามอย่างน้อยหนึ่งชื่อสำหรับแต่ละชื่อ


คะแนนเดียวกันมากขึ้น golf-y:

Python 3 , 145 ไบต์

from random import*
c=choice
def f(N,a,n):
 s=c(N);y=lambda p,e=[]:c([x+" "for x in p if x[0]==s[0].lower()]+e);print(s+"'s",y(a,[""])+y(n)[:-1])

ลองออนไลน์! (ด้วยการประหารชีวิต 500k)

เพียง 140 ถ้าอนุญาตให้ใช้ช่องว่างต่อท้ายได้ (โดยการลบรูปสี่เหลี่ยมจตุรัส[:-1])


1
คำตอบแรกที่ดี! while t>""<t[0]!=wคุณสามารถบันทึกไบต์ในวงในขณะที่ครั้งแรก: นอกจากนี้คุณยังสามารถแทนที่บรรทัดสุดท้ายโดยprint(s+"'s",t+(t and" ")+o)วางลงu=ในบรรทัดที่สาม
ArBo

ฉันสิ้นสุดการเปลี่ยนโซลูชันเนื่องจากก่อนหน้านี้ไม่ตรงกับข้อกำหนด
Nicola Sap

1
152 ไบต์ (ส่วนท้ายถูกนำออกเพื่อให้พอดีกับ URL ในความคิดเห็น)
ศูนย์รวมแห่งความไม่รู้

1
คุณใช้ตัวแปรtเพียงครั้งเดียวเพื่อให้คุณสามารถบันทึก 4 ไบต์ได้โดยใส่โค้ดไว้ ฉันคิดว่าคุณสามารถเปลี่ยนoไปใช้รูปแบบรหัสที่คล้ายกันได้tจากนั้นบันทึกอีก 4 ไบต์ด้วยการทำอินไลน์เช่นกัน
Neil

ขอบคุณพวกคุณช่วยจริงๆ! @ Neil, ฉันไม่สามารถ refactor o: ฉันถึงสิ่งนี้: from random import* c=choice def f(N,a,n): s=c(N);y=lambda p,e=[]:c([x for x in p if x[0]==s[0].lower()]+e);print(s+"'s",y(a,[""])+y(n))( 137 ) แต่การเพิ่มช่องว่างตามเงื่อนไขผ่าน ARG ที่เป็นตัวเลือกทำให้yฉันต้องเสียค่าใช้จ่าย 11 ไบต์
Nicola Sap

0

เยลลี่ขนาด 28 ไบต์

1ịZḢXɓŒuḢ=ɗƇ€Ż€2¦X€ḟ0ż“'s“”K

ลองออนไลน์!

เขียนสิ่งนี้ก่อนที่ฉันจะเห็นคำตอบสั้น ๆ ของ @ JonathanAllan แต่คิดว่ามันควรค่าแก่การโพสต์เพราะใช้วิธีการอื่น บันทึก 3 ไบต์โดย @ EriktheOutgolfer คำแนะนำของคำตอบนั้น

โปรแกรมเต็มรายการของรายการของสายอักขระและการพิมพ์การแบ่งส่วนที่เลือกแบบสุ่ม ถือว่าคำนามอย่างน้อยหนึ่งชื่อ


0

C # (Visual C # Interactive คอมไพเลอร์) , 176 ไบต์

(a,b,c)=>(a=a[z.Next(a.Count)])+"'s "+b.Where(x=>(x[0]&95)==a[0]).Append("").OrderBy(x=>z.Next()).Last()+" "+c.OrderBy(x=>z.Next()).Last(x=>(x[0]&95)==a[0]);var z=new Random();

ลองออนไลน์!


คุณสามารถสมมติว่าชื่อที่ขึ้นต้นด้วยตัวอักษรตัวพิมพ์ใหญ่ดังนั้นคุณสามารถเป็นตัวพิมพ์ใหญ่ตัวอักษรอื่นสำหรับการเปรียบเทียบซึ่งควรประหยัด 10 ไบต์?
Neil

@ Neil Yep ขนาด 10 ไบต์ :)
ศูนย์รวมของความไม่รู้

0

สีแดง 179 ไบต์

func[a b c][random a random c
foreach k c[if k/1 = h: a/1/1 + 32[g: rejoin[sp k]]]collect/into[foreach
d b[if d/1 = h[keep rejoin[sp d]]]]e: copy[""]random e rejoin[a/1"'s"e/1 g]]

ลองออนไลน์!

คำอธิบาย:

Red[]
f: func[a b c][                     ; a function with 3 arguments
    random a                        ; shuffle the list of names in place
    random c                        ; shuffle the list of nouns in place
    foreach k c [                   ; for each item in the shuffled list of nouns
        if k/1 = h: a/1/1 + 32 [    ; check if it begins with the same lowercase letter
                                    ; as the first name in the shuffled list of names
            g: rejoin [" " k]       ; if yes, then insert a " " in front of it save it as g
        ]                           ; thus I always get the last match
    ]
    collect/into [                  ; collect in a new list e
        foreach d b [               ; all items form the adjectives list
            if d/1 = h [            ; that start with the same lowercase letter as the 1st noun
                keep rejoin [" " d] ; insert a " " in form of the adjective
            ]
        ]
    ] e: copy[""]                   ; the list initially has a single item - the empty string
   random e                         ; shuffle the extracted adjectives list
   rejoin [a/1 "'s" e/1 g]          ; return the formatted string
]

0

สกาลา , 234 226 234 206 ไบต์

-28 เนื่องจากความจริงที่ฉันคิดว่ามันต้องยอมรับ StdIn มันเป็นฟังก์ชั่นทันที

def f(a:List[String],b:List[String],c:List[String])=scala.util.Random.shuffle(for(d<-a;e<-("" +: b);g<-c;if(d.head.toLower==g.head&&(e.isEmpty||e.head==g.head))) yield s"$d's $e $g".replace("  ", " ")).head

ลองออนไลน์!

Ungolfed:

def f(names: List[String], adjectives: List[String], nouns: List[String]) = {
  val allPossible = for {
    name <- names
    adjective <- ("" +: adjectives) // Add the choice of no adjective
    noun <- nouns
    if (name.head.toLower == noun.head && (adjective.isEmpty || adjective.head == noun.head)) // Filter out so only matching entries remain
  } yield
    s"$name's $adjective $noun"
      .replace("  ", " ") // Get rid of artifact created by the empty adjective selection

  scala.util.Random.shuffle(allPossible.toList).head // Get a random element
}


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