Rememebere tehe สระ!


25

อินพุต

สตริงของอักขระ ASCII ที่พิมพ์ได้ตัวอย่างเช่น:

This is an example string.

เอาท์พุต

สำหรับพยัญชนะทุกตัว ( BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz) ที่ไม่ได้ตามด้วยเสียงสระ ( AEIOUaeiou) ให้เพิ่มเสียงสระตัวสุดท้ายก่อนหน้าด้วยตัวพิมพ์เล็ก
พยัญชนะก่อนสระแรกจะถูกปล่อยให้เป็น - คือ :

Thisi isi ana examapale seterinigi.

กรณีทดสอบ

AN EXAMPLE WITH A LOT UPPERCASE (plus some lowercase)
=> ANa EXAMaPaLE WITiHi A LOTo UPuPEReCASE (pelusu some lowerecase)

And here comes a **TEST** case with 10% symbols/numbers(#)!
=> Anada here comese a **TESeTe** case witihi 10% siyimiboloso/numuberese(#)!

This is an example string.
=> Thisi isi ana examapale seterinigi.

abcdefghijklmnopqrstuvwxyz
=> abacadefegehijikiliminopoqorosotuvuwuxuyuzu

A pnm bnn
=> A panama banana

Tell me if you need more test cases!
=> Telele me ifi you neede more tesete casese!

เกณฑ์การให้คะแนน

เนื่องจากนี่คือคำตอบที่มีจำนวนไบต์ต่ำสุดในแต่ละภาษาจะชนะ (ไม่ยอมรับคำตอบ)


ดังนั้นสระที่แทรกควรเป็นตัวพิมพ์เล็กเสมอในขณะที่ข้อความอาจเป็นทั้งตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก?
Erik the Outgolfer

สามารถส่งออกในรูปแบบของรายการ / อาร์เรย์?
Nathan Dimmer

@EriktheOutgolfer ใช่ฉันไม่ต้องการตัวพิมพ์ใหญ่ที่เราต้องการตัวพิมพ์เล็ก แต่มันจะซับซ้อนมากถ้าหากต้องตรวจสอบตัวอักษรที่อยู่ติดกัน
wastl

11
กินเด็กที่มีสุขภาพดีลองA pnm bnn!
Stewie Griffin

4
มีใครบ้างที่คิดว่า "ชาวอิตาเลียน" ต้องอยู่ในตำแหน่งหนึ่งที่ไหน?
Artelius

คำตอบ:


14

เรติน่า 48 ไบต์

i`(?<=([aeiou]).*?[^\W\d_aeiou])(?![aeiou])
$l$1

ลองออนไลน์! คำอธิบาย: lookahead ค้นหาจุดที่ไม่ตามด้วยสระในขณะที่ lookbehind ค้นหาพยัญชนะก่อนหน้าทันทีและสระก่อนหน้าซึ่งจะถูกแทรกในกรณีที่ต่ำกว่า


8

JavaScript (ES6), 108 105 ไบต์

(บันทึก 3 ไบต์ด้วย @Shaggy)

f=s=>(t=(s+=' ').replace(/[aeiou]|[a-z][^aeiou]/ig,r=>r[1]?r[0]+v.toLowerCase()+r[1]:v=r,v=''))!=s?f(t):s

ค้นหาสระหรือพยัญชนะที่ไม่มีสระดังต่อไปนี้:

/[aeiou]|[a-z][^aeiou]/ig

(เราไม่จำเป็นต้องค้นหาพยัญชนะอย่างชัดเจนเนื่องจากสระจะถูกแยกออกจากตาม/[aeiou]|...)

สระจะถูกเก็บไว้ในvและพยัญชนะที่ไม่มีสระดังต่อไปนี้ได้vแทรก:

r[1]?r[0]+v.toLowerCase()+r[1]:v=r

(หากr[1]มีอยู่เราได้จับคู่กับพยัญชนะและไม่ใช่เสียงสระ)

หากไม่มีอะไรเปลี่ยนแปลงเราจะคืนค่าอินพุต มิฉะนั้นเราจะเรียกคืนสตริงที่ถูกแทนที่


1
มันดีกว่านี้อีกแล้ว ฉันต้องดู regex จริงๆ
Luis felipe De jesus Munoz

+1 ความคิดที่ชาญฉลาดเพื่อใช้แทนที่แผนที่ + เข้าร่วม
Downgoat

จากเวอร์ชันการทำงานของคุณ (เกือบ) โดยไม่มีการเรียกซ้ำ: s=>s.replace(/[aeiou][^a-z]*([a-z](?![aeiou]))+/gi,s=>s.replace(/(?!^)./g,a=>a+s[0].toLowerCase()))ฉันไม่สามารถมีปัญหากับลำดับตัวอักษรที่ไม่ใช่ตัวอักษรได้
Downgoat

การเรียกซ้ำทำให้เป็นเรื่องง่ายขึ้นที่นี่
Rick Hitchcock

(s+=' ')ควรบันทึกไม่กี่ไบต์
Shaggy


4

ML มาตรฐาน , 225 223 ไบต์

str o Char.toLower;fun?c=String.isSubstring(it c)"aeiou"fun g(x,l)$d=(fn l=>if Char.isAlpha$andalso not(?d)then if? $then(it$,l)else(x,l^x)else(x,l))(l^str$)fun f$(c::d::r)=f(g$c d)(d::r)|f$[c]= #2(g$c c);f("","")o explode;

ลองออนไลน์!

หักกอล์ฟ:

val lower = str o Char.toLower

fun isVowel c = String.isSubstring (lower c) "aeiou"

(* c is the current char, d is the next char, x is the last vowel and l the accumulator 
   for the resulting string *)
fun g (x,l) c d = 
    if Char.isAlpha c andalso not (isVowel d)
    then if isVowel c 
         then (lower c, l^str c)
         else (x, l^str c^x)
    else (x, l^str c)

fun f t (c::d::r) = f (g t c d) (d::r)
  | f t [c] = #2(g t c #"d")

val h = f ("","") o explode;

ลองออนไลน์!


ว้าว ML Golf ดูน่าสนใจจริงๆ! ฉันรักitและใช้$ชื่อตัวแปร
ลินน์

@ ลินน์ฉันเขียนเคล็ดลับเกี่ยวกับตัวระบุการเปลี่ยนชื่อเมื่อไม่นานมานี้และวางแผนที่จะเขียนเกี่ยวกับเรื่องนี้itเช่นกัน แต่ยังไม่ได้ดำเนินการเลย
Laikoni


4

Perl 5, 68 67 59 ไบต์

perl -pe '$v="[aeiou])";1while s/($v[^a-z]*[b-z]\K(?<!$v(?!$v/\L$1/i'

นี่เป็นตัวอย่างที่ดีเกี่ยวกับประโยชน์\Kและฉันไม่อยากจะเชื่อเลยว่าฉันไม่รู้เกี่ยวกับคุณลักษณะนี้ก่อนที่ Dom Hastings จะชี้ให้เห็น

ฉันไม่สามารถรับพฤติกรรมที่ถูกต้องได้ด้วยการใช้เพียงอย่างเดียวs///gดังนั้นจึงจำเป็นต้องวนซ้ำจริง ๆ (เป็นไปได้ว่าการใช้การยืนยันที่ดูอย่างถูกต้องสามารถทำงานได้โดยไม่ต้องแจ้งwhileให้ทราบล่วงหน้า แต่ฉันไม่พบ)


วิธีการที่ดี! ไม่สามารถเกิดอะไรขึ้นกับสิ่งที่ดีกว่านี้ได้ แต่จัดการให้ได้ 6 ไบต์: ลองออนไลน์!
Dom Hastings

1
@DomHastings: ยิ่งสั้น (มากถึง 58 ไบต์) โดยแยก[aeiou])ตัวแปรออกเป็น: ลองออนไลน์!
ShadowRanger

3

JavaScript ES6, 115 ไบต์

บันทึก 8 ไบต์ด้วย @ETHProductions

s=>[x="",...s].map((i,j)=>(r=/[aeiou]/i).test(i)?x=i:/[a-z]/i.test(i)&&!r.test(s[j]||1)?i+x.toLowerCase():i).join``

ฉันจัดการมันให้พองตัวมากขึ้นในขั้นตอนการตีลูกกอล์ฟ O_o แต่มันก็แก้ไขข้อผิดพลาดได้เช่นกัน

s=>[x="",...s].map(             // Create a new array with x storing last vowel
                                // This also offsets indexes by one so rel to original str refers to next char
   (i,j)=>                      // Going through each char...
      (r=/[aeiou]/i).test(i)?   // If it's vowel, store it in x
          x=i:
      /[a-z]/i.test(i)          // If a letter (thats not a vowel excluded by above)
         &&!r.test(s[j]||1)?    // Test if next char is *not* vowel
         i+x.toLowerCase():i    // If it isn't, then add the most recent vowel after
    ).join``                    // Combine back to string

@ RickHitchcock โอ้ยิงทั้งหมดลืมเกี่ยวกับการสิ้นสุด char แก้ไข asap
Downgoat

1
@RickHitchcock ตกลงแล้ว
Downgoat

อาใช่ขอบคุณสำหรับกอล์ฟ @ETHproductions
Downgoat

3

JavaScript, 88 82 ไบต์

เสร็จสิ้นด้วยนิพจน์ปกติเดียว:

รุ่นดั้งเดิม (88 ไบต์):

s=>s.replace(/(?<=([aeiou]).*?(?![aeiou])[a-z])(?=[^aeiou]|$)/gi,(_,c)=>c.toLowerCase())

อัปเดตเวอร์ชัน (82 ไบต์) หลังจากดูนิพจน์ปกติของ Neil :

s=>s.replace(/(?<=([aeiou]).*?[^\W\d_aeiou])(?![aeiou])/gi,(_,c)=>c.toLowerCase())

var tests = {
  "AN EXAMPLE WITH A LOT UPPERCASE (plus some lowercase)":
    "ANa EXAMaPaLE WITiHi A LOTo UPuPEReCASE (pelusu some lowerecase)",
  "And here comes a **TEST** case with 10% symbols/numbers(#)!":
    "Anada here comese a **TESeTe** case witihi 10% siyimiboloso/numuberese(#)!",
  "This is an example string.":
     "Thisi isi ana examapale seterinigi.",
  "abcdefghijklmnopqrstuvwxyz":
    "abacadefegehijikiliminopoqorosotuvuwuxuyuzu",
  "A pnm bnn":
     "A panama banana",
  "Tell me if you need more test cases!":
     "Telele me ifi you neede more tesete casese!"
};

for ( test in tests )
{
  var result = (s=>s.replace(/(?<=([aeiou]).*?[^\W\d_aeiou])(?![aeiou])/gi,(_,c)=>c.toLowerCase()))(test);
  console.log( result === tests[test], result );
}


3

Japt -P , 28 ไบต์

ó@\ctX ©\VtYÃËè\v ?P=D:D¬qPv

ลองออนไลน์!

เอาออกแล้วมันทำงานอย่างไร

UóXY{\ctX &&\VtY} mD{Dè\v ?P=D:Dq qPv

UóXY{           }  Split the string between any two chars that don't satisfy...
     \ctX &&\VtY     The first char is a consonant and the second is a non-vowel
mD{                And map...
   Dè\v              If this item is a vowel...
       ?P=D            Assign it to P and return as-is
           :Dq qPv     Otherwise, split the item into chars and join with P lowercased
                       (P starts with "", so beginning consonants are not affected)

-P                 Join with ""

óฟังก์ชั่นชนะมากกว่าชนิดของ regexes ใด ๆ


นีซคนหนึ่ง, ฉันชนะฉัน: D
Magic Octopus Urn

ทำได้ดีมาก - ฉันปวดหัวอย่างรุนแรงด้วยตัวเอง!
Shaggy


2

Perl 6 ,  75 73 71  69 69 ไบต์

{({S:i/.*(<[aeiou]>).*<-[\W\d_aeiou]><()><![aeiou]>/$0.lc()/}...*eq*).tail}

ลองมัน

{({S:i{.*(<[aeiou]>).*<-[\W\d_aeiou]><()><![aeiou]>}=$0.lc}...*eq*).tail}

ลองมัน

{({S:i{.*(<[aeiou]>).*<:L-[_aeiou]><()><![aeiou]>}=$0.lc}...*eq*).tail}

ลองมัน

{({S:i{.*(<[aeiou]>).*<:L-[_aeiou]><(<![aeiou]>}=$0.lc}...*eq*).tail}

ลองมัน

ขยาย:

{  # bare block lambda with implicit parameter $_

  (
    # generate a sequence

    {  # code block used to generate the values

      S               # substitute (not in-place)
      :i              # :ignorecase
      {

          .*              # start at end of string

          ( <[aeiou]> )   # store the previous vowel in $0

          .*

          <:L - [_aeiou]> # letter other than a vowel

          <(              # ignore everything before this

                          # this is where `$0.lc` gets inserted

          # )>            # ignore everything after this

          <![aeiou]>      # not a vowel (zero width lookahead)

      } = $0.lc       # replace with lowercase of the earlier vowel
    }

    ...    # keep generating until:

    * eq * # there are two equal strings (no changes)

  ).tail   # get the last value
}

2

Python 3 , 125 ไบต์

lambda s,v='[^aeiouAEIOU':sub(f'(?<={v}\W\d])(?={v}]|$)',lambda m:sub(f'{v}]','',s[:m.end()])[-1:].lower(),s)
from re import*

ลองออนไลน์!

Python 3.6 ช่วยให้เรา (ab) ใช้f-stringsเพื่อนำชุดสระของเรากลับมาใช้ (และสำหรับการบันทึกอักขระเพิ่มอีกสี่ตัวการเริ่มต้นของคลาสอักขระ inverted regex) ราคาถูก ( fคำนำหน้าในแต่ละสตริงจากนั้น{v}ตามต้องการแทนที่จะเป็น'+v+'คุณต้องการการต่อข้อมูลหรือ[^aeiouAEIOUแทรกตัวอักษร

regex ที่ไม่ตรงกับตัวอักษรเพียงแค่ตำแหน่งหลีกเลี่ยงปัญหาที่ตรงกับ regexes ปกติที่ไม่จำเป็นต้องทับซ้อนกันและไม่จำเป็นต้องเรียกคืนส่วนหนึ่งส่วนใดของการแข่งขัน สิ่งที่เราใช้วัตถุที่ตรงกันสำหรับคือการได้รับดัชนีชิ้นที่เราใช้ในการค้นหาเสียงสระก่อน

de-golfed บางส่วนมันจะเป็นสิ่งที่ชอบ:

import re

def get_last_vowel(string):
    '''
    Returns the lowercase version of the last vowel in a string if
    the string contains any vowels, otherwise, return the empty string
    '''
    try:
        *restvowels, lastvowel = re.sub(r'[^aeiouAEIOU]', '', string)
    except ValueError:
        lastvowel = ''  # No vowels in string
    return lastvowel.lower()

def rememebere_tehe_vowelese(string):
    '''Inserts the lowercased last vowel seen after any consonant not followed by a vowel'''
    return re.sub(r'(?<=[^aeiouAEIOU\W\d])(?=[^aeiouAEIOU]|$)',
                  lambda match: get_last_vowel(string[:match.end()]),
                  string)

2

TSQL, 500 ไบต์

 CREATE TABLE i (i CHAR(999)); INSERT i VALUES ('The rain in Spain stays mainly in the plain')
 DECLARE @w CHAR(999)=(SELECT i FROM i),@r VARCHAR(999)='';WITH d(n,c,i,q)AS(SELECT n,SUBSTRING(@w,n,1),CHARINDEX(SUBSTRING(@w,n,1),'AEIOUaeiou'),CHARINDEX(SUBSTRING(@w,n,1),'BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz')FROM(SELECT DISTINCT number n FROM master..[spt_values]WHERE number BETWEEN 1 AND LEN(@w))D)SELECT @r=@r+f.c+LOWER(COALESCE(CASE WHEN f.q<>0 AND COALESCE(d2.i,0)=0 THEN SUBSTRING(@w,(SELECT MAX(n)FROM d WHERE i<>0 AND n<f.n),1)END,''))FROM d f LEFT JOIN d d2 ON f.n=d2.n-1 SELECT @r

ตารางที่iใช้สำหรับการป้อนข้อมูล


2
สมมติว่าการป้อนข้อมูลที่จะนำเสนอในตัวแปรบางอย่างโดยทั่วไปไม่ได้รับอนุญาต สามารถดัดแปลงเป็นฟังก์ชั่นแทนได้หรือไม่?
Laikoni

โซลูชัน @Laikoni ได้รับการอัปเดตเพื่อให้ตรงกับกฎที่กำหนด
Jan Drozen

2

SWI-Prolog, 593 ไบต์

a(S,D):-atom_chars(S,D).
g(_,[],_,-1).
g(E,[E|_],R,R).
g(E,[_|T],I,R):-N is I+1,g(E,T,N,R).
c(A,E):-g(E,A,0,R),R > -1.
v(X):-a('AEIOUaeiou',X).
c(X):-a('BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz',X).
d([_],_,R,R).
d([H|T],_,I,R):-v(V),c(V,H),!,d(T,H,I,[H|R]).
d([H,N|T],V,I,R):-c(C),c(C,H),v(W),c(W,N),!,d([N|T],V,I,[H|R]).
d([H,N|T],V,I,R):-c(C),c(C,H),v(W),\+c(W,N),string_lower(V,LV),!,d([N|T],V,I,[LV,H|R]).
d([H|T],V,I,R):-!,d(T,V,I,[H|R]).
r([],Z,Z).
r([H|T],Z,A):-r(T,Z,[H|A]).
r(S,D):-r(S,D,[]).
m(X,R):-a(X,O),r(O,P),r([''|P],Q),d(Q,'',I,[]),r(I,J,[]),atomic_list_concat(J,R).

ใช้เพรดิเคตในตัวเท่านั้น (ไม่มี regex หรือลิสต์การจัดการไลบรารี)

การใช้งาน:

?- m('A pnm bnn').
'A panama banana'
true .

2

Haskell , 142 130 ไบต์

""&
import Data.Char
v=(`elem`"aeiouAEIOU")
s&(x:y:z)|v y=x:s&(y:z)
s&(x:y)|v x=x:[toLower x]&y|isAlpha x=x:s++s&y|1>0=x:s&y
_&x=x

ลองออนไลน์!

เริ่มต้น""&เป็นแอปพลิเคชั่นบางส่วนของ(&)ฟังก์ชั่นที่กำหนดไว้ในภายหลังและวางไว้อย่างแปลกประหลาดเพื่อให้ TIO นับจำนวนไบต์เข้า""&แต่ไม่นับจำนวนไบต์ที่ต้องใช้ในโปรแกรมเต็มรูปแบบเพื่อกำหนดให้กับค่าที่มีชื่อ


หักกอล์ฟ:

import Data.Char (isAlpha, toLower)

vowel :: Char -> Bool
vowel = (`elem`"aeiouAEIOU")

replace :: String -> String
replace = go "" -- start by carrying no extra vowel
  where go _ "" = ""
        -- special case for "anything followed by vowel" so later cases can ignore next character
        go s (x:y:more) | vowel y = x : go s (y:more)
        go s (x:xs) | vowel x = x : go [toLower x] xs -- update the vowel we're carrying
                    | isAlpha x = x : s ++ go s xs -- non-vowel letter not followed by a vowel
                    | otherwise = x : go s xs -- some non-letter junk, just include it and carry on

มันควรจะมีวิธีที่จะทำสิ่งนี้ให้รัดกุมแทนที่จะใช้การเรียกซ้ำ แต่ฉันไม่สามารถเข้าใจได้


ต่อไปนี้เป็นวิธีการกำหนดส่วนหัวที่แฮ็คมากซึ่งfไม่ปรากฏในเนื้อหา: ลองออนไลน์!
Laikoni

มีสองช่องว่างที่ไม่จำเป็นในการมีv = (และคุณสามารถกำหนดgเป็นผู้ประกอบการมัด
Laikoni

การวางเคสพื้นฐานg _""=""ในตำแหน่งสุดท้ายจะบันทึกเป็นไบต์: g _ x=x(สองไบต์หากคุณเปลี่ยนเป็นมัดตามที่ Laikoni แนะนำ)
nimi

ตามอนุสัญญาของเราคุณจะต้องเพิ่มวงเล็บไว้รอบ ๆ""&เพื่อทำให้เป็นฟังก์ชัน
Laikoni

1

05AB1E , 34 ไบต์

vyžMylåil©1V}žPylåžM¹N>èå_Y&&i®«}J

ลองออนไลน์!


ฉันเอามันกลับมาฉันสามารถโกนได้เพียง 3 ไบต์จากความผิดปกตินี้ ... ฉันคิดว่าฉันสามารถกำจัดบูลีนลงได้ แต่ต้องมี 3 กรณี 1 สำหรับสระ 1 สำหรับพยัญชนะ 1 สำหรับกรณีที่มีตัวเลข / สัญลักษณ์อยู่


v                                 # For each...
 y                                # Push current element.
  žM                              # Push lower-case vowels (aeiou).
    ylå                           # Lower-case current element is vowel?
       i©1V}                      # If so, put it in register, set Y to 1.
            žP                    # Push lower-case consonants (b...z)
              ylå                 # Is current char a consonant?
                 žM¹N>èå_         # Push vowels again, is input[N+1] NOT a vowel? 
                         Y        # Did we ever set Y as 1?
                          &&      # All 3 previous conditions true?
                            i®«}  # Concat the current vowel to the current char.
                                J # Join the whole stack.
                                  # '}' isn't needed here, b/c it's implied.
                                  # Implicit return.

0

Powershell, 104 ไบต์

ขึ้นอยู่กับการแสดงออกปกติของนีล

[regex]::Replace($args,'(?i)(?<=([aeiou]).*?[^\W\d_aeiou])(?![aeiou])',{"$($args.Groups[1])".ToLower()})

get-rememebere.ps1บันทึกเป็น สคริปต์สำหรับการทดสอบ:

$test = @"
AN EXAMPLE WITH A LOT UPPERCASE (plus some lowercase)
And here comes a **TEST** case with 10% symbols/numbers(#)!
This is an example string.
abcdefghijklmnopqrstuvwxyz
A pnm bnn
Tell me if you need more test cases!
"@

$expected = @"
ANa EXAMaPaLE WITiHi A LOTo UPuPEReCASE (pelusu some lowerecase)
Anada here comese a **TESeTe** case witihi 10% siyimiboloso/numuberese(#)!
Thisi isi ana examapale seterinigi.
abacadefegehijikiliminopoqorosotuvuwuxuyuzu
A panama banana
Telele me ifi you neede more tesete casese!
"@

$result = .\get-rememebere.ps1 $test
$result -eq $expected
$result

1
นี่ไม่ใช่ตัวอย่างเท่านั้นหรือ ผมหมายถึงมีการป้อนข้อมูล PowerShell $tดังนั้นคุณจึงไม่สามารถสันนิษฐานได้ว่าอยู่ในการป้อนข้อมูล โพสต์ meta ที่เกี่ยวข้อง: codegolf.meta.stackexchange.com/a/8731/78123
wastl

0

สีแดง 276 ไบต์

func[s][v: charset t:"AEIOUaeiou"c: charset 
u:"BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz"b:
parse s[collect[any keep[thru c opt v]keep thru end]]p:""foreach
c b[either find t e: last c: to-string c[p: e][parse c[any[copy p v
| skip]]if find u e[append c lowercase p]]prin c]]

ลองออนไลน์!

อ่านได้:

f: func [ s ] [
   v: charset t: "AEIOUaeiou"
   c: charset u: "BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz"
   b: parse s [
       collect [ any keep [ thru c opt v ]
       keep thru end ]
   ]
   p: "" 
   foreach c b [
       e: last c: to-string c
       either find t e [ p: e ][
           parse c [ any [ copy p v | skip ] ]
           if find u e [ append c lowercase p ]
       ]
       prin c
   ]
]

0

Yabasicขนาด 180 ไบต์

โปรแกรมเต็มรูปแบบซึ่งรับอินพุตจาก STDIN และเอาต์พุตไปยัง STDOUT

Line Input""s$
x$="AEIOUaeiou"
For i=1To Len(s$)
c$=Mid$(s$,i,1)
?c$;
If InStr(x$,c$)Then
v$=c$
Else
a=Asc(Upper$(c$))
If a>64And a<91And!InStr(x$,Mid$(s$,i+1,1))Then?v$;Fi
Fi
Next

ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.