Coloque o chapéu no gato


15

Inspirado no próximo evento de inverno

Objetivo

Adicionar um chapéu ^, ´ou `a uma única vogal em cada palavra de entrada.

Regras

  • O hate ovowel devem ser escolhidos aleatoriamente. Cada chapéu deve aparecer com a mesma probabilidade (33%) e as vogais devem ter a mesma probabilidade nas vogais válidas da palavra (se a palavra possuir 2 vogais válidas, cada uma deve ter 50% de probabilidade de ser escolhida) - ou a mais próxima que seu idioma tem.
  • Somente AEIOUaeiousão consideradas vogais (desculpe y)
  • Vogais com chapéus na entrada NÃO interferem nas regras (você pode considerá-lo uma consoante)
  • Se a entrada não tiver vogal, não será modificada
  • A capitalização deve ser preservada.

Exemplos

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

Ganhando

Isso é então o código mais curto vence


"aleatoriamente (ou o mais próximo que seu idioma possui)", portanto, se meu idioma não possui comandos aleatórios, posso fazer algo determinístico ???
Fatalize

@LuisMendo melhor?
Rod

@Fatalize nem mesmo get the current timealeatório?
Rod

@ Rod Eu não tenho nenhum idioma em mente. Só estou dizendo que você deve impor que seja aleatório (e que tipo de aleatório), caso contrário não faz sentido algum.
Fatalize

As especificações dizem que precisamos adicionar ^ ´ ou backtick, mas o exemplo tschuss mostra um trema. Os trema são necessários ou não?
Level River St

Respostas:


1

Perl 6 , 101 bytes

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

Tente

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
}

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 repl.it

Eu realmente sinto que estou trapaceando, pois ainda adiciono chapéus às vogais já acentuadas criadas pela combinação de personagens . Se isso não for aceitável, informe-me para que eu possa adicionar códigos padrão, declarando esta resposta como não concorrente.

Essa coisa adiciona um caractere aleatório entre U + 0300 ou U + 0301 ou U + 0302 , após uma vogal aleatória de cada palavra de entrada (se houver).

Ungolfed (apenas corpo 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]));

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

Função sem nome, recebendo uma lista de caracteres como entrada e retornando uma lista de caracteres. Versão mais fácil de ler, também levemente destruída:

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

A linha 13 divide a entrada em palavras (sublistas de caracteres) em todos os espaços; cada palavra é operada pela função definida pelas linhas 4-12 e os resultados são reunidos novamente em uma única lista pela linha 3.

A linha 4 define pa lista de índices indicando quais caracteres da palavra wsão vogais. Se houver vogais (linha 5), ​​escolhemos aleatoriamente um desses índicesi (linha 6) e, em seguida, redefinimos esse caractere único da palavra para um novo caractere (linhas 7-10). Finalmente, emitimos a palavra (possivelmente modificada)w .

Para selecionar o novo caractere, descobrimos onde a vogal a ser substituída fica na string ve escolhe o código de caractere correspondente a. Mas, para selecionar aleatoriamente os três chapéus, pegamos esse código e adicionamos um número inteiro aleatório entre 0 e 2 (linha 9) antes de converter novamente em um caractere. (Felizmente, todas as vogais contidas vêm em trios consecutivos de códigos de caracteres UTF-8.)


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

Ungolfed:

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
Você não precisa do espaço entre importe *.
Mr. Xcoder

j+1 forpode ser j+1for.
Jonathan Frech
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.