대안 적 아리아를 자동으로 예측 방지


15

제목에 대한 @ComradeSparklePony에게 감사합니다.

이 도전은 매우 간단해야합니다. 세 가지 목록이 제공됩니다.

첫 번째는 제목의 경우 이름 목록입니다.

두 번째는 소문자의 형용사 목록입니다.

세 번째는 소문자로 된 명사 목록입니다.

이름, 선택적 형용사, 명사 및 출력을 임의로 선택하십시오 <Name>'s <adjective> <noun>. 그러나 각 단어는 같은 문자로 시작해야합니다. 모든 단어가 문자로 시작한다고 가정 할 수 있습니다. 당신은 또한 가정 할 수 있습니다 (그렇다면 대답에주의하십시오).

  • 모든 단어는 알파벳 문자로만 구성됩니다
  • 각 이름에 대해 하나 이상의 명사가 있음
  • 명사마다 하나 이상의 이름이 있음

그러나 형용사가 선택 사항이므로 출력이 여전히 유효하기 때문에 특정 쌍의 이름과 명사에 형용사가 존재한다고 가정 할 수 없습니다.

사용 가능한 모든 문자가 0이 아닌 확률을 가져야하지만 공유 문자를 균일하게 선택할 필요는 없습니다. 그러나 주어진 문자에 대한 모든 출력이 언어의 난수 생성기의 한계 내에서 가능한 한 똑같이 발생할 가능성이 있는지 확인해야합니다. 형용사의 경우, 이것은이 편지에 대한 다른 형용사와 같은 기회를 갖는 "이 편지에 대한 형용사 없음"을 의미하는 추가 항목을 갖는 것과 동등합니다.

입력 목록 예 :

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 name 1 형용사 (이름과 일치하는 경우) 1 명사? 아니면 각 이름에 대한 출력을 요구합니까?
DavidC

1
주어진 편지에 대해 형용사가 전혀 없다는 사실을 설명하기 위해 예에서 'Joan'과 'jeep'를 추가해야합니까?
Arnauld

예를 들어 입력이 3에 형용사 1이 없을 가능성이 있다고 가정합니다 (모든 형용사 "목록"이 2 개이므로)? ... 'Joan'과 'Jeep'이 j형용사 없이도 있었다면 9에서 4가 될 확률은? 출력에 대해 확률을 두거나 모든 출력을 열거 할 가치가 있습니다. "주어진 문자에 대한 모든 출력 ..."뿐만 아니라 모든 고유 출력도 같은 가능성을 가져야합니다 (각 목록 내에서 고유 한 값을 부여해야 함).
Jonathan Allan

@DavidC 죄송합니다. 추가 예제를 추가하면 불분명합니다. 각 호출에 대해 한 줄의 출력 만 생성합니다.
Neil

1
@JonathanAllan "Joan"및 "jeep"를 추가해도 "Neil"및 "noun"을 포함하는 다른 옵션과 비교할 때 "Neil 's noun"이 출력 될 가능성에는 영향을 미치지 않습니다.
Neil

답변:


5

젤리 ,  27 25  24 바이트

Outgolfer Erik 덕분에 -1 (공백 문자 대신 0 사용)

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

출력을 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


Ah yeah, nice :)
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 주세페에 (사용 덕분에 바이트 *를 들어 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

자바 스크립트 (ES6)  139 124 122  120 바이트

@Neil 덕분에 2 바이트 절약

로 입력을 (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 = g(N) + "'s " +
    [(o = g([, ...a])) && o + ' '] +
    g(n)

그런 다음 모든 초기 문자가 다음 정규식과 동일한 지 확인합니다.

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

에스


+[(o=g([,...a]))&&o+' ']+2 바이트를 절약합니다.
Neil

@ 닐 아, 예. 좋은데
Arnauld

3

파이썬 3 , 161154151147145 바이트

( 내 첫 골프 2, 3, 4 바이트 기여 덕분에 ARBÖ, EmbodimentOfIgnorance, 닐! )

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 실행)

  • 세 개의 목록을 입력으로 사용합니다.

  • 각 이름에 대해 하나 이상의 명사를 가정합니다.


같은 점수, 더 많은 골프 -y :

파이썬 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 실행)

후행 공백이 허용되면 (정사각형을 제거하여 [:-1]) 140입니다.


1
좋은 첫 답변! 첫 번째 while 루프에서 바이트를 저장할 수 있습니다 while t>""<t[0]!=w. 세 번째 줄 print(s+"'s",t+(t and" ")+o)에서을 삭제하여 마지막 줄을 바꿀 수도 있습니다 u=.
ArBo

이전은 요구 사항에 맞지 않기 때문에 솔루션을 변경하게되었습니다.
Nicola Sap

1
152 바이트 (댓글에 URL을 맞추기 위해 바닥 글 제거)
무지의 구현 18.08의

1
변수를 t한 번만 사용하므로 코드를 인라인하여 4 바이트를 절약 할 수 있습니다. o비슷한 코드 패턴을 사용하도록 전환 t한 다음 인라인으로 다른 4 바이트를 절약 할 수 있다고 생각합니다 .
Neil

고마워, 너희들이 정말로 돕고있다! @Neil, 나는 리팩토링 할 수 없었습니다 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 ) 그러나 선택적 인수를 통해 조건부 공백을 추가하면 y11 바이트가 필요합니다.
Nicola Sap

0

젤리 , 28 바이트

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

온라인으로 사용해보십시오!

@JonathanAllan의 짧은 대답을보기 전에 이것을 썼지 만 다른 접근법을 사용하기 때문에 게시 할 가치가 있다고 생각했습니다. 해당 답변에 대한 @EriktheOutgolfer의 제안으로 3 바이트를 절약했습니다.

문자열 목록의 목록을 가져와 임의로 선택된 alliteration을 암시 적으로 인쇄하는 전체 프로그램. 이름 당 하나 이상의 명사를 가정합니다.


0

C # (Visual C # 대화식 컴파일러) 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

온라인으로 사용해보십시오!

언 골프 드 :

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.