고양이에 모자를 넣어


15

다가오는 겨울 bash 이벤트에서 영감을 얻었습니다.

오브제 티브

모자를 추가 ^, ´또는 `입력의 각 단어에서 하나의 모음이다.

규칙

  • hat와는 vowel무작위로 선택해야합니다. 각 모자는 같은 확률 (33 %)로 나타나야하고 모음은 단어의 유효한 모음 내에서 같은 확률을 가져야합니다 (단, 단어에 유효한 모음이 2 개있는 경우 각각 50 %를 선택해야합니다). 당신의 언어가 가지고 있습니다.
  • AEIOUaeiou모음으로 만 간주됩니다 (죄송합니다 y)
  • 입력에 모자가있는 모음은 규칙을 방해하지 않습니다 (자음으로 간주 할 수 있음)
  • 입력에 모음이 없으면 수정되지 않습니다
  • 대문자를 유지해야합니다.

winter> wintér
bash> bâsh
rhythm> rhythm
rng ftw> rng ftw
cat in the hat> cât ìn thê hát
dès> dès
tschüss> tschüss
principî> prìncipî
PROGRAMMING PUZZLES & code golf>PROGRÂMMING PÚZZLES & codé gòlf

승리

이것은 이므로 가장 짧은 코드가 승리합니다.


"무작위로 (또는 귀하의 언어와 가장 가까운)"그래서 내 언어에 임의의 명령이 없으면 결정적인 것을 할 수 있습니까 ???
Fatalize

@LuisMendo 더 나은?
Rod

@Fatalize도 get the current time무작위가 아닙니까?
Rod

@로드 나는 마음에 언어가 없습니다. 나는 당신이 그것이 무작위 (그리고 어떤 종류의 임의의 것)라는 것을 강요해야한다고 말하고 있습니다. 그렇지 않으면 전혀 의미가 없습니다.
Fatalize

스펙은 ^ 또는 백틱을 추가해야하지만 tschuss 예제는 움라우트를 보여줍니다. 움라우트는 필수입니까?
Level River St

답변:


1

펄 6 , 101 바이트

~*.words.map: {(my$p=m:ex:i/<[aeiou]>/».to.pick)~~Mu:D??~S/.**{$p}<(/{("\x300".."\x302").pick}/!!$_}

시도 해봐

넓히는:

~      # stringify (join with spaces)
*\     # Whatever lambda (input parameter)
.words # split into words

.map:  # for each word

{ # bare block lambda with implicit parameter 「$_」
  (

    my $p =

    m
    :exhaustive               # all possible matches
    :ignorecase
    /<[aeiou]>/\              # match a vowel

    ».to.pick                 # pick one of the positions

  ) ~~ Mu:D                   # is it defined ( shorter than 「.defined」 )

  ??                          # if 「$p」 is defined

    ~                         # stringify

    S/
      . ** {$p}               # match 「$p」 positions

      <(                      # ignore them
    /{
      ("\x300".."\x302").pick # pick one of the "hats" to add
    }/


  !!                          # if 「$p」 is not defined    
    $_                        # return the word unchanged
}

2

C #, 227367 바이트

using System.Linq;A=s=>{var r=new System.Random();var a=s.Split(' ');return string.Join(" ",a.Select(w=>w.Select((c,i)=>"AEIOUaeiou".Any(d=>c==d)?i:-1).Where(x=>x>=0).ToList()).Select((l,i)=>l.Any()?a[i].Insert(l[r.Next(l.Count)]+1,""+(char)r.Next(768,771)):a[i]));};

repl.it 데모

나는 문자결합하여 만든 이미 강조된 모음에 여전히 모자를 추가하기 때문에 속이는 느낌이 듭니다 . 그것이 허용되지 않는 경우, 상용구 코드를 추가 하여이 대답을 비 경쟁이라고 선언 할 수 있도록 알려주십시오 .

이 것은 각 입력 단어 (있는 경우)의 임의의 모음 뒤에 U + 0300 또는 U + 0301 또는 U + 0302 사이에 임의의 문자를 추가합니다 .

언 골프 (람다 본체 만 해당)

var r=new System.Random();
// Split sentence to array of words
var a=s.Split(' ');
// Join the (hat-ed) words back to sentence
return string.Join(
    " ",
    // Select an IEnum of list of integers indicating the positions of vowels
    a.Select(w=>
        w.Select((c,i)=>
            // If it's vowel, return position (>=0), else return -1
            "AEIOUaeiou".Any(d=>c==d)?i:-1
        // Filter vowels only
        ).Where(x=>x>=0)
        .ToList()
    // Convert each list of integers to hat-ed words
    ).Select((l,i)=>
        l.Any()
            // Insert "something" into the word...
            ?a[i].Insert(
                // ...at the position after a random vowel in that word...
                l[r.Next(l.Count)]+1,
                // "something" is a random integer in [0x0300, 0x0303), then casted to UTF16 i.e. [U+0300, U+0302]
                ""+(char)r.Next(768,771))
            // List is empty => just return original word
            :a[i]));

1

수학, 226 바이트

Join@@((p=Position[w=#,Alternatives@@(v=Characters@"aeiouAEIOU")];If[p!={},i=#&@@RandomChoice@p;w[[i]]=FromCharacterCode[ToCharacterCode["àèìòùÀÈÌÒÙ"][[#&@@Position[v,w[[i]]]]]+RandomInteger@2]];w)&/@Split[#,{##}~FreeQ~" "&])&

이름없는 함수를 문자 목록을 입력으로 받아서 문자 목록을 반환합니다. 읽기 쉬운 버전, 약간 압축되지 않은 버전 :

 1  v = Characters["aeiouAEIOU"];
 2  a = ToCharacterCode["àèìòùÀÈÌÒÙ"];
 3  Join @@ (
 4    (p = Position[w = #, Alternatives @@ v]; 
 5      If[p != {},
 6        i = First[RandomChoice[p]]; 
 7        w[[i]] =
 8          FromCharacterCode[
 9            a[[ First[ Position[ v, w[[i]] ] ] ]] + RandomInteger[2]
10          ]
11        ]; w
12    ) &
13  ) /@ Split[#1, FreeQ[{##1}, " "] &] &

13 행은 입력을 모든 공백에서 단어 (문자의 서브리스트)로 나눕니다. 각 단어는 4-12 행으로 정의 된 기능에 의해 작동되며, 결과는 3 행으로 단일 목록으로 다시 결합됩니다.

4 행 p은 단어의 어느 문자 w가 모음 인지 나타내는 색인 목록으로 설정 됩니다 . 모음이있는 경우 (5 행), 하나의 색인 i(6 행)을 임의로 선택한 다음 단어의 단일 문자를 새 문자 (7-10 행)로 재설정합니다. 마지막으로 (수정 된) 단어를 출력합니다 w.

새 문자를 선택하기 위해 교체 할 모음이 문자열에서 어디에 있는지 찾아 v해당 문자 코드를 선택합니다 a. 그러나 3 개의 모자를 무작위로 선택하려면 해당 코드를 사용하여 문자로 다시 변환하기 전에 0에서 2 사이의 임의의 정수 (9 행)를 추가하십시오. (다행히도, 싫어하는 모음은 모두 UTF-8 문자 코드의 연속 트리오로 제공됩니다.)


1

파이썬 3, 170 바이트

from random import *
c=choice
print(' '.join([w,w[:i]+c('̀́̂')+w[i:]][i>0]for w in input().split()for i in[c([j+1 for j,x in enumerate(w)if x in 'aeiouAEIOU']or[0])]))

언 골프 드 :

from random import choice
print(' '.join([
                   w,  # Don't modify the word if no vowels were found

                   w[:i] + choice('̀́̂') + w[i:]
               ][i > 0]
               for w in input().split()
                   for i in [choice([j + 1 for j, x in enumerate(w) if x in 'aeiouAEIOU']
                                    or [0])  # choice requires a non-empty sequence
                             ]))

1
import와 사이에 공백이 필요하지 않습니다 *.
Mr. Xcoder

j+1 for일 수 있습니다 j+1for.
Jonathan Frech
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.