แปลงภาษาอังกฤษเป็นตัวเลขที่ไม่มีบิวด์อินหรือไลบรารี่


14

ความท้าทายนี้คล้ายกับของอื่น ๆแต่ฉันทำข้อ จำกัด (ดูข้อความที่เป็นตัวหนาด้านล่าง) ที่ฉันคิดว่าจะทำให้แตกต่างกันมากและ (ฉันหวังว่า) จะสนุก

ความท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นในภาษาการเขียนโปรแกรมใด ๆ ที่ใช้เป็นชื่อภาษาอังกฤษของจำนวนเต็มบวกnไม่เกิน100และส่งกลับnเป็นจำนวนเต็ม

ช่องโหว่มาตรฐานเป็นสิ่งต้องห้ามและคุณจะไม่สามารถใช้ฟังก์ชั่นเครื่องมือภายนอกหรือห้องสมุดที่มีอยู่แล้วไม่งานนี้

รหัสแหล่งที่สั้นที่สุดเป็นไบต์ชนะ

ทดสอบ

ที่นี่ทุกinput->outputกรณี:

one              -> 1
two              -> 2
three            -> 3
four             -> 4
five             -> 5
six              -> 6
seven            -> 7
eight            -> 8
nine             -> 9
ten              -> 10
eleven           -> 11
twelve           -> 12
thirteen         -> 13
fourteen         -> 14
fifteen          -> 15
sixteen          -> 16
seventeen        -> 17
eighteen         -> 18
nineteen         -> 19
twenty           -> 20
twenty-one       -> 21
twenty-two       -> 22
twenty-three     -> 23
twenty-four      -> 24
twenty-five      -> 25
twenty-six       -> 26
twenty-seven     -> 27
twenty-eight     -> 28
twenty-nine      -> 29
thirty           -> 30
thirty-one       -> 31
thirty-two       -> 32
thirty-three     -> 33
thirty-four      -> 34
thirty-five      -> 35
thirty-six       -> 36
thirty-seven     -> 37
thirty-eight     -> 38
thirty-nine      -> 39
forty            -> 40
forty-one        -> 41
forty-two        -> 42
forty-three      -> 43
forty-four       -> 44
forty-five       -> 45
forty-six        -> 46
forty-seven      -> 47
forty-eight      -> 48
forty-nine       -> 49
fifty            -> 50
fifty-one        -> 51
fifty-two        -> 52
fifty-three      -> 53
fifty-four       -> 54
fifty-five       -> 55
fifty-six        -> 56
fifty-seven      -> 57
fifty-eight      -> 58
fifty-nine       -> 59
sixty            -> 60
sixty-one        -> 61
sixty-two        -> 62
sixty-three      -> 63
sixty-four       -> 64
sixty-five       -> 65
sixty-six        -> 66
sixty-seven      -> 67
sixty-eight      -> 68
sixty-nine       -> 69
seventy          -> 70
seventy-one      -> 71
seventy-two      -> 72
seventy-three    -> 73
seventy-four     -> 74
seventy-five     -> 75
seventy-six      -> 76
seventy-seven    -> 77
seventy-eight    -> 78
seventy-nine     -> 79
eighty           -> 80
eighty-one       -> 81
eighty-two       -> 82
eighty-three     -> 83
eighty-four      -> 84
eighty-five      -> 85
eighty-six       -> 86
eighty-seven     -> 87
eighty-eight     -> 88
eighty-nine      -> 89
ninety           -> 90
ninety-one       -> 91
ninety-two       -> 92
ninety-three     -> 93
ninety-four      -> 94
ninety-five      -> 95
ninety-six       -> 96
ninety-seven     -> 97
ninety-eight     -> 98
ninety-nine      -> 99
one hundred      -> 100

1
สิ่งที่เกี่ยวกับบิวด์อินที่ทำครึ่งงานได้เช่นการค้นหาชื่อ unicode ของ codepoint
แบรดกิลเบิร์ต b2gills

@ BradGilbertb2gills ไม่ไม่ไม่ดี
Bob

คำตอบ:


22

C, 160 ไบต์

g(char*s){char i=1,r=0,*p="k^[#>Pcx.yI<7CZpVgmH:o]sYK$2";for(;*s^'-'&&*s;r+=*s++|9);r=r%45+77;for(;*p!=r;p++,i++);return((*s^'-')?0:g(s+1))+(i<21?i:10*(i-18));}

ทดสอบมัน

int main ()
{
    char* w[] = {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty", "twenty-one", "twenty-two", "twenty-three", "twenty-four", "twenty-five", "twenty-six", "twenty-seven", "twenty-eight", "twenty-nine", "thirty", "thirty-one", "thirty-two", "thirty-three", "thirty-four", "thirty-five", "thirty-six", "thirty-seven", "thirty-eight", "thirty-nine", "forty", "forty-one", "forty-two", "forty-three", "forty-four", "forty-five", "forty-six", "forty-seven", "forty-eight", "forty-nine", "fifty", "fifty-one", "fifty-two", "fifty-three", "fifty-four", "fifty-five", "fifty-six", "fifty-seven", "fifty-eight", "fifty-nine", "sixty", "sixty-one", "sixty-two", "sixty-three", "sixty-four", "sixty-five", "sixty-six", "sixty-seven", "sixty-eight", "sixty-nine", "seventy", "seventy-one", "seventy-two", "seventy-three", "seventy-four", "seventy-five", "seventy-six", "seventy-seven", "seventy-eight", "seventy-nine", "eighty", "eighty-one", "eighty-two", "eighty-three", "eighty-four", "eighty-five", "eighty-six", "eighty-seven", "eighty-eight", "eighty-nine", "ninety", "ninety-one", "ninety-two", "ninety-three", "ninety-four", "ninety-five", "ninety-six", "ninety-seven", "ninety-eight", "ninety-nine", "one hundred"};

    int n;
    for (n = 1; n <= 100; n++)
    {
        printf ("%s -> %d\n", w[n], g(w[n]));
        if (n != g(w[n]))
        {
            printf ("Error at n = %d", n);
            return 1;
        }
    }
    return 0;
}

มันทำงานอย่างไร

หลังจากความพยายามบางอย่างผมพบว่าฟังก์ชั่นที่แมตัวเลขที่ "พิเศษ" a one, two, three, four, five, six, seven, eight, nine, ten, eleven, twelve, thirteen, fourteen, fifteen, sixteen, seventeen, eighteen, nineteen, twenty, thirty, forty, fifty, sixty, seventy, eighty, ninety, one hundredเพื่อตัวอักขระ ASCII k, ., [, <, *, , c, K, w, y, e, (, S, _, -, C, ), 7, =, 4, &,o, ], s, Y, g, m, Nตามลำดับ

ฟังก์ชั่นนี้คือ:

char hash (char* s)
{
    char r = 0;

    while (*s)
    {
        r += *s|9;
        s++;
    }

    return r%45+77;
}

โปรแกรมแข็งแรงเล่นกอล์ฟคำนวณฟังก์ชั่นของการป้อนข้อมูลจนกว่าจะถึงจุดสิ้นสุดของสตริงหรือตัวละครตัวนี้hash -จากนั้นมันจะค้นหาแฮชในสตริงk.[<* cKwye(S_-C)7=4&o]sYgmNและกำหนดจำนวนที่สอดคล้องกัน หากถึงจุดสิ้นสุดของสตริงอินพุตจำนวนจะถูกส่งคืนถ้า-ถึงa แทนจะมีการส่งคืนหมายเลขบวกกับผลลัพธ์ของโปรแกรม golfed ที่ใช้กับส่วนที่เหลือของสตริงอินพุต


ฉันกำลังคิดอยู่ว่าถ้ามีเวอร์ชั่น C ของสนามกอล์ฟจริง ๆ แล้วมันอาจชนะภาษาเช่น CJam Pyth Japt ฯลฯ ...
busukxuan

11

JavaScript (ES6), 175 166 163 156 153 147 ไบต์

บันทึกแล้ว 7 ไบต์ขอบคุณ @Neil

a=>+a.replace(/.+te|.*el|y$/,x=>x[1]?'on-'+x:'-d').split(/ |-|dr/).map(x=>"un|d,on|le,w,th,fo,f,x,s,h,i,".split`,`.findIndex(y=>x.match(y))).join``

ตรวจสอบที่นี่:

มันทำงานอย่างไร

แนวคิดพื้นฐานคือการแบ่งแต่ละตัวเลขเป็นคำหลักแล้วแมปแต่ละคำกับตัวเลขที่เกี่ยวข้อง คำเกือบทั้งหมดถูกตั้งค่าให้จับคู่อย่างเหมาะสมกับ regex อย่างง่าย แต่มีความผิดปกติบางอย่าง:

  • elevenผ่านnineteen: ถ้าคำมีelหรือteที่อยู่ตรงกลาง (เพื่อหลีกเลี่ยงten) เราเพิ่มon-ไปยังจุดเริ่มต้นของการเปลี่ยนแปลงเหล่านี้เพื่อผ่านon-elevenon-nineteen
  • twenty, thirtyฯลฯ .: เปลี่ยนต่อท้ายyด้วย-dการเปลี่ยนแปลงเหล่านี้twent-d, thirt-dฯลฯ

ตอนนี้เราแยกกันที่ขีดกลางช่องว่างและdrs กลุ่มนี้จะแบ่งทุกอย่างที่ 11-99 เข้าสู่สอดคล้องหลักคำของตนและเข้า"one hundred" [one,hun,ed]จากนั้นเราจับคู่แต่ละคำเหล่านี้ผ่านอาร์เรย์ของ regexes และเก็บดัชนีของคำที่ตรงกันก่อน

0: /un|d/ - This matches the "hun" and "ed" in 100, as well as the "d" we placed on the end of 20, 30, etc.
1: /on|le/ - Matches "one" and the "on" we placed on the beginning of 11 through 19, along with "eleven".
2: /w/ - Matches "two", "twelve", and "twenty".
3: /th/ - Matches "three" and "thirty".
4: /fo/ - Matches "four" and "forty".
5: /f/ - "five" and "fifty" are the only words by now that contain an "f".
6: /x/ - "six" and "sixty" are the only words that contain an "x".
7: /s/ - "seven" and "seventy" are the only words by now that contain an "s".
8: /h/ - "eight" and "eighty" are the only words by now that contain an "h".
9: /i/ - "nine" and "ninety" are the only words by now that contain an "i".
10: /<empty>/ - "ten" is the only word left, but it still has to be matched.

ถึงตอนนี้อินพุตทุกตัวจะเป็นอาร์เรย์ของตัวเลขที่เหมาะสม สิ่งที่เราต้องทำคือเข้าร่วมกับพวกเขาjoin``แปลงเป็นตัวเลขที่มีเอก+และเราเสร็จแล้ว


กรุณาอธิบาย.
Bob

@ บ๊อบแน่นอนว่าเพิ่มคำอธิบายแล้ว
ETHproductions

ใช้งานไม่ได้.findIndex(y=>x.match(y))?
Neil

@ ไม่มีฉันไม่ได้ตระหนักถึงสิ่งนั้น แต่มันจะขอบคุณ!
ETHproductions

replaceผมค่อนข้างมั่นใจว่าคุณสามารถนามแฝง
Mama Fun Roll

6

sh + coreutils, 112 ไบต์

สามารถรันได้ในทุก ๆ การทดสอบในหนึ่งครั้งต่อหนึ่งบรรทัด

sed -r "`awk '$0="s/"$0"/+"NR"/g"'<<<"on
tw
th
fo
fi
si
se
ei
ni
te|lv
el"`
s/ /y0/
s/y/*10/
s/^\+|[a-z-]//g"|bc

คำอธิบาย

การลับหลัง awkประเมินsedสคริปต์

s/on/+1/g       # one, one hundred
s/tw/+2/g       # two, twelve, twenty
s/th/+3/g       # three, thirteen, thirty
s/fo/+4/g       # ...
s/fi/+5/g
s/si/+6/g
s/se/+7/g
s/ei/+8/g
s/ni/+9/g
s/te|lv/+10/g   # ten, -teen, twelve
s/el/+11/g      # eleven

ซึ่งเปลี่ยนส่วนของตัวเลขให้เป็นตัวเลขแทน

fife            ->    +5ve
ten             ->    +10n
eleven          ->    +11even
twelve          ->    +2e+10e
sixteen         ->    +6x+10en
thirty-seven    ->    +3irty-+7ven
forty-four      ->    +4rty-+4ur
eighty          ->    +8ghty
one hundred     ->    +1e hundred

บรรทัดเพิ่มเติมของสคริปต์ sed

s/ /y0/
s/y/*10/

ดูแลและ-tyone hundred

+3irty-+7ven    ->    +3irt*10-+7ven
+4rty-+4ur      ->    +4rt*10-+4ur
+8ghty          ->    +8ght*10
+1e hundred     ->    +1ey0hundred      ->    +1e*100hundred

สุดท้ายเอาชั้นนำ+และทุกอย่างที่ไม่+, *หรือหลัก

s/^\+|[a-z-]//g"

เหลือเพียงนิพจน์ทางคณิตศาสตร์

fife            ->    5
sixteen         ->    6+10
forty-four      ->    4*10+4
eighty          ->    8*10
one hundred     ->    1*100

bcและสามารถเข้าสู่ประปา


4

Pyth, 79 76 75 68 ไบต์

ขอบคุณ @ETHproductions 7 ไบต์

?}"hu"z100sm*+hxc."ewEСBu­["2<d2?|}"een"d}"lv"dTZ?}"ty"dT1cz\-

โดยทั่วไปตรวจสอบมุมตัวพิมพ์ที่ 100 แล้วใช้อาร์เรย์ของตัวอักษรสองตัวแรกของตัวเลข 0 ถึง 11 เพื่อกำหนดซีแมนทิกส์ของอินพุตและแก้ไขค่าตามคำต่อท้าย ("-ty" และ "-teen"; lv "ใน 12 เป็นอีกมุมหนึ่ง) ก่อนอื่นให้แยกการป้อนข้อมูลลงในรายการคำจากนั้นจับคู่แต่ละรายการกับค่าและสรุปผล

ใน pythonic pseudocode:

                           z = input()    # raw, unevaluated
                           Z = 0
                           T = 10
?}"hu"z                    if "hu" in z:  # checks if input is 100
  100                        print(100)
                           else:
sm                           sum(map( lambda d: # evaluates each word, then sum
  *                            multiply(
   +hxc."ewEСBu­["2<d2           plusOne(chop("ontwth...niteel",2).index(d[:2])) + \
                                 # chops string into ["on","tw",..."el"]
                                 # ."ewEСBu­[" is a packed string
     ?|}"een"d}"lv"dTZ               (T if "een" in d or "lv" in d else Z),
                                     # add 10 for numbers from 12 to 19
   ?}"ty"dT1                     T if "ty" in d else 1),  # times 10 if "-ty"
  cz\-                         z.split("-"))  # splits input into words

ชุดทดสอบ


Python 3, 218 ไบต์

z=input()
if "hu" in z:print(100);exit()
print(sum(map(lambda d:([0,"on","tw","th","fo","fi","si","se","ei","ni","te","el"].index(d[:2])+(10 if "een" in d or "lv" in d else 0))*(10 if "ty" in d else 1),z.split("-"))))

โดยทั่วไปเหมือนกับคำตอบของ Pyth


ปิดหัวข้อ:

ฉันเพิ่งค้นพบคำตอบที่มีความหมายต่อชีวิตจักรวาลและทุกสิ่ง: มันเป็นกิ่งไม้ที่กระหายน้ำ ว้าวกิ่งไม้ที่ปรารถนาชา! ฉันไม่แน่ใจว่ามีคำตอบอื่น ๆ อีกมากมายที่ทำเช่นนี้ แต่สำหรับคำตอบของฉันถ้าอินพุตคือ "tea-thirsty-twigs" ผลลัพธ์คือ 42


ผมเชื่อว่าคุณสามารถบันทึกเจ็ดไบต์โดยใช้สตริงบรรจุ คัดลอกเอาต์พุตและวางไว้ใน"ontwthfofisiseeiniteel"โปรแกรมนี้
ETHproductions

@ETHproductions ว้าวขอบคุณมาก! ครั้งสุดท้ายที่ฉันตรวจสอบยังคงมี "ze" ที่ส่วนหัวของสตริงและการบรรจุไม่สามารถใช้งานได้ ฉันไม่ได้ตรวจสอบอีกครั้งหลังจากกอล์ฟออก อีกครั้งขอบคุณ xD
busukxuan

@ ETHproductions ใช่ฉันทำจริงมันอยู่ภายใต้รหัสเทียม
busukxuan

2

Python 3, 365 361 310 303 ตัวอักษร

แข็งแรงเล่นกอล์ฟ

def f(a):
 y=0
 for i in a.split("-"):
  x="one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir;four;fif;six;seven;eigh;nine;twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety,one hundred".replace(";","teen,").split(",").index(i)
  y+=x+1 if x<20 else range(30,110,10)[x-20]
 return y

Ungolfed

 def nameToNumber (numberName):
    names = ["one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen",
             "fourteen","fifteen","sixteen","seventeen","eighteen","nineteen","twenty","thirty","forty","fifty",
             "sixty","seventy","eighty","ninety","one hundred"]
    numbers = range(30, 110, 10)
    number = 0
    for n in numberName.split("-"):
        x = names.index(n)
        number += x + 1 if x < 20 else numbers[x - 20]
    return number

สั้นกว่า 45 ตัวอักษร: n="one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen,eighteen,nineteen,twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety,one hundred".split(",")แต่อย่างที่ฉันเห็นควรทำงานได้โดยไม่ต้องกำหนดให้ตัวแปร n เพียงแค่โทรหา.index()โดยตรง
จัดการ

7 "one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir;four;fif;six;seven;eigh;nine;twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety,one hundred".replace(";","teen,").split(",")ตัวอักษรสั้น:
จัดการ

เอ็นจิ้นไซต์ StackExchange มีนิสัยที่น่ารำคาญ: แทรกตัวอักษรที่มองไม่เห็น (U200C Zero Width Non-Joiner และ U200B Zero Width Space) ลงในโค้ดที่โพสต์ในคอมเม้นท์ คุณคัดลอกวางไว้เช่นกัน ฉันแก้ไขโพสต์ของคุณเพื่อลบออก
จัดการ

2

Haskell, 252 231 ไบต์

let l=words;k=l"six seven eight nine";w=l"one two three four five"++k++l"ten eleven twelve"++((++"teen")<$>l"thir four fif"++k)++[n++"ty"++s|n<-l"twen thir for fif"++k,s<-"":['-':x|x<-take 9w]]in maybe 100id.flip lookup(zip w[1..])

สิ่งนี้จะสร้างรายการชื่อหมายเลขภาษาอังกฤษทั้งหมดจาก "หนึ่ง" ถึง "เก้าสิบเก้า" จากนั้นดูดัชนีของอินพุตขึ้น ถ้าไม่มีเราอยู่ในกรณีขอบ "หนึ่งร้อย" ดังนั้นมันกลับ100มามิฉะนั้นมันจะกลับดัชนี

Ungolfed

-- k in the golfed variant
common = words "six seven eight nine" 

-- w in the golfed variant
numbers = words "one two three four five" ++ common
       ++ words "ten eleven twelve" ++ [p ++ "teen" | p <- words "thir four fif" ++ common]
       ++ [p ++ "ty" ++ s| p <- words "twen thir for fif" ++ common
                         , s <- "" : map ('-':) (take 9 numbers)]

-- part of the expression in the golfed variant
convert :: String -> Int
convert s = maybe 100 id $ lookup s $ zip numbers [1..]

2

Python 2, 275 ตัวอักษร

def x(n):a='one two three four five six seven eight nine ten eleven twelve'.split();t='twen thir four fif six seven eigh nine'.split();b=[i+'teen'for i in t[1:]];c=[i+'ty'for i in t];return(a+b+[i+j for i in c for j in ['']+['-'+k for k in a[:9]]]+['one hundred']).index(n)+1

มันง่ายสร้างรายการของทุกหมายเลขและค้นหาดัชนี


1

Japt, 82 ไบต์

+Ur`(.+)¿``¿-$1` r"y$""-d" q$/ |-|dr/$ £`un|Üaiwo|ØÏ¿ifoifix¿iÊ¿¿e¿iv`qi b_XfZ}Ãq

แต่ละคน¿แสดงถึงอักขระที่ไม่สามารถพิมพ์ได้ทดสอบออนไลน์!

ตามคำตอบ JS ของฉัน ลบหนึ่งไบต์ถ้าเอาท์พุทไม่จำเป็นต้องเป็นจำนวนเต็มเนื่องจากมันจะปรากฏเหมือนกับสตริง

มันทำงานอย่างไร

+Ur`(.+)¿` `¿-$1`  r"y$""-d" q/ |-|dr/ £  `un|Üaiwo|ØÏ¿ifoifix¿iÊ¿¿e¿iv`          qi b_ XfZ}à q
+Ur"(.+)te""on-$1" r"y$""-d" q/ |-|dr/ mX{"un|dioniwo|wenithifoifixisihineiteiniv"qi bZ{XfZ}} q

Ur"(.+)te""on-$1" // Replace "thirteen", "fourteen", etc. with "on-thiren", "on-fouren", etc.
r"y$""-d"         // Replace "twenty", "thirty", etc. with "twent-d", "thirt-d", etc.
q/ |-|dr/         // Split at occurances of a space, hyphen, or "dr". By now,
                  // "one", "thirteen", "twenty", "sixty-six", "one hundred" will have become:
                  // "one", "on" "thiren", "twent" "d", "sixty" "six", "one" "hun" "ed"
mX         }      // Map each item X in the resulting array to:
"..."qi           //  Take this string, split at "i"s,
b_XfZ}            //  and find the first item Z where X.match(RegExp(Z)) is not null.
                  //  See my JS answer to learn exactly how this works.
                  // Our previous example is now
                  // "1", "1" "3", "2" "0", "6" "6", "1" "0" "0"
+              q  // Join and convert to integer.
                  // 1, 13, 20, 66, 100

1

JavaScript, 214 199 ไบต์

เช่นเคย: กลายเป็นว่ามันนานเกินไปที่จะแข่งขัน แต่ตอนนี้ฉันทำแล้วมันคงจะเป็นการสิ้นเปลืองที่จะไม่โพสต์สิ่งนี้

อาจมีวิธีชัดเจนในการตีกอล์ฟเพิ่มเติมที่ฉันมองข้ามไป

e=s=>s.slice(-1)=='d'?100:'  ontwthfofisiseeinite'.indexOf(s.slice(0,2))/2;f=s=>([t,u]=s.split('-'),~s.indexOf`le`?11:~s.indexOf`lv`?12:e(t)+(t.slice(-3)=='een')*10+''+(u?e(u):t.slice(-1)=='y'?0:''))

JSFiddle สำหรับกรณีทดสอบ


1
วิธีการเกี่ยวกับการเปลี่ยนfไปf=s=>([t,u]=s.split('-'),~s.indexOf('le')?11:~s.indexOf('lv')?12:e(t)+(t.slice(-3)=='een')*10+''+(u?e(u):t.slice(-1)=='y'?0:''))? นอกจากนี้อาร์กิวเมนต์สตริงเดียวสามารถส่งผ่านไปยังฟังก์ชันดังนี้:s.indexOf`lv`
ETHproductions

@ ETHproductions เยี่ยมมากขอบคุณ! ฉันไม่รู้ว่า JS มีโอเปอเรเตอร์จุลภาคและการจดชวเลขสำหรับการส่งสตริงนั้นมีประโยชน์เช่นกัน
vvye

1

Perl, 158 ไบต์

@s=split/(\d+)/,'te1ten0l1le1on1tw2th3fo4fi5si6se7ei8ni9d00';foreach(split'-',$n=$ARGV[0]){for($i=0;$i<$#s;$i+=2){m/$s[$i]/&&print$s[$i+1]}}$n=~/ty$/&&print 0

ทำงานจากบรรทัดคำสั่ง one hundredจะต้องป้อนเป็น"one hundred"เพื่อหยุดมันถูกตีความว่าเป็นสองอินพุต

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