Tự động chống dự đoán lắp ráp một aria tiêu chuẩn


15

Cảm ơn @ComradeSparklePony cho tiêu đề.

Thử thách này nên rất đơn giản. Bạn được đưa ra ba danh sách.

Đầu tiên là một danh sách các tên đầu tiên, trong trường hợp tiêu đề.

Thứ hai là một danh sách các tính từ, trong trường hợp thấp hơn.

Thứ ba là một danh sách các danh từ, trong trường hợp thấp hơn.

Vui lòng chọn ngẫu nhiên một tên, tính từ tùy chọn và danh từ và đầu ra <Name>'s <adjective> <noun>. Tuy nhiên, mỗi từ phải bắt đầu bằng cùng một chữ cái. Bạn có thể cho rằng tất cả các từ bắt đầu bằng một chữ cái. Bạn cũng có thể giả sử (nhưng lưu ý trong câu trả lời của bạn nếu bạn làm):

  • rằng tất cả các từ chỉ bao gồm các ký tự chữ cái
  • rằng có ít nhất một danh từ cho mỗi tên
  • rằng có ít nhất một tên cho mỗi danh từ

Tuy nhiên, bạn không thể cho rằng một tính từ tồn tại cho một cặp tên và danh từ cụ thể, vì tính từ này là tùy chọn nên đầu ra vẫn sẽ hợp lệ.

Bạn không phải chọn thư được chia sẻ thống nhất, mặc dù tất cả các chữ cái có sẵn phải có cơ hội xảy ra khác không. Tuy nhiên, bạn phải đảm bảo rằng tất cả các kết quả đầu ra cho một chữ cái đã cho có khả năng xảy ra gần như bằng nhau trong giới hạn của trình tạo số ngẫu nhiên trong ngôn ngữ của bạn. Trong trường hợp tính từ, điều này tương đương với việc có thêm một mục có nghĩa là "không có tính từ cho chữ cái này" có cùng cơ hội với tất cả các tính từ khác cho chữ cái đó.

Danh sách đầu vào ví dụ:

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

Các đầu ra ví dụ cho các đầu vào này (mỗi dòng là một ví dụ riêng):

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

Lưu ý không có khoảng trắng thừa giữa các từ trong hai ví dụ cuối.

Đây là , vì vậy đoạn mã ngắn nhất không phá vỡ sơ hở tiêu chuẩn!

Trong trường hợp không chắc là nó có ích, bạn có thể nhập mọi thứ bằng chữ in hoa, nhưng bạn vẫn cần xuất ra trong trường hợp câu.


Chúng ta có đúng không khi cho rằng chương trình sẽ trả về: 1 tên 1 tính từ (nếu một từ khớp với tên) 1 danh từ? Hay bạn đang yêu cầu sản xuất một đầu ra cho mỗi tên?
DavidC

1
Có lẽ bạn nên thêm 'Joan' và 'jeep' trong ví dụ của bạn để minh họa thực tế rằng có thể không có tính từ nào cho một chữ cái nhất định?
Arnauld

Cho ví dụ đầu vào của bạn là cơ hội không có tính từ 1 trong 3 (vì tất cả các "danh sách" tính từ đều dài 2)? ... và nếu 'Joan' và 'Jeep' cũng ở đó mà không có tính từ jchối thì cơ hội có thể trở thành 4 trên 9 không? Có thể đáng để đặt xác suất so với đầu ra hoặc liệt kê tất cả các kết quả đầu ra - vì tôi hiểu nó không chỉ "tất cả các đầu ra cho một chữ cái đã cho ..." mà tất cả các đầu ra riêng biệt đều có khả năng như nhau (đưa ra các giá trị riêng biệt trong mỗi danh sách).
Jonathan Allan

@DavidC Xin lỗi, tôi nhận thấy việc thêm các ví dụ đã làm cho điều đó không rõ ràng; bạn chỉ tạo một dòng đầu ra cho mỗi lần gọi.
Neil

1
@Jonathan ALLan Việc thêm "Joan" và "jeep" sẽ không ảnh hưởng đến cơ hội tương đối của "danh từ của Neil" so với các tùy chọn khác có chứa "Neil" và "danh từ".
Neil

Câu trả lời:


5

Thạch ,  27 25  24 byte

-1 nhờ Erik the Outgolfer (sử dụng số 0 thay vì ký tự khoảng trắng)

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

Một chương trình đầy đủ chấp nhận một đối số ở dạng danh sách các chuỗi được định dạng của Python sẽ in kết quả đầu ra thành STDOUTt.

Hãy thử trực tuyến!

Làm sao?

Ż€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


À đúng rồi, tốt đẹp :)
Jonathan Allan

5

05AB1E ,  24 23  21 byte

Giả sử có một danh từ cho mỗi tên, như được cho phép bởi thử thách.

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

Hãy thử trực tuyến!

Giải trình

„'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

Ồ, ¯ª€˜thông minh! Tôi đã có câu trả lời 26 byte, nhưng gặp khó khăn khi sửa không gian kép khi không có tính từ ..
Kevin Cruijssen

@KevinCruijssen: Vâng, đó cũng là phần tôi gặp nhiều vấn đề nhất. Mất một lúc tôi mới nhận ra rằng tôi có thể sử dụng ¯thay vì điền vào các chuỗi trống tôi phải tự dọn dẹp sau đó.
Emigna

4

R , 155 148 byte

-7 byte nhờ Giuseppe (sử dụng *cho 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)}

Hãy thử trực tuyến!

Sử dụng lấy mẫu từ chối: vẽ ngẫu nhiên một tên, một tính từ (có thể là chuỗi trống) và một danh từ cho đến khi các chữ cái đầu tiên khớp. Điều kiện này được kiểm tra bằng cách đếm nếu số phần tử duy nhất trong vectơ được hình thành từ các chữ cái đầu tiên, cộng với chuỗi trống, có độ dài 2 - điều này cho phép tính từ trống.

Sau đó in kết quả, với một khoảng trắng thừa nếu tính từ không trống.

Các khả năng khác nhau bắt đầu bằng cùng một chữ cái có xác suất xuất hiện bằng nhau, do samplerút ra từ phân phối thống nhất. Cách dễ nhất để thấy điều này là dựa vào sự kiện rằng tên và danh từ bắt đầu bằng cùng một chữ cái (điều này tốt: nếu họ không, chúng tôi sẽ từ chối). Bây giờ điều kiện về sự kiện mà chúng tôi chấp nhận: điều này có nghĩa là chúng tôi rút ra tính từ trống hoặc tính từ bắt đầu bằng cùng một chữ cái. Mỗi khả năng này vẫn có xác suất như nhau.

105


Điều này có cơ hội như nhau của một tính từ trống với khả năng lẫn nhau cho bất kỳ chữ cái đầu tiên nào không?
Nick Kennedy

@NickKennedy Có, vì samplerút ra từ phân phối đồng phục. Cách dễ nhất để thấy điều này là dựa vào sự kiện rằng tên và danh từ bắt đầu bằng cùng một chữ cái (điều này tốt: nếu họ không, chúng tôi sẽ từ chối). Bây giờ điều kiện về sự kiện mà chúng tôi chấp nhận: điều này có nghĩa là chúng tôi rút ra tính từ trống hoặc tính từ bắt đầu bằng cùng một chữ cái. Mỗi khả năng này vẫn có xác suất như nhau.
Robin Ryder

cảm ơn, giải thích tốt
Nick Kennedy

@NickKennedy Cảm ơn, tôi sẽ thêm lời giải thích đó vào bài đăng cùng với một liên kết để xác minh theo kinh nghiệm rằng các xác suất là bằng nhau.
Robin Ryder


3

JavaScript (ES6),  139 124 122  120 byte

Lưu 2 byte nhờ @Neil

Đưa đầu vào là (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)

Hãy thử trực tuyến!

Hoặc kiểm tra phân phối trên 5 triệu rút thăm

Làm sao?

g

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

gs

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

Sau đó chúng tôi kiểm tra xem tất cả các chữ cái ban đầu có giống với biểu thức chính quy sau không:

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

S


+[(o=g([,...a]))&&o+' ']+Tôi tiết kiệm được 2 byte?
Neil

@Neil À, vâng. Đẹp một.
Arnauld

3

Python 3 , 161 154 151 147 145 byte

( Cảm ơn ArBo, EmbodimentOfIgnorance, Neil, người đã đóng góp 2, 3 và 4 byte cho sân golf đầu tiên của tôi! )

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)

Hãy thử trực tuyến! (với 500k thực thi)

  • Có ba danh sách làm đầu vào.

  • Giả sử ít nhất một danh từ cho mỗi tên.


Cùng một số điểm, nhiều golf-y:

Python 3 , 145 byte

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])

Hãy thử trực tuyến! (với 500k thực thi)

Nó chỉ là 140 nếu cho phép các khoảng trắng ở cuối (bằng cách loại bỏ mặt vuông [:-1])


1
Câu trả lời đầu tiên tốt đẹp! Bạn có thể lưu một byte trong vòng lặp while đầu tiên : while t>""<t[0]!=w. Bạn cũng có thể thay thế dòng cuối cùng bằng cách print(s+"'s",t+(t and" ")+o)thả u=dòng thứ ba.
ArBo

Cuối cùng tôi đã thay đổi giải pháp của mình vì trước đó không phù hợp với yêu cầu
Nicola Sap

1
152 byte (Footer đã bị xóa để phù hợp với URL trong nhận xét)
Hiện thân của sự thiếu hiểu biết

1
Bạn chỉ sử dụng biến tmột lần để bạn có thể lưu 4 byte bằng cách nội tuyến mã. Tôi nghĩ rằng bạn có thể chuyển osang sử dụng một mẫu mã tương tự t, và sau đó lưu 4 byte khác bằng cách nội tuyến.
Neil

Cảm ơn, các bạn đang thực sự giúp đỡ! @Neil, tôi chưa thể cấu trúc lại o: Tôi đạt được điều này: 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 ) nhưng thêm khoảng trắng có điều kiện, thông qua một đối số tùy chọn y, chi phí cho tôi là 11 byte
Nicola Sap

0

Thạch , 28 byte

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

Hãy thử trực tuyến!

Đã viết điều này trước khi tôi thấy câu trả lời ngắn hơn của @ JonathanAllan, nhưng nghĩ rằng nó đáng để đăng vì nó sử dụng một cách tiếp cận khác. Đã lưu 3 byte bởi đề xuất của @ EriktheOutgolfer về câu trả lời đó.

Một chương trình đầy đủ lấy một danh sách các danh sách các chuỗi và in ngầm định một sự phân bổ được chọn ngẫu nhiên. Giả sử ít nhất một danh từ cho mỗi tên.


0

C # (Trình biên dịch tương tác Visual C #) , 176 byte

(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();

Hãy thử trực tuyến!


Bạn có thể giả sử tên bắt đầu bằng một chữ cái viết hoa, vì vậy bạn chỉ có thể viết hoa các chữ cái khác để so sánh, điều này sẽ giúp bạn tiết kiệm 10 byte?
Neil

@Neil Yep, chính xác là 10 byte :)
Hiện thân của sự thiếu hiểu biết

0

Màu đỏ , 179 byte

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

Hãy thử trực tuyến!

Giải trình:

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

Scala , 234 226 234 206 byte

-28 do thực tế tôi nghĩ rằng nó phải chấp nhận StdIn, bây giờ nó là một chức năng

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

Hãy thử trực tuyến!

Ung dung:

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
}


0

Biểu tượng , 167 163 byte

procedure f(a,b,c)
!a:=:?a&\x;!c:=:?c&\x;d:=[""]
e:=!b&e[1]==(t:=char(32+ord(a[1,1])))&put(d," "||e)&\x
!d:=:?d&\x;return(!a||"'s"||!d||" "||(k:=!c&t==k[1]&k))
end

Hãy thử trực tuyến!

Sử dụng thuật toán tương tự như Redcâu trả lời của tôi .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.