Pon el sombrero en el gato

15

Inspirado en el próximo evento de fiesta de invierno

Objetivo

Añadir un sombrero ^, ´o `de una sola vocal en cada palabra de la entrada.

Reglas

  • El haty el voweldeben ser elegidos al azar. Cada sombrero debe aparecer con la misma probabilidad (33%) y las vocales deben tener la misma probabilidad dentro de las vocales válidas en la palabra (si la palabra tiene 2 vocales válidas, cada una debe ser elegida en un 50%), o la más cercana que tiene tu idioma
  • Solo AEIOUaeiouse consideran vocales (lo siento y)
  • Las vocales con sombreros en la entrada NO interfieren con las reglas (puede considerarlo como una consonante)
  • Si la entrada no tiene vocal, no se modificará
  • La capitalización debe ser preservada.

Ejemplos

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

Victorioso

Este es el por lo que gana el código más corto

varilla
fuente
"al azar (o lo más cercano que tenga su idioma)", entonces si mi idioma no tiene comandos aleatorios, ¿puedo hacer algo determinista?
Fatalize
@LuisMendo mejor?
Rod
@Fatalize ni siquiera al get the current timeazar?
Rod
@ Rod No tengo ningún idioma en mente. Solo digo que tienes que imponer que es aleatorio (y qué tipo de aleatorio) de lo contrario no tiene ningún sentido.
Fatalize
Las especificaciones dicen que tenemos que agregar ^ ´ o retroceso, pero el ejemplo tschuss muestra una diéresis. ¿Se requieren o no diéresis?
Level River St

Respuestas:

1

Perl 6 , 101 bytes

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

Intentalo

Expandido:

~      # 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
fuente
2

C #, 273 267 bytes

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

demo de repl.it

Realmente siento que estoy haciendo trampa, ya que todavía agrego sombreros a las vocales ya acentuadas creadas combinando caracteres . Si eso no es aceptable, avíseme para que pueda agregar códigos repetitivos y declare que esta respuesta no es competitiva.

Esto agrega un carácter aleatorio entre U + 0300 o U + 0301 o U + 0302 , después de una vocal aleatoria de cada palabra de entrada (si existe).

Sin golf (solo cuerpo 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]));
Enlace Ng
fuente
1

Mathematica, 226 bytes

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

Función sin nombre que toma una lista de caracteres como entrada y devuelve una lista de caracteres. Versión más fácil de leer, también un poco descuidada:

 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 línea 13 divide la entrada en palabras (sublistas de caracteres) en todos los espacios; cada palabra es operada por la función definida por las líneas 4-12, y los resultados se unieron nuevamente en una sola lista por la línea 3.

La línea 4 establece pla lista de índices que indican qué caracteres de la palabra wson vocales. Si hay vocales (línea 5), ​​hacemos una elección aleatoria de uno de esos índices i(línea 6) y luego restablecemos ese carácter único de la palabra a un nuevo carácter (líneas 7-10). Finalmente sacamos la palabra (posiblemente modificada) w.

Para seleccionar el nuevo carácter, encontramos dónde se encuentra la vocal a reemplazar en la cadena vy elegimos el código de carácter correspondiente a. Pero para seleccionar aleatoriamente los tres sombreros, tomamos ese código y agregamos un número entero aleatorio entre 0 y 2 (línea 9) antes de volver a convertirlo en un carácter. (Afortunadamente, todas las vocales anuladas vienen en tríos consecutivos de códigos de caracteres UTF-8).

Greg Martin
fuente
1

Python 3, 170 bytes

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

Sin 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
fuente
1
No necesita el espacio entre importy *.
Sr. Xcoder
j+1 forpuede ser j+1for.
Jonathan Frech