Metti il ​​cappello nel gatto


15

Ispirato al prossimo evento invernale di bash

scopo principale

Aggiungere un cappello ^, ´o `ad una sola vocale in ogni parola dell'ingresso.

Regole

  • Il hate il voweldevono essere scelti a caso. Ogni cappello deve apparire con la stessa probabilità (33%) e le vocali devono avere la stessa probabilità all'interno delle vocali valide nella parola (se la parola ha 2 vocali valide, ciascuna deve avere il 50% di probabilità di essere scelta) - o la più vicina che ha la tua lingua.
  • Sono AEIOUaeiouconsiderate solo vocali (scusate y)
  • Le vocali con cappelli nell'input NON interferiscono con le regole (puoi considerarla come una consonante)
  • Se l'input non ha vocale, non verrà modificato
  • Le maiuscole devono essere preservate.

Esempi

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

vincente

Questo è quindi vince il codice più corto


"a caso (o il più vicino alla tua lingua)", quindi se la mia lingua non ha comandi casuali, posso semplicemente fare qualcosa di deterministico ???
Fatalizza il

@LuisMendo meglio?
Rod

@Fatalize nemmeno get the current timecasuale?
Rod

@Rod Non ho in mente nessuna lingua. Sto solo dicendo che devi imporre che sia casuale (e che tipo di casuale), altrimenti non ha alcun senso.
Fatalizza il

Le specifiche dicono che dobbiamo aggiungere ^ ´ o backtick, ma l'esempio tschuss mostra un umlaut. Le umlaut sono obbligatorie o no?
Level River St,

Risposte:


1

Perl 6 , 101 byte

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

Provalo

Allargato:

~      # 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 byte

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

Mi sento davvero come se stessi barando, poiché continuo ad aggiungere cappelli a vocali già accentate create combinando personaggi . Se ciò non è accettabile, fammi sapere in modo da poter aggiungere i codici di targa di caldaia dichiarare questa risposta non competitiva.

Questa cosa aggiunge un carattere casuale tra U + 0300 o U + 0301 o U + 0302 , dopo una vocale casuale di ogni parola di input (se presente).

Ungolfed (solo 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 byte

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

Funzione senza nome che prende un elenco di caratteri come input e restituisce un elenco di caratteri. Versione più facile da leggere, anche leggermente ungolf:

 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 riga 13 divide l'input in parole (elenchi di caratteri) in tutti gli spazi; ogni parola è gestita dalla funzione definita dalle righe 4-12 e i risultati si sono riuniti di nuovo insieme in un unico elenco dalla riga 3.

La riga 4 indica pl'elenco di indici che indica quali caratteri della parola wsono vocali. Se ci sono vocali (riga 5), ​​facciamo una scelta casuale di uno di questi indici i(riga 6) e quindi reimpostiamo quel singolo carattere della parola su un nuovo carattere (righe 7-10). Alla fine abbiamo prodotto la parola (eventualmente modificata) w.

Per selezionare il nuovo carattere, troviamo dove si trova la vocale da sostituire nella stringa ve scegliamo il codice carattere corrispondente a. Ma per selezionare casualmente i tre cappelli, prendiamo quel codice e aggiungiamo un numero intero casuale compreso tra 0 e 2 (riga 9) prima di riconvertire in un carattere. (Fortunatamente le vocali incantate arrivano tutte in trii consecutivi di codici di caratteri UTF-8.)


1

Python 3, 170 byte

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
Non è necessario lo spazio tra importe *.
Mr. Xcoder,

j+1 forpuò essere j+1for.
Jonathan Frech,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.