Đặt mũ vào con mèo


15

Lấy cảm hứng từ sự kiện bash mùa đông sắp tới

Objetive

Thêm một chiếc mũ ^, ´hoặc `vào một nguyên âm duy nhất trong mỗi từ của đầu vào.

Quy tắc

  • Các hatvowelphải được lựa chọn một cách ngẫu nhiên. Mỗi chiếc mũ phải xuất hiện với cùng một xác suất (33%) và các nguyên âm phải có cùng xác suất trong các nguyên âm hợp lệ trong từ (nếu từ có 2 nguyên âm hợp lệ thì mỗi nguyên âm phải được chọn 50%) - hoặc gần nhất ngôn ngữ của bạn có.
  • Chỉ AEIOUaeiouđược coi là nguyên âm (xin lỗi y)
  • Nguyên âm có mũ trong đầu vào KHÔNG can thiệp vào các quy tắc (bạn có thể coi đó là phụ âm)
  • Nếu đầu vào không có nguyên âm, nó sẽ không được sửa đổi
  • Viết hoa phải được bảo tồn.

Ví dụ

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

Chiến thắng

Đây là nên mã ngắn nhất sẽ thắng


"ngẫu nhiên (hoặc gần nhất mà ngôn ngữ của bạn có)" vì vậy nếu ngôn ngữ của tôi không có lệnh ngẫu nhiên, tôi có thể làm điều gì đó mang tính quyết định ???
Gây tử vong

@LuisMendo tốt hơn?
Rod

@Firthize thậm chí không get the current timengẫu nhiên?
Rod

@Rod Tôi không có ngôn ngữ nào trong đầu. Tôi chỉ nói rằng bạn phải áp đặt rằng nó là ngẫu nhiên (và loại ngẫu nhiên) nếu không nó không có ý nghĩa gì cả.
Gây tử vong

Thông số kỹ thuật nói rằng chúng ta phải thêm ^ ạ hoặc backtick, nhưng ví dụ tschuss cho thấy một âm sắc. Có yêu cầu umlauts hay không?
Cấp sông St

Câu trả lời:


1

Perl 6 , 101 byte

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

Thử nó

Mở rộng:

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

thay thế bản demo

Tôi thực sự cảm thấy như mình gian lận, vì tôi vẫn thêm mũ vào các nguyên âm có dấu được tạo bằng cách kết hợp các ký tự . Nếu điều đó không được chấp nhận, hãy cho tôi biết để tôi có thể thêm mã soạn sẵn tuyên bố câu trả lời này không cạnh tranh.

Điều này thêm một ký tự ngẫu nhiên trong số U + 0300 hoặc U + 0301 hoặc U + 0302 , sau một nguyên âm ngẫu nhiên của mỗi từ đầu vào (nếu có).

Ungolfed (chỉ cơ thể 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

Toán học, 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~" "&])&

Hàm không tên lấy danh sách các ký tự làm đầu vào và trả về danh sách các ký tự. Phiên bản dễ đọc hơn, cũng hơi vô văn hóa:

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

Dòng 13 chia đầu vào thành các từ (danh sách con của các ký tự) tại tất cả các khoảng trắng; mỗi từ được vận hành theo chức năng được xác định bởi các dòng 4-12 và các kết quả được nối lại với nhau trong một danh sách theo dòng 3.

Dòng 4 đặt pvào danh sách các chỉ số cho biết các ký tự của từ đó wlà nguyên âm. Nếu có bất kỳ nguyên âm nào (dòng 5), chúng tôi sẽ chọn ngẫu nhiên một chỉ mục như vậy i(dòng 6) và sau đó đặt lại ký tự đơn của từ đó thành một ký tự mới (dòng 7-10). Cuối cùng, chúng tôi xuất từ ​​(có thể sửa đổi) w.

Để chọn ký tự mới, chúng tôi tìm vị trí nguyên âm được thay thế nằm trong chuỗi vvà chọn mã ký tự tương ứng a. Nhưng để chọn ngẫu nhiên ba chiếc mũ, chúng tôi lấy mã đó và thêm một số nguyên ngẫu nhiên trong khoảng từ 0 đến 2 (dòng 9) trước khi chuyển đổi trở lại thành một ký tự. (May mắn là tất cả các nguyên âm được xử lý đều xuất hiện trong bộ ba mã ký tự UTF-8 liên tiếp.)


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

Ung dung:

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
Bạn không cần khoảng trống giữa import*.
Ông Xcoder

j+1 forcó thể j+1for.
Jonathan Frech
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.