Anti-öngörülebilir bir şekilde alliteratif bir arya monte edin


15

Başlık için @ComradeSparklePony'e teşekkürler.

Bu zorluk çok basit olmalı. Size üç liste verilir.

Birincisi, başlık durumunda adların bir listesidir.

İkincisi, küçük harflerle sıfatların bir listesidir.

Üçüncüsü, küçük harflerle isimlerin bir listesidir.

Lütfen rastgele bir ad, isteğe bağlı sıfat ve isim ve çıktı seçin <Name>'s <adjective> <noun>. Ancak, her kelime aynı harfle başlamalıdır. Tüm kelimelerin bir harfle başladığını varsayabilirsiniz. Ayrıca (varsa, cevabınızı not edin):

  • bütün kelimelerin sadece alfabetik karakterlerden oluşması
  • her isim için en az bir isim olduğunu
  • her isim için en az bir isim olduğunu

Bununla birlikte, sıfat isteğe bağlı olduğundan, çıktı hala geçerli olacağından, belirli bir ad ve isim çifti için bir sıfat olduğunu varsayamazsınız.

Paylaşılan harfi eşit olarak seçmek zorunda değilsiniz, ancak kullanılabilir tüm harflerin sıfırdan oluşma şansı olmamalıdır. Bununla birlikte, belirli bir harf için tüm çıktıların, dilinizin rasgele sayı üretecinin sınırları dahilinde olabildiğince eşit olma şansına sahip olduğundan emin olmalısınız. Sıfat durumunda, bu, bu harf için diğer sıfatların tümü ile aynı şansa sahip olan "bu mektup için sıfat yok" anlamına gelen ekstra bir girişe eşdeğerdir.

Örnek giriş listeleri:

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

Bu girişler için örnek çıktılar (her satır ayrı bir örnektir):

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

Son iki örnekte kelimeler arasında fazladan boşluk olmadığına dikkat edin.

Bu , bu yüzden standart boşlukları kıran en kısa kod kazanır!

Olası bir olayda, her şeyi büyük harfle girebilirsiniz, ancak yine de cümle çıktısı almanız gerekir.


Programın geri dönmesi gerektiğini varsaymak doğru mudur: 1 isim 1 sıfat (eğer isim ile eşleşirse) 1 isim? Yoksa her isim için bir çıktı mı üretmek istiyorsunuz?
DavidC

1
Belli bir mektup için hiç bir sıfat olmayabileceğini göstermek için örneğinize belki 'Joan' ve 'jeep' eklemelisiniz?
Arnauld

Örnek girdiniz göz önüne alındığında, her 3 sıfatta 1 sıfat olmaması (tüm sıfat "listeleri" 2 uzun olduğu için)? ... eğer 'Joan' ve 'Jeep' de jamaçsız olsaydı, şans 9'da 4 olur muydu? Çıktılara karşı olasılıkları yerleştirmeye veya tüm çıktıları numaralandırmaya değer olabilir - sadece "belirli bir harf için tüm çıktılar" değil, aynı zamanda tüm farklı çıktıların eşit olasılığı olmalıdır (her liste içinde farklı değerler verilir).
Jonathan Allan

@DavidC Maalesef, ekstra örnekler eklemenin bunu belirsiz hale getirdiğini fark ediyorum; her çağrı için yalnızca bir çıktı satırı üretiyorsunuz.
Neil

1
@JonathanAllan "Joan" ve "jeep" eklemek, "Neil" ve "noun" içeren diğer seçeneklerle karşılaştırıldığında, "Neil'in isminin" çıkma olasılığını etkilemez.
Neil

Yanıtlar:


5

Jöle ,  27 25  24 bayt

Outgolfer Erik sayesinde -1 (boşluk karakteri yerine sıfır kullanın)

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

Çıkışı STDOUTt'a yazdıran Python biçimli dizeler listesi biçiminde bir argümanı kabul eden tam bir program.

Çevrimiçi deneyin!

Nasıl?

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


Ah evet, güzel :)
Jonathan Allan

5

05AB1E ,  24 23  21 bayt

Meydan okuma tarafından izin verildiği gibi, her isim için bir isim olduğunu varsayar.

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

Çevrimiçi deneyin!

açıklama

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

Oh, ¯ªve €˜akıllı! 26 baytlık bir cevabım vardı, ancak bir sıfat olmadığında çift boşluğu düzeltmekte sorun yaşıyordum ..
Kevin Cruijssen

@KevinCruijssen: Evet, benim de en çok sorun yaşadığım kısım buydu. ¯Daha sonra manuel olarak temizlemek zorunda kaldım boş dizelerle doldurmak yerine kullanabileceğimi fark ettim .
Emigna

4

R , 155 148 bayt

-7 Giuseppe (kullanarak sayesinde bayt *için 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)}

Çevrimiçi deneyin!

Reddetme örneklemesi kullanır: ilk harfler eşleşene kadar rastgele bir ad, bir sıfat (muhtemelen boş dize) ve bir isim çizin. Bu durum, ilk harflerden oluşan vektördeki benzersiz öğelerin artı boş dizenin uzunluğunun 2 olup olmadığını sayarak hesaplanır - bu, boş bir sıfat sağlar.

Ardından, sıfat boş değilse, fazladan bir boşlukla sonucu yazdırın.

Aynı harfle başlayan farklı olasılıklar sampleeşit dağılım olasılıklarına sahiptir, çünkü tekdüze dağılımdan yararlanır. Bunu görmenin en kolay yolu, adın ve ismin aynı harfle başlaması koşulunu koşullandırmaktır (ki bu iyi: eğer yapmazlarsa reddederiz). Şimdi kabul ettiğimiz şarta bağlı olarak: bu, boş sıfat veya aynı harfle başlayan bir sıfat çizdiğimiz anlamına gelir. Bu olasılıkların her birinin hala eşit olasılığı vardır.

105


Bu, herhangi bir ilk harf için birbirine sıfat boş bir şansı var mı?
Nick Kennedy

@NickKennedy Evet, sampleüniform dağılımdan çekildiğinden . Bunu görmenin en kolay yolu, adın ve ismin aynı harfle başlaması koşulunu koşullandırmaktır (ki bu iyi: eğer yapmazlarsa reddederiz). Şimdi kabul ettiğimiz şarta bağlı olarak: bu, boş sıfat veya aynı harfle başlayan bir sıfat çizdiğimiz anlamına gelir. Bu olasılıkların her birinin hala eşit olasılığı vardır.
Robin Ryder

teşekkürler, iyi açıkladı.
Nick Kennedy

@NickKennedy Teşekkürler, olasılıkların eşit olduğunu ampirik olarak doğrulamak için bir bağlantı ile birlikte bu açıklamayı gönderiye ekleyeceğim.
Robin Ryder


3

JavaScript (ES6),  139 124 122  120 bayt

@Neil sayesinde 2 bayt tasarruf edin

Girişi alır (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)

Çevrimiçi deneyin!

Veya dağıtımı 5 milyon çekilişte kontrol edin

Nasıl?

g

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

gs

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

Daha sonra, tüm başlangıç ​​harflerinin aşağıdaki normal ifadeyle aynı olup olmadığını kontrol ederiz:

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

s


+[(o=g([,...a]))&&o+' ']+2 bayt kurtardı sanırım?
Neil

@Neil Ah, evet. Güzel.
Arnauld

3

Python 3 , 161156155141414514 bayt

( Teşekkürler ArBo, EmbodimentOfIgnorance, ilk golfüme 2, 3 ve 4 bayt katkıda bulunan Neil! )

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)

Çevrimiçi deneyin! (500 bin yürütme ile)

  • Üç listeyi girdi olarak alır.

  • Her ad için en az bir isim olduğunu varsayar.


Aynı skor, daha fazla golf-y:

Python 3 , 145 bayt

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

Çevrimiçi deneyin! (500 bin yürütme ile)

Sondaki boşluklara izin verilirse sadece 140'tır (kare yüzü kaldırarak [:-1])


1
Güzel ilk cevap! İlk while döngüsünde bir byte kaydedebilirsiniz: while t>""<t[0]!=w. Son satırı , üçüncü satıra print(s+"'s",t+(t and" ")+o)girerek de değiştirebilirsiniz u=.
ArBo

Çözümümü değiştirdim, çünkü önceki şartlara uymadı
Nicola Sap

1
152 bayt (Altbilgi, yorumda URL'ye uyacak şekilde kaldırıldı)
Cehalet

1
Değişkeni yalnızca bir tkez kullanıyorsunuz, böylece kodu satır içine alarak 4 bayt kaydedebilirsiniz. Ben obenzer bir kod deseni kullanmak için geçiş yapabilir tve daha sonra da inlining başka bir 4 bayt kaydedebilirsiniz düşünüyorum.
Neil

Teşekkürler, siz gerçekten yardım ediyorsunuz! @Neil, yeniden düzenleme yapamadım o: Buna ulaşıyorum: 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 ) ama şartlı boşluk ekleyerek isteğe bağlı bir argümanla ybana 11 bayt maliyeti
Nicola Sap

0

Jöle , 28 bayt

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

Çevrimiçi deneyin!

@ JonathanAllan'ın daha kısa cevabını görmeden önce yazdım, ancak farklı bir yaklaşım kullandığından göndermeye değer olduğunu düşündüm. @ EriktheOutgolfer'ın bu cevaba ilişkin önerisiyle 3 bayt kaydedildi.

Dizelerin listelerini içeren ve rasgele seçilen bir alliterasyonun dolaylı olarak yazdırıldığı tam bir program. Her isim için en az bir isim olduğunu varsayar.


0

C # (Görsel C # Etkileşimli Derleyici) , 176 bayt

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

Çevrimiçi deneyin!


İsimlerin büyük harfle başladığını varsayabilirsiniz, böylece karşılaştırma için diğer harfleri büyük harfle yazabilirsiniz, bu da sizi 10 bayt kurtarır?
Neil

@Neil Yep, tam olarak 10 bayt :)
Cehalet

0

Kırmızı , 179 bayt

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

Çevrimiçi deneyin!

Açıklama:

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 bayt

-28 StdIn'i kabul etmesi gerektiğini düşündüğüm için, şimdi bir işlev

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

Çevrimiçi deneyin!

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
}


0

Simge , 167 163 bayt

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

Çevrimiçi deneyin!

Cevabımla aynı algoritmayı kullanır Red.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.