Włóż kapelusz do kota

15

Zainspirowany nadchodzącym wydarzeniem Winter Bash

Objetive

Dodaj kapelusz ^, ´albo `do jednej samogłoski w każdym słowie wejścia.

Zasady

  • hatI vowelmuszą zostać wybrane w sposób losowy. Każdy kapelusz musi pojawić się z takim samym prawdopodobieństwem (33%), a samogłoski muszą mieć takie samo prawdopodobieństwo w prawidłowych samogłoskach w słowie (jeśli słowo ma 2 prawidłowe samogłoski, każde musi mieć 50% prawdopodobieństwa wyboru) - lub najbliższe w twoim języku.
  • Tylko AEIOUaeiousą uważane samogłoski (przepraszam y)
  • Samogłoski z czapkami na wejściu NIE kolidują z regułami (można to traktować jako spółgłoskę)
  • Jeśli dane wejściowe nie mają samogłoski, nie zostaną zmodyfikowane
  • Wielkie litery muszą być zachowane.

Przykłady

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

Zwycięski

To jest więc wygrywa najkrótszy kod

Pręt
źródło
„losowo (lub najbliżej twojego języka)”, więc jeśli mój język nie ma losowych poleceń, mogę po prostu zrobić coś deterministycznego?
Fatalize
@LuisMendo lepiej?
Rod
@Fatalize nawet nie get the current timelosowy?
Rod
@Rod Nie mam na myśli żadnego języka. Mówię tylko, że musisz narzucić, że jest losowy (i jaki losowy), inaczej nie ma to żadnego sensu.
Fatalize
Specyfikacje mówią, że musimy dodać ^ ´ lub backtick, ale przykład tschuss pokazuje umlaut. Czy wymagane są umlauty?
Level River St

Odpowiedzi:

1

Perl 6 , 101 bajtów

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

Spróbuj

Rozszerzony:

~      # 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
}
Brad Gilbert b2gills
źródło
2

C #, 273 267 bajtów

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 demo

Naprawdę czuję, że oszukuję, ponieważ wciąż dodam czapki do już akcentowanych samogłosek utworzonych przez łączenie postaci . Jeśli jest to nie do przyjęcia, daj mi znać, abym mógł dodać kody z podstawowymi deklaracjami , że ta odpowiedź nie jest konkurencyjna.

Ta rzecz dodaje losowy znak spośród U + 0300 lub U + 0301 lub U + 0302 , po losowej samogłosce każdego słowa wejściowego (jeśli istnieje).

Niegolfowany (tylko ciało lambda)

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]));
Link nr
źródło
1

Mathematica, 226 bajtów

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~" "&])&

Funkcja bez nazwy, która przyjmuje listę znaków jako dane wejściowe i zwraca listę znaków. Wersja łatwiejsza do odczytania, również nieznacznie ulepszona:

 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}, " "] &] &

Wiersz 13 dzieli dane wejściowe na słowa (listy znaków) na wszystkich spacjach; każde słowo jest obsługiwane przez funkcję zdefiniowaną w wierszach 4-12, a wyniki ponownie łączą się w jedną listę w wierszu 3.

Wiersz 4 ustawia plistę indeksów wskazujących, które znaki słowa wto samogłoski. Jeśli są jakieś samogłoski (linia 5), ​​dokonujemy losowego wyboru jednego z takich indeksów i(linia 6), a następnie resetujemy ten pojedynczy znak słowa na nowy znak (linie 7-10). Na koniec wyprowadzamy (ewentualnie zmodyfikowane) słowo w.

Aby wybrać nowy znak, znajdujemy, gdzie samogłoska, która ma zostać zastąpiona, znajduje się w ciągu vi wybieramy odpowiedni kod znaku a. Aby jednak losowo wybrać trzy czapki, bierzemy ten kod i dodajemy losową liczbę całkowitą z przedziału od 0 do 2 (wiersz 9) przed powrotem do postaci. (Na szczęście wszystkie zachowane samogłoski występują w trzech kolejnych kodach znaków UTF-8).

Greg Martin
źródło
1

Python 3, 170 bajtów

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

Nie golfowany:

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
                             ]))
Alex Hall
źródło
1
Nie potrzebujesz odstępu między importi *.
Pan Xcoder
j+1 formoże być j+1for.
Jonathan Frech