Положи шляпу в кота

15

Вдохновленный предстоящим зимним событием

Цель СССР

Добавьте шляпу ^, ´или `к одному гласному в каждом слове входа.

правила

  • hatИ vowelдолжен быть выбран случайным образом . Каждая шляпа должна появляться с одинаковой вероятностью (33%), и гласные должны иметь одинаковую вероятность в пределах допустимых гласных в слове (если слово имеет 2 действительных гласных, каждый должен быть выбран с вероятностью 50%) - или ближайший что ваш язык имеет.
  • Только AEIOUaeiouсчитаются гласными (извините y)
  • Гласные с шапками на входе НЕ мешают правилам (это можно считать согласной)
  • Если у ввода нет гласного, оно не будет изменено
  • Капитализация должна быть сохранена.

Примеры

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

выигрыш

Это поэтому выигрывает самый короткий код

прут
источник
«наугад (или ближайший к вашему языку)», поэтому, если у моего языка нет случайных команд, я могу просто сделать что-то детерминированное ???
Fatalize
@LuisMendo лучше?
Род
@ Фатализировать даже не get the current timeслучайно?
Род
@ Род У меня нет никакого языка в виду. Я просто говорю, что вы должны навязать, что это случайно (и что за случайность), иначе это не имеет никакого смысла вообще.
Fatalize
Спецификации говорят, что мы должны добавить ^ ´ или backtick, но пример tschuss показывает умлаут. Умлауты нужны или нет?
Уровень River St

Ответы:

1

Perl 6 , 101 байт

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

Попытайся

Expanded:

~      # 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
}
Брэд Гилберт b2gills
источник
2

C #, 273 267 байт

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

Я действительно чувствую, что я обманываю, так как я все еще добавляю шляпы к уже акцентированным гласным, созданным комбинированием персонажей . Если это не приемлемо, дайте мне знать, чтобы я мог добавить стандартные коды, объявляющие этот ответ неконкурентным.

Эта вещь добавляет случайный символ из U + 0300 или U + 0301 или U + 0302 после случайного гласного каждого входного слова (если оно есть).

Ungolfed (только лямбда-тело)

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]));
Ссылка Ng
источник
1

Mathematica, 226 байт

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

Безымянная функция, принимающая список символов в качестве входных данных и возвращающая список символов. Более легкая для чтения версия, также слегка раскрученная:

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

Строка 13 разбивает ввод на слова (подсписки символов) во всех пробелах; каждое слово обрабатывается функцией, определенной в строках 4-12, и результаты снова объединяются в один список в строке 3.

Строка 4 устанавливает pсписок индексов, указывающих, какие символы слова wявляются гласными. Если есть какие-либо гласные (строка 5), мы делаем случайный выбор одного такого индекса i(строка 6), а затем возвращаем этот единственный символ слова в новый символ (строки 7-10). Наконец мы выводим (возможно, измененное) слово w.

Чтобы выбрать новый символ, мы находим место замены гласного в строке vи выбираем соответствующий код символа a. Но чтобы случайным образом выбрать три шляпы, мы берем этот код и добавляем случайное целое число от 0 до 2 (строка 9), прежде чем вернуться обратно к символу. (К счастью, все гласные гласные входят в последовательные трио кодов символов UTF-8.)

Грег Мартин
источник
1

Python 3, 170 байт

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
Вам не нужно пространство между importи *.
г-н Xcoder
j+1 forможет быть j+1for.
Джонатан Фрех