Stecke den Hut in die Katze

15

Inspiriert von der bevorstehenden Winterveranstaltung

Ziel

Fügen Sie einen Hut ^, ´oder `auf einen einzigen Vokal in jedem Wort des Eingangs.

Regeln

  • Das hatund das vowelmüssen zufällig ausgewählt werden. Jeder Hut muss mit der gleichen Wahrscheinlichkeit erscheinen (33%) und die Vokale müssen die gleiche Wahrscheinlichkeit innerhalb der gültigen Vokale im Wort haben (wenn das Wort 2 gültige Vokale hat, muss jedes mit einer Wahrscheinlichkeit von 50% gewählt werden) - oder dem nächsten dass deine Sprache hat.
  • Nur AEIOUaeiougelten als Vokale (sorry y)
  • Vokale mit Hüten in der Eingabe beeinträchtigen NICHT die Regeln (Sie können sie als Konsonanten betrachten)
  • Wenn die Eingabe keinen Vokal hat, wird sie nicht geändert
  • Die Kapitalisierung muss erhalten bleiben.

Beispiele

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

Gewinnen

Das ist also gewinnt der kürzeste Code

Stange
quelle
"nach dem Zufallsprinzip (oder am nächsten an Ihrer Sprache)" Wenn meine Sprache also keine zufälligen Befehle enthält, kann ich einfach etwas Deterministisches tun ???
Fatalize
@ LuisMendo besser?
Rod
@Fatalize nicht mal get the current timezufällig?
Rod
@ Rod Ich habe keine Sprache im Sinn. Ich sage nur, dass Sie auferlegen müssen, dass es zufällig ist (und welche Art von Zufall), sonst macht es überhaupt keinen Sinn.
Fatalize
Die Angaben sagen, wir müssen ^ ´ oder backtick hinzufügen, aber das Beispiel tschuss zeigt einen Umlaut. Sind Umlaute erforderlich oder nicht?
Level River St

Antworten:

1

Perl 6 , 101 Bytes

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

Versuch es

Erweitert:

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

Repl.it Demo

Ich habe wirklich das Gefühl, dass ich betrüge, da ich immer noch Hüte zu bereits akzentuierten Vokalen hinzufüge, die durch das Kombinieren von Zeichen erstellt wurden . Wenn dies nicht akzeptabel ist, lassen Sie es mich wissen, damit ich Boilerplate-Codes hinzufügen kann, um diese Antwort für nicht konkurrierend zu erklären.

Dieses Ding fügt ein zufälliges Zeichen zwischen U + 0300 oder U + 0301 oder U + 0302 nach einem zufälligen Vokal jedes Eingabeworts (falls vorhanden) hinzu.

Ungolfed (nur Lambda-Körper)

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

Unbenannte Funktion, die eine Liste von Zeichen als Eingabe verwendet und eine Liste von Zeichen zurückgibt. Leichter zu lesende Version, auch leicht ungolfed:

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

Zeile 13 teilt die Eingabe an allen Stellen in Wörter (Unterlisten von Zeichen); Jedes Wort wird von der in den Zeilen 4 bis 12 definierten Funktion bearbeitet, und die Ergebnisse werden in Zeile 3 in einer einzigen Liste wieder zusammengefügt.

Zeile 4 zeigt pdie Liste der Indizes an, aus denen hervorgeht, welche Zeichen des Wortes wVokale sind. Wenn es irgendwelche Vokale gibt (Zeile 5), treffen wir eine zufällige Auswahl eines solchen Indexes i(Zeile 6) und setzen dann dieses einzelne Zeichen des Wortes auf ein neues Zeichen zurück (Zeilen 7-10). Schließlich geben wir das (möglicherweise geänderte) Wort aus w.

Um das neue Zeichen auszuwählen, finden wir in der Zeichenkette, wo sich der zu ersetzende Vokal befindet, vund wählen den entsprechenden Zeichencode aus a. Um die drei Hüte zufällig auszuwählen, nehmen wir diesen Code und fügen eine zufällige Ganzzahl zwischen 0 und 2 (Zeile 9) hinzu, bevor wir zurück in ein Zeichen konvertieren. (Glücklicherweise kommen die Vokale in drei aufeinanderfolgenden UTF-8-Zeichencodes vor.)

Greg Martin
quelle
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
                             ]))
Alex Hall
quelle
1
Sie brauchen den Abstand zwischen importund nicht *.
Mr. Xcoder
j+1 forkann sein j+1for.
Jonathan Frech