Mettez le chapeau dans le chat

15

Inspiré par le prochain événement bash d'hiver

Objectif

Ajouter un chapeau ^, ´ou `à une seule voyelle dans chaque mot de l'entrée.

Règles

  • Le hatet le voweldoivent être choisis au hasard. Chaque chapeau doit apparaître avec la même probabilité (33%) et les voyelles doivent avoir la même probabilité dans les voyelles valides du mot (si le mot a 2 voyelles valides, chacune doit avoir 50% de chances d'être choisie) - ou la plus proche que votre langue a.
  • Seules AEIOUaeiousont considérées comme des voyelles (désolé y)
  • Les voyelles avec des chapeaux en entrée n'interfèrent pas avec les règles (vous pouvez le considérer comme une consonne)
  • Si l'entrée n'a pas de voyelle, elle ne sera pas modifiée
  • La capitalisation doit être préservée.

Exemples

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

Gagnant

C'est du donc le code le plus court l'emporte

Barre
la source
"au hasard (ou le plus proche de votre langue)" donc si ma langue n'a pas de commandes aléatoires, je peux juste faire quelque chose de déterministe ???
Fatalize
@LuisMendo mieux?
Rod
@Fatalize même pas get the current timealéatoire?
Rod
@Rod Je n'ai aucune langue en tête. Je dis juste que vous devez imposer que c'est aléatoire (et quel genre d'aléatoire) sinon cela n'a aucun sens.
Fatalize
Les spécifications disent que nous devons ajouter ^ ´ ou backtick, mais l'exemple tschuss montre un tréma. Des trémas sont-ils nécessaires ou non?
Level River St

Réponses:

1

Perl 6 , 101 octets

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

Essayez-le

Étendu:

~      # 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
la source
2

C #, 273 267 octets

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

démo repl.it

J'ai vraiment l'impression de tricher, car j'ajoute toujours des chapeaux à des voyelles déjà accentuées créées en combinant des caractères . Si ce n'est pas acceptable, faites-le moi savoir afin que je puisse ajouter des codes passe-partout déclarer cette réponse non concurrente.

Cette chose ajoute un caractère aléatoire parmi U + 0300 ou U + 0301 ou U + 0302 , après une voyelle aléatoire de chaque mot d'entrée (le cas échéant).

Non golfé (corps lambda uniquement)

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 Ng
la source
1

Mathematica, 226 octets

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

Fonction sans nom prenant une liste de caractères en entrée et renvoyant une liste de caractères. Version plus facile à lire, légèrement non golfée également:

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

La ligne 13 divise l'entrée en mots (sous-listes de caractères) dans tous les espaces; chaque mot est opéré par la fonction définie par les lignes 4-12, et les résultats sont à nouveau réunis dans une seule liste par la ligne 3.

La ligne 4 définit pla liste des indices indiquant quels caractères du mot wsont des voyelles. S'il y a des voyelles (ligne 5), nous faisons un choix aléatoire d'un de ces indexi (ligne 6), puis réinitialisons ce caractère unique du mot avec un nouveau caractère (lignes 7-10). Enfin, nous sortons le mot (éventuellement modifié) w.

Pour sélectionner le nouveau caractère, nous trouvons où se trouve la voyelle à remplacer dans la chaîne vet choisissons le code de caractère correspondant a. Mais pour sélectionner aléatoirement les trois chapeaux, nous prenons ce code et ajoutons un entier aléatoire entre 0 et 2 (ligne 9) avant de reconvertir en caractère. (Heureusement, les voyelles béantes viennent toutes en trios consécutifs de codes de caractères UTF-8.)

Greg Martin
la source
1

Python 3, 170 octets

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

Non golfé:

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
la source
1
Vous n'avez pas besoin de l'espace entre importet *.
M. Xcoder
j+1 forpeut être j+1for.
Jonathan Frech