ลำดับการดูและพูด: ฉบับเลขโรมัน


20

คำอธิบายการท้าทาย

ที่เราเคยมีความท้าทายไม่กี่ที่เกี่ยวข้องกับการลำดับดูและการพูด การแจ้งเตือนด่วน:

  • ลำดับเริ่มต้นด้วย1,
  • เงื่อนไขที่ตามมาของลำดับนี้จะถูกสร้างขึ้นโดยการแจกแจงตัวเลขแต่ละกลุ่มของตัวเลขซ้ำในระยะก่อน

ดังนั้นศัพท์สองสามข้อแรกคือ:

1        "one"
11       "one one" (we look at the previous term)
21       "two ones"
1211     "one two, one one"
111221   "one one, one two, two ones"
312211   "three ones, two twos, one one"

ตอนนี้เรามาทำสิ่งเดียวกัน แต่ใช้ตัวเลขโรมันแทน เราเริ่มต้นด้วยIและปฏิบัติตามกฎเดียวกัน (เราใช้กฎหลักนับตัวอักษรแทนเพื่อให้เราอ่านIVXเป็นone one, one five, one tenแทนone four, one tenหรือบางวิธีอื่น ๆ ):

I           "one"
II          "one one"
III         "two ones" = "II" + "I"
IIII        "three ones" = "III" + "I"
IVI         "four ones" = "IV" + "I"
IIIVII      "one one, one five, one one"
IIIIIVIII   "three ones, one five, two ones" = ("III" + "I") + ("I" + "V") + ("II" + "I")

รับจำนวนเต็มบวกNอย่างใดอย่างหนึ่ง:

  • เอาท์พุทNตัวเลขแรกของลำดับนี้ (ตัวคั่นที่เหมาะสมใด ๆ ก็ใช้ได้เช่นกัน["I", "II", "III", ...]
  • คำที่เอาท์พุทNของลำดับนี้ (อาจเป็นดัชนี 0)

อย่าลืมทำรหัสให้สั้นที่สุดเนื่องจากนี่เป็นความท้าทายของนัก !

แก้ไข: ฉันเชื่อว่ามีวิธี / มาตรฐานที่ต้องการเสมอในการแสดงจำนวนเต็มเป็นตัวเลขโรมัน (เช่น95-> XCVแทนVC) ฉันพบความคิดเห็นของฉันยืนยันทางออนไลน์ หากมีข้อสงสัยให้ใช้ตัวแปลงแบบออนไลน์เนื่องจากรายชื่อกรณีขอบที่เป็นไปได้ทั้งหมดและกฎเฉพาะของการเขียนตัวเลขโรมันไม่ใช่ประเด็นของการท้าทายนี้

EDIT2: @PeterTaylor และ @GregMartin ชี้ให้เห็นว่าตัวเลขเท่านั้นน้อยกว่าหรือเท่ากับ5ปรากฏในลำดับดังนั้นคุณจึงไม่ต้องกังวลเกี่ยวกับความคลุมเครือของเลขโรมัน (ตัวเลข1- 8มีI, II, III, IV, V, VI, VIIและVIII)


ไม่มีนิพจน์เลขโรมันที่ไม่ซ้ำสำหรับแต่ละจำนวนเต็ม จำเป็นต้องแสดงตัวเลขใดและการแสดงตัวเลขใดบ้างที่ถูกต้อง
Peter Taylor

คุณหมายถึงอะไรโดย "ไม่มีตัวเลขโรมันที่ไม่ซ้ำกันสำหรับแต่ละจำนวนเต็ม"? กดไลค์4/ IV/ IIII? หรือ95/ XCV/ VC? อาจไม่ใช่วิธีที่ไม่ซ้ำกันในการแสดงจำนวนเต็ม แต่ฉันค่อนข้างแน่ใจว่ามีเสมอ (มาตรฐาน) ที่ต้องการหนึ่ง - แก้ไขฉันถ้าฉันผิด
shooqie

1
ไกลแค่ไหนที่เราต้องไปกับเลขโรมันของเรา?
Maltysen

ใช่ทั้งสองกรณี ในกรณีที่สองฉันคิดว่ามันเป็นเรื่องของความคิดเห็นที่ดีกว่า
Peter Taylor

9
@shooqie หากรายละเอียดเหล่านี้ไม่ชัดเจนคุณจะเปรียบเทียบคำตอบได้อย่างไร หากมีกรณีขอบบางอย่างที่เหลือเพื่อตีความคะแนนจริงกลายเป็นความหมายเพราะพวกเขาอาจสร้างความแตกต่างที่ใหญ่กว่าเทคนิคการเล่นกอล์ฟใด ๆ ที่คุณอาจเกิดขึ้น
Martin Ender

คำตอบ:


17

Perl, 49 ไบต์

รวม +1 สำหรับ -p

เรียกใช้ด้วยดัชนีแบบ 0 บน STDIN เช่น

ecce.pl <<< 14

ecce.pl:

#!/usr/bin/perl -p
s,(.)\1*,$&/$1%182 .$1,eg for($_=/$/)x$`;y;19;IV

สูตรเวทย์มนตร์วิเศษมาก

โดยปกติฉันจะใช้($_=//)x$'เพื่อทำให้การควบคุมแบบวนซ้ำสั้นลงหนึ่งไบต์ แต่การให้คะแนนในเว็บไซต์นี้จะให้แต้มต่อ 2 ดังนั้นจึงจบลงที่ 1 ไบต์นานขึ้น คุณสามารถวางช่องว่างก่อนหน้าforนี้ได้ perl บางรุ่นบังคับให้คุณเพิ่มสุดท้าย;เพื่อปิดการทับศัพท์ แต่สิ่งที่ให้ไว้ข้างต้นคือรหัสที่ทำงานบนระบบของฉัน

คำอธิบาย

ทำงานย้อนกลับจากโซลูชันไปยังโค้ด:

การแปลงสตริงที่เราต้องการ:

I     -> II
II    -> III
III   -> IIII
IIII  -> IVI
IIIII -> VI

V     -> IV
VV    -> IIV

การแทนที่แต่ละครั้งจะจบลงด้วยอักขระซ้ำ ฉันจะได้รับลำดับของตัวอักษรเดียวกันโดยใช้นิพจน์ทั่วไปดังนั้นนี้สามารถทำได้โดยท้าย/(.)\1*/ $1ส่วนก่อนที่จะมี->อยู่ใน$&อยู่ในด้วยที่ฉันยังต้องการ:

I     -> I
II    -> II
III   -> III
IIII  -> IV
IIIII -> V

V     -> I
VV    -> II

เขียนIเป็น1และVเป็น 9:

1     -> 1
11    -> 11
111   -> 111
1111  -> 19
11111 -> 9

9     -> 1
99    -> 11

ด้วยการหารส่วนก่อน->ด้วยตัวเลขซ้ำจะกลายเป็น:

1     -> 1
11    -> 11
111   -> 111
1111  -> 19
11111 -> 9

1     -> 1
11    -> 11

ดังนั้นตอนนี้การทำซ้ำต้นฉบับVจึงไม่ใช่ข้อยกเว้นอีกต่อไป ดังนั้นฉันต้องการแสดงออกที่ทำให้สิ่งนี้เกิดขึ้น:

1     -> 1
11    -> 11
111   -> 111
1111  -> 19
11111 -> 9

และสิ่งนี้สามารถทำได้โดย modulo แบบง่าย 182:

1     % 182 = 1
11    % 182 = 11
111   % 182 = 111
1111  % 182 = 19
11111 % 182 = 9

(แม้จะได้รับIIIIIIไปVIทางขวาถึงแม้ว่ามันจะไม่จำเป็นต้องที่นี่)

ทั้งหมดที่เหลืออยู่คือการเริ่มต้นตัวแปรการทำงานเพื่อ1สำหรับดัชนี 0 ทำซ้ำการแปลงนี้ในวงและในตอนท้ายแทนที่1ด้วยIและ9โดยV

1, 9และ182เป็นชุดพารามิเตอร์เท่านั้นซึ่งงานนี้ง่ายสูตร


2
นี่คืออัจฉริยะ! :)
ลินน์

10

Mathematica, 113 90 83 ไบต์

ขอบคุณ Martin Ender สำหรับคำแนะนำที่ลดความยาวได้มากกว่า 25%!

แสดงคำสั่งระดับสูงใน Mathematica

Nest[Flatten[Characters@{RomanNumeral@#,#2}&@@@Reverse@@@Tally/@Split@#]&,{"I"},#]&

ฟังก์ชั่นแท้รับอาร์กิวเมนต์ N และส่งออกองค์ประกอบที่ N ของลำดับ (0 ดัชนี) นี้เป็นรายการของตัวละคร กระจายออกไปเล็กน้อย:

Nest[
  Flatten[
    Characters @ {RomanNumeral@#,#2}& @@@
      Reverse @@@ Tally /@ Split@ #
    ]& ,
  {"I"}, #]&

ด้านนอก Nestซ้ำฟังก์ชันสี่บรรทัดกลางเริ่มต้น{"I"}ครั้ง N บรรทัดที่ 4 แยกรายการอักขระของตัวเลขโรมันอินพุตเข้าเป็นจำนวนอักขระที่เหมือนกันนับจำนวนการรันแต่ละครั้งTallyและวางจำนวนก่อนอักขระที่พวกเขากำลังนับ บรรทัดที่ 3 แสดงการนับเป็นตัวเลขโรมันจากนั้นแยกตัวเลขโรมันเหล่านั้นออกเป็นรายการของอักขระ Flattenคำสั่งลดรายการของรายการทั้งรายการหนึ่งมิติ

นี่คือรุ่นเริ่มต้น:

Nest[
  "" <> Flatten[{RomanNumeral@#[[1]], #[[2]]} & /@
    (Reverse@#[[1]] & /@ 
      Tally /@
        Split@Characters@#)] &,
  "I", #] &

3
Grrr Mathematica;)
สลายตัวเบต้า

ถ้าคุณใช้@@@แทน/@คุณสามารถใช้#และ#2แทนและ#[[1]] นอกจากนี้ยังมีรายชื่อของตัวละครประเภทสตริงที่ยอมรับได้เพื่อให้คุณสามารถทำงานร่วมกับเหล่านั้นและหลีกเลี่ยงการใช้#[[2]] Characters@
Martin Ender

@ มาร์ตินอีกครั้ง Aha ฉันรู้ว่าต้องมี@@@ทางลัดเหมือน! สำหรับรายการของตัวละครที่เป็นประเภทสตริงที่ยอมรับได้ (ซึ่งฉันยอมรับจะย่อรหัส): มีโพสต์ในเว็บไซต์นี้ที่คุณสามารถชี้ให้ฉันอธิบายที่เป็นมาตรฐานชุมชนได้หรือไม่?
Greg Martin


1
ไม่กี่เงินฝากออมทรัพย์เพิ่มเติมได้ที่: Charactersหัวข้อโดยอัตโนมัติเพื่อให้คุณสามารถใช้@, Reverse@#&เป็นหลักสูตรเดียวกับธรรมดาReverseในกรณีที่คุณยังไม่จำเป็นต้องวงเล็บเหล่านั้น และสัญกรณ์คำนำหน้า (ในกรณีของFlatten) ไม่ได้บันทึกอะไรเลยถ้าคุณต้องการที่จะเพิ่มวงเล็บเพื่อให้มันทำงานได้ รวมทุกอย่างเข้าด้วยกัน:Nest[Flatten[Characters@{RomanNumeral@#,#2}&@@@Reverse@@@Tally/@Split@#]&,{"I"},#]&
Martin Ender

8

CJam ( 33 30 ไบต์)

"I"{e`{(4md1$^'I*\'V*@}%e_}ri*

การสาธิตออนไลน์

กุญแจสำคัญในความถูกต้องของการใช้งานเป็นทฤษฎีบทต่อไปนี้:

หากรุ่นแรกIไม่มีความยาวการวิ่งเกินกว่าห้าระดับ

แทรก: ถ้ารุ่นแรกคือสตริงไม่เคยมีI VVVพิสูจน์ได้จากความขัดแย้ง สมมติว่ามีความเป็นดัชนีแรกnซึ่งnรุ่น TH VVVมี หากว่าVVVแบ่งลงเป็น(a)V VV(a+5)Vแล้วแปลงมาจากรุ่นก่อนหน้านี้ไม่ดีมันควรจะได้รับ ดังนั้นจะต้องเป็นVV V(d)และรุ่นก่อนหน้ามีอยู่VVVVVขัดแย้งกับทางเลือกของnขัดแย้งทางเลือกของ

ตอนนี้สมมติว่ามีความเป็นดัชนีแรกmซึ่งmรุ่น TH ...IIIIII...มี โปรดทราบว่าจะต้องไม่มีตัวเลขอื่นนอกเหนือจากIและVในสตริงเนื่องจากไม่มีรุ่นก่อนหน้านี้ที่มีการเรียกใช้เก้าIs หรือเก้าVs ที่มากที่สุดสี่Is มาจากการทำงานของIในสตริงก่อนหน้านี้เพื่อให้ส่วนที่สอดคล้องกันของสตริงก่อนหน้านี้ที่จะต้องให้...IIIVV... ... IIII IIV ...ตั้งแต่VVในยุคที่m-1ไม่ได้มาจากVVVVV(ดูแทรก) ที่สองVจะต้องวิ่งยาวของหลักIดังนั้นในรุ่นที่เรามีm-1 ...IIIVVI...และเนื่องจากเราต้องการค่าเริ่มต้นIที่จะให้IIIIและไม่IVIหรือVIVมันจะนำหน้าทั้งโดยจุดเริ่มต้นของสตริงหรือโดยที่

ถ้าเรามี(...V)?IIIVVI...ในรุ่นm-1เรามีm-2อะไรในรุ่น? เราได้สังเกตุดูแล้วว่าในVVgen จะต้องมีการแยกวิเคราะห์เป็นm-1(a)V V(I)

สมมติว่าเราใช้a=2: (...V)?I IIV VI...จริง ๆ แล้วมันจะต้องมี...VI IIV VI...แม้ว่าผู้นำที่Vอาจเป็นส่วนหนึ่งของIV; ดังนั้นในรุ่นก่อนหน้านี้ที่เรามีอย่างใดอย่างหนึ่งหรือ(...V)? IIII VV IIIII... (...V)? IIIII VV IIIIIไม่ว่าเราจะประสบปัญหาด้วยวิธีใดVVIIIII: วิธีที่สองVจะต้องใช้ความยาว แต่...VI IIII...ต้องใช้คู่ต่อไปนี้ (ความยาวหลักยาว) ที่มีตัวเลขเดียวกัน

ดังนั้นจะต้องเป็นa=1: (...V)?II IV VI.... เนื่องจากรุ่นmเป็นรุ่นแรกที่มีขนาดหกIวินาทีต้องเป็น(...V)? II IV VI...เช่นนั้นรุ่นm-2จึงเป็น(...V)? I V IIIII...เป็น...VIVIIIII...เป็นไปไม่ได้: อย่างไรก็ตามเราเลือกที่จะแปลความหมายที่สองที่Vเราลงท้ายด้วยคู่ที่ต่อเนื่องกัน (หลักความยาวหลัก) ที่มีตัวเลขเดียวกัน

ดังนั้นรุ่นm-2จะต้อง^IVIIIII...แจงเป็นหรือ^IV IIII I(V)... ^IV III II(V)...สิ่งเหล่านี้ให้รุ่นตามลำดับm-3เป็น^V III V ...^V II VV...หรือ

แต่ถ้าเราดูที่จุดเริ่มต้นของสตริงเริ่มต้นด้วยสตริงแรกที่เริ่มต้นด้วยVเราจะได้วัฏจักร:

    VI IV I...
    IV III IV ...
    II IV IVI ...
    IIII IV II IV ...

และไม่มีรุ่นใดเริ่มต้นด้วยVIIIVหรือVIIVVหรือเราต้องสรุปว่าไม่มีเช่นmนั้น

การผ่า

"I"          e# Initial generation
{            e# Loop...
  e`         e#   Run-length encode
  {          e#   Foreach [run-length char] pair...
    (        e#     Extract the run-length r
    4md1$^   e#     Get the number of Vs and the number of Is
             e#     The number of Vs is r/4 ; the number of Is is (r%4)^(r/4)
    'I*\'V*@ e#     Repeat strings the appropriate number of times and reorder
  }%
  e_         e#  Flatten to a simple string
}ri*         e# ... n times, where n is taken from stdin

6

Python 3, 195 ไบต์

มีจำนวนไบต์ที่สูญเสียไปกับตัวเลขโรมันดังนั้นจึงมีความเป็นไปได้ที่จะเล่นกอล์ฟที่นั่น

ขอบคุณ @ El'endiaStarman, @ Sherlock9 และ @Shooqie

import re
def f(x,r=""):
 for v,i in(5,"V"),(4,"IV"),(1,"I"):a,x=divmod(x,v);r+=i*a
 return r
s="I"
for i in[0]*int(input()):print(s);s=re.sub(r'(.)\1*',lambda m:f(len(m.group()))+m.group()[0],s)

ไอเดียมัน!


คุณสามารถเว้นวงเล็บเหลี่ยมได้:for v,i in(5,"V"),(4,"IV"),(1,"I")
shooqie

@shooqie ฉันไม่รู้ว่าคุณสามารถทำได้: D
Beta Decay

for v,i in(5,"V"),(4,"IV"),(1,"I"):a,x=divmod(x,v);r+=i*aบันทึกเป็นไบต์
Sherlock9

@ βετѧΛєҫαγ: ดูเหมือนว่าคุณไม่ได้ใช้i(เหมือนในfor i in range(...)) ฉันพยายามเล่นน้ำด้วยexecวิธีนี้ แต่การหลบหนี1ในวิธีการ 'ย่อย' ดูเหมือนจะทำให้รหัสยุ่งเหยิงฉันไม่สามารถหาวิธีแก้ปัญหาได้
shooqie

@ shooqie ฉันสั้นลงเล็กน้อยโดยกำจัดrange
Beta Decay

4

R, 110 107 Bytes

as.romanรวมกับrleทำให้ง่าย การกำหนดขอบเขตการใช้งานในทางที่ผิดและสร้างแมวของการ<<-บันทึกไม่กี่ไบต์

x="I"
replicate(scan(),{r=rle(strsplit(x,"")[[1]])
x<<-paste(rbind(paste(as.roman(r$l)),r$v),collapse="")})

ใช้เวลาใน N จากคอนโซล ส่งออกข้อตกลงลำดับที่ 2 ถึง N แรก (ซึ่งฉันเชื่อว่าอยู่ในข้อมูลจำเพาะ ... )

 [1] "II"                                                                                                                                                                                                                                     
 [2] "III"                                                                                                                                                                                                                                    
 [3] "IIII"                                                                                                                                                                                                                                   
 [4] "IVI"                                                                                                                                                                                                                                    
 [5] "IIIVII"                                                                                                                                                                                                                                 
 [6] "IIIIIVIII"                                                                                                                                                                                                                              
 [7] "VIIVIIII"                                                                                                                                                                                                                               
 [8] "IVIIIIVIVI"                                                                                                                                                                                                                             
 [9] "IIIVIVIIVIIIVII"                                                                                                                                                                                                                        
[10] "IIIIIVIIIVIIIIVIIIIIVIII"                                                                                                                                                                                                               
[11] "VIIVIIIIIVIVIIVVIIVIIII"                                                                                                                                                                                                                
[12] "IVIIIIVVIIVIIIVIIIIIVIIIIVIVI"                                                                                                                                                                                                          
[13] "IIIVIVIIIVIIIIVIIIIIVVIIVIVIIVIIIVII"                                                                                                                                                                                                   
[14] "IIIIIVIIIVIIIIIVIVIIVVIIIVIIIIVIIIVIIIIVIIIIIVIII"                                                                                                                                                                                      
[15] "VIIVIIIIIVVIIVIIIVIIIIIVIIIIIVIVIIVIIIIIVIVIIVVIIVIIII"                                                                                                                                                                                 
[16] "IVIIIIVVIIIVIIIIVIIIIIVVIIVVIIVIIIVIIIIVVIIVIIIVIIIIIVIIIIVIVI"                                                                                                                                                                         
[17] "IIIVIVIIIVIIIIIVIVIIVVIIIVIIIIIVIIIIVIIIIIVIVIIIVIIIIVIIIIIVVIIVIVIIVIIIVII"                                                                                                                                                            
[18] "IIIIIVIIIVIIIIIVVIIVIIIVIIIIIVIIIIIVVIIVIVIIVVIIVIIIVIIIIIVIVIIVVIIIVIIIIVIIIVIIIIVIIIIIVIII"                                                                                                                                           
[19] "VIIVIIIIIVVIIIVIIIIVIIIIIVVIIVVIIIVIIIIVIIIVIIIIIVIIIIVIIIIIVVIIVIIIVIIIIIVIIIIIVIVIIVIIIIIVIVIIVVIIVIIII"                                                                                                                              
[20] "IVIIIIVVIIIVIIIIIVIVIIVVIIIVIIIIIVIIIIIVIVIIVIIIIIVVIIVIVIIVVIIIVIIIIVIIIIIVVIIVVIIVIIIVIIIIVVIIVIIIVIIIIIVIIIIVIVI"                                                                                                                    
[21] "IIIVIVIIIVIIIIIVVIIVIIIVIIIIIVIIIIIVVIIVVIIVIIIVIIIIVVIIIVIIIIVIIIVIIIIIVIIIIIVIVIIVVIIIVIIIIIVIIIIVIIIIIVIVIIIVIIIIVIIIIIVVIIVIVIIVIIIVII"                                                                                             
[22] "IIIIIVIIIVIIIIIVVIIIVIIIIVIIIIIVVIIVVIIIVIIIIIVIIIIVIIIIIVIVIIIVIIIIIVIVIIVIIIIIVVIIVVIIVIIIVIIIIIVIIIIIVVIIVIVIIVVIIVIIIVIIIIIVIVIIVVIIIVIIIIVIIIVIIIIVIIIIIVIII"                                                                      
[23] "VIIVIIIIIVVIIIVIIIIIVIVIIVVIIIVIIIIIVIIIIIVVIIVIVIIVVIIVIIIVIIIIIVVIIVIIIVIIIIVVIIIVIIIIIVIIIIVIIIIIVVIIVVIIIVIIIIVIIIVIIIIIVIIIIVIIIIIVVIIVIIIVIIIIIVIIIIIVIVIIVIIIIIVIVIIVVIIVIIII"                                                   
[24] "IVIIIIVVIIIVIIIIIVVIIVIIIVIIIIIVIIIIIVVIIVVIIIVIIIIVIIIVIIIIIVIIIIVIIIIIVVIIIVIIIIVIIIIIVIVIIIVIIIIIVVIIVIVIIVVIIIVIIIIIVIIIIIVIVIIVIIIIIVVIIVIVIIVVIIIVIIIIVIIIIIVVIIVVIIVIIIVIIIIVVIIVIIIVIIIIIVIIIIVIVI"                             
[25] "IIIVIVIIIVIIIIIVVIIIVIIIIVIIIIIVVIIVVIIIVIIIIIVIIIIIVIVIIVIIIIIVVIIVIVIIVVIIIVIIIIIVIVIIVVIIVIIIVIIIIIVVIIIVIIIIVIIIVIIIIIVIIIIIVVIIVVIIVIIIVIIIIVVIIIVIIIIVIIIVIIIIIVIIIIIVIVIIVVIIIVIIIIIVIIIIVIIIIIVIVIIIVIIIIVIIIIIVVIIVIVIIVIIIVII"

1

JavaScript (ES6), 107

ฟังก์ชันแบบเรียกซ้ำส่งคืนค่า Nth term 0 ตาม

f=(n,r='I')=>n?f(n-1,r.match(/I+|V+/g).map(x=>((n=x.length)-4?'VIII'.slice(n<5,1+n%5):'IV')+x[0]).join``):r

ทดสอบ

f=(n,r='I')=>n?f(n-1,r.match(/I+|V+/g).map(x=>((n=x.length)-4?'VIII'.slice(n<5,1+n%5):'IV')+x[0]).join``):r

function update() {
  O.textContent=f(I.value)
}

update()
<input id=I value=25 type=number oninput='update()'><pre id=O></pre>


1

Perl 6 , 62 ไบต์

{("I",{S:g/(.)$0*/{<I II III IV V>[$/.chars-1]~$0}/}...*)[$_]}

ฟังก์ชั่นไม่ระบุชื่อที่ยอมรับดัชนีเป็นศูนย์

ทำให้การใช้ความจริงที่ว่าตัวเลขโรมันที่สูงกว่า 5 ไม่จำเป็นเพราะกลุ่มเฉพาะตัวเลขซ้ำที่สามารถเกิดขึ้นได้คือ:

I     -> II
II    -> III
III   -> IIII
IIII  -> IVI
IIIII -> VI

V     -> IV
VV    -> IIV

( ลองออนไลน์ )

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