เติมลำดับที่เพิ่มขึ้นด้วยตัวเลขให้ได้มากที่สุด


29

รายการตัวเลขเรียกว่าการเพิ่ม monotonically (หรือไม่ลดลง) คือทุกองค์ประกอบมีค่ามากกว่าหรือเท่ากับองค์ประกอบก่อนหน้า

ตัวอย่างเช่น1, 1, 2, 4, 5, 5, 5, 8, 10, 11, 14, 14เพิ่มขึ้นซ้ำซากจำเจ

ให้รายการเลขจำนวนเต็มบวกที่เพิ่มขึ้นแบบ monotonically ที่มีจำนวนจุดว่างว่างแทนโดย?เติมจุดว่างด้วยจำนวนเต็มบวกเช่นจำนวนเต็มที่ไม่ซ้ำกันมากที่สุดที่มีอยู่ในรายการ แต่ก็ยังคงเพิ่มขึ้นแบบจำเจ

อาจมีหลายวิธีในการทำสิ่งนี้ให้สำเร็จ ใด ๆ ที่ถูกต้อง

เอาท์พุทรายการผลลัพธ์

ตัวอย่างเช่นถ้าอินพุตเป็น

?, 1, ?, 1, 2, ?, 4, 5, 5, 5, ?, ?, ?, ?, 8, 10, 11, ?, 14, 14, ?, ?

มันรับประกันได้ว่าไม่มีจุดที่ว่างเปล่ารายการจะเพิ่มขึ้นซ้ำซาก

1, 1, 2, 4, 5, 5, 5, 8, 10, 11, 14, 14

และงานของคุณคือการกำหนดจำนวนเต็มบวกให้กับแต่ละคน?เพื่อเพิ่มจำนวนของจำนวนเต็มที่แตกต่างกันในรายการในขณะที่ทำให้มันไม่ลดลง

หนึ่งการมอบหมายที่ไม่ถูกต้องคือ

1, 1, 1, 1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 5, 8, 10, 11, 14, 14, 14, 14, 14

เพราะในขณะที่มันไม่ได้ถูกลบมันจะมีจำนวนเต็มมากกว่าหนึ่งตัวเท่านั้นคือ 3ก็มีจำนวนเต็มไม่ซ้ำกันมากขึ้นกว่าการป้อนข้อมูลคือ

ในตัวอย่างนี้มีความเป็นไปได้ที่จะแทรกจำนวนเต็มบวกจำนวนเต็มหกตัวและเก็บรายการไว้โดยไม่ลดลง
สองวิธีที่เป็นไปได้คือ:

1, 1, 1, 1, 2, 3, 4, 5, 5, 5, 6, 7, 8, 8, 8, 10, 11, 12, 14, 14, 15, 16

1, 1, 1, 1, 2, 3, 4, 5, 5, 5, 5, 6, 6, 7, 8, 10, 11, 13, 14, 14, 20, 200

อย่างใดอย่างหนึ่งเหล่านี้ (และอื่น ๆ อีกมากมาย) จะเป็นผลลัพธ์ที่ถูกต้อง

ต้องใส่จุดที่ว่างเปล่าทั้งหมด

ไม่มีขีด จำกัด สูงสุดของจำนวนเต็มที่สามารถแทรกได้ มันก็โอเคถ้าจำนวนเต็มขนาดใหญ่มากถูกพิมพ์ด้วยสัญลักษณ์ทางวิทยาศาสตร์

ศูนย์ไม่ใช่จำนวนเต็มบวกและไม่ควรแทรก

ในสถานที่ของ?คุณอาจใช้ค่าสอดคล้องใด ๆ ที่ไม่ได้เป็นจำนวนเต็มบวกเช่น0, -1, null, หรือFalse""

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

ตัวอย่างเพิ่มเติม

[input]
[one possible output] (a "*" means it is the only possible output)

2, 4, 10
2, 4, 10 *

1, ?, 3
1, 2, 3 *

1, ?, 4
1, 2, 4

{empty list}
{empty list} *

8
8 *

?
42

?, ?, ?
271, 828, 1729

?, 1
1, 1 *

?, 2
1, 2 *

?, 3
1, 3

45, ?
45, 314159265359

1, ?, ?, ?, 1
1, 1, 1, 1, 1 *

3, ?, ?, ?, ?, 30
3, 7, 10, 23, 29, 30 

1, ?, 2, ?, 3, ?, 4
1, 1, 2, 3, 3, 3, 4

1, ?, 3, ?, 5, ?, 7
1, 2, 3, 4, 5, 6, 7 *

1, ?, 3, ?, 5, ?, ?, 7
1, 2, 3, 4, 5, 6, 7, 7

1, ?, ?, ?, ?, 2, ?, ?, ?, ?, 4, ?, 4, ?, ?, 6
1, 1, 1, 1, 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 6, 6

98, ?, ?, ?, 102, ?, 104
98, 99, 100, 101, 102, 103, 104 *

อาจเป็นวิธีที่ดีกว่าในการระบุปัญหาที่มีการป้อนข้อมูลอย่างเข้มงวดคู่เอาท์พุทสำหรับการตรวจสอบจะเป็น "จำนวนตัวเลขที่แตกต่างกันที่เป็นไปได้สูงสุดในลำดับ" คืออะไร ด้วยวิธีนี้คำตอบทั้งหมดจะส่งออกหมายเลขเดียวกันและทำให้การประเมินผลกรณีทดสอบง่ายขึ้นมากขึ้น
Cruncher

@StewieGriffin คุณสามารถสมมติว่าค่ารายการและความยาวต่ำกว่าค่าสูงสุด int ตามปกติ ฉันแค่หมายความว่ามันก็โอเคที่จะใส่จำนวนเต็มขนาดใหญ่มากในตอนท้ายถ้านั่นเป็นวิธีที่อัลกอริทึมของคุณทำงาน
งานอดิเรกของ Calvin

คำตอบ:


11

Haskell , 41 ไบต์

fใช้รายการและส่งคืนรายการโดยมีค่า 0 เป็น?s

f=scanr1 min.tail.scanl(#)0
m#0=m+1
_#n=n

โดยทั่วไปสแกนรายการแรกจากซ้ายแทนที่ 0s หนึ่งมากกว่าองค์ประกอบก่อนหน้า (หรือ 0 ที่เริ่มต้น); จากนั้นสแกนจากขวาเพื่อลดองค์ประกอบที่มีขนาดใหญ่เกินไปให้เท่ากับองค์ประกอบทางด้านขวา

ลองออนไลน์! (พร้อม wrapper เพื่อแปลง?s.)


4

Mathematica, 84 ไบต์

Rest[{0,##}&@@#//.{a___,b_,,c___}:>{a,b,b+1,c}//.{a___,b_,c_,d___}/;b>c:>{a,c,c,d}]&

ฟังก์ชั่นบริสุทธิ์รับรายการเป็นอาร์กิวเมนต์ที่จุดว่างจะแสดงโดยNull(ใน{1, Null, Null, 2, Null}) หรือลบทั้งหมด (เหมือนใน{1, , , 2, }) และกลับรายการที่เหมาะสม (ในกรณีนี้{1, 2, 2, 2, 3})

กลับกลายเป็นว่าฉันใช้อัลกอริทึมแบบเดียวกับในคำตอบของØrjan Johansen ของ Haskell : ก่อนอื่นให้แทนที่Nullด้วยตัวเลขทางซ้าย (มากกว่า//.{a___,b_,,c___}:>{a,b,b+1,c}) ทางซ้าย ( ) จากนั้นแทนที่จำนวนที่มากเกินไปด้วยตัวเลขทางด้านขวา ( //.{a___,b_,c_,d___}/;b>c:>{a,c,c,d}) ในการจัดการกับNulls ที่เป็นไปได้ที่จุดเริ่มต้นของรายการเราเริ่มต้นด้วยการเติม a 0( {0,##}&@@#) ทำอัลกอริธึมแล้วลบ initial 0( Rest)

ใช่ฉันเลือกNullแทนXหรืออะไรทำนองนั้นในการบันทึกหนึ่งไบต์ในโค้ด (อันที่จะอยู่ระหว่างเครื่องหมายจุลภาคของb_,,c___)


อืมท่านกำลังพูดถึง 1 คน ผมใช้ 0 ?, 2เพราะสิ่งที่ต้องการ ฉันสงสัยว่าคุณก็จะผลิตแทนการใช้ที่ถูกต้อง2, 2 1, 2
Ørjan Johansen

จุดสุดยอด! โชคดีที่การแก้ไขเป็นเรื่องง่าย
Greg Martin


3

05AB1E , 31 23 13 ไบต์

บันทึก 10 ไบต์ขอบคุณGrimy

ε®X:D>U].sR€ß

ลองออนไลน์!

คำอธิบาย

ε      ]       # apply to each number in input
 ®X:           # replace -1 with X (initially 1)
    D>U        # store current_number+1 in X
        .s     # get a list of suffixes
          R    # reverse
           ۧ  # take the minimum of each

เหตุใดจึงพิมพ์ส่วนหนึ่งของผลลัพธ์เท่านั้น ในตัวอย่าง TIO ของคุณ 1 ตัวแรกหายไป
ทำให้เสียชีวิต

ฉันรู้ว่ามันใช้เวลาสักพักหนึ่งแล้วและมันอาจจะสามารถเล่นกอล์ฟได้มากกว่านี้ แต่ -3 ไบต์กับสนามกอล์ฟง่าย ๆ : ทั้งสอง}}สามารถ]บันทึกได้ 2 ไบต์; และõ-)Rสามารถ)˜Rบันทึกไบต์เพิ่มเติมได้
Kevin Cruijssen

2
@KevinCruijssen: อันที่จริงมันอาจ :)
Emigna

1
มันยังสามารถ! 16 , 15 , 13
Grimmy

@Grimy: ว้าวขอบคุณมาก! เคล็ดลับต่อท้ายนั้นฉลาดจริงๆ!
Emigna

2

Pip , 25 23 21 ไบต์

Y{Y+a|y+1}MgW PMNyPOy

รับอินพุตเป็นอาร์กิวเมนต์บรรทัดรับคำสั่งที่คั่นด้วยช่องว่างหลายช่อง เอาต์พุตรายการผลลัพธ์หนึ่งหมายเลขต่อบรรทัด ลองออนไลน์! (ฉัน fudged หลายสิ่งบรรทัดคำสั่ง args เพราะมันเป็นความเจ็บปวดที่จะเพิ่ม 25 ข้อโต้แย้งใน TIO แต่มันก็ทำงานได้ตามที่โฆษณาด้วย)

คำอธิบาย

เราดำเนินการสองรอบ ก่อนอื่นเราจะแทนที่การวิ่งทุกครั้ง?ในอินพุตด้วยลำดับเริ่มต้นจากหมายเลขก่อนหน้าในรายการและเพิ่มขึ้นทีละครั้ง:

? 1 ? 1 2 ? 4 5 5 5 ? ? ? ? 8 10 11 ?  14 14 ?  ?
1 1 2 1 2 3 4 5 5 5 6 7 8 9 8 10 11 12 14 14 15 16

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

                      y is initially "", which is 0 in numeric contexts
                      Stage 1:
 {       }Mg           Map this function to list of cmdline args g:
   +a                  Convert item to number: 0 (falsey) if ?, else nonzero (truthy)
     |                 Logical OR
      y+1              Previous number +1
  Y                    Yank that value into y (it is also returned for the map operation)
Y                      After the map operation, yank the whole result list into y
                      Stage 2:
            W          While loop, with the condition:
               MNy      min(y)
              P         printed (when y is empty, MN returns nil, which produces no output)
                  POy  Inside the loop, pop the leftmost item from y

2

Python 2 ที่มี NumPy ขนาด 163 ไบต์

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

เลขศูนย์ใช้ทำเครื่องหมายจุดที่ว่างเปล่า

import numpy
l=[1]+input()
z=numpy.nonzero(l)[0]
def f(a,b):
 while b-a-1:a+=1;l[a]=l[a-1]+1;l[a]=min(l[a],l[b])
i=1
while len(z)-i:f(z[i-1],z[i]);i+=1
print l[1:]

อ่านเพิ่มเติมพร้อมกับความคิดเห็น:

import numpy
l=[1]+input()           # add 1 to the begining of list to handle leading zeros
z=numpy.nonzero(l)[0]   # get indices of all non-zero values
def f(a,b):             # function to fill gap, between indices a and b
    while b-a-1:
        a+=1
        l[a]=l[a-1]+1   # set each element value 1 larger than previous element
        l[a]=min(l[a],l[b])   # caps it by value at index b
i=1
while len(z)-i:       
    f(z[i-1],z[i])      # call function for every gap
    i+=1
print l[1:]             # print result, excluding first element, added at the begining

1
การปรับปรุงบางอย่าง: if l[a]>l[b]:l[a]=l[b]สามารถl[a]=min(l[a],l[b])และจากนั้นก็สามารถอยู่ที่บรรทัดก่อนหน้านั้น whileนอกจากนี้หมายถึงว่าสายทั้งสามารถใส่หลัง และฉันคิดว่าl=input()และl=[1]+lสามารถเป็นได้l=[1]+input()(โดยทั่วไป: ถ้าคุณใช้การเยื้องสองระดับคุณสามารถใช้ช่องว่างและแท็บแทนช่องว่างและช่องว่างสองช่องใน Python 2 (ดูcodegolf.stackexchange.com/a/58 ) )
wythagoras

1
นอกจากนี้บรรทัดถัดไปอาจเป็นได้len(z)-i:f(z[i-1],z[i]);i+=1เมื่อเริ่มต้นด้วย i = 1
wythagoras

@wythagoras ขอบคุณคำแนะนำที่ดี ฉันได้เพิ่มสิ่งนี้ลงในรหัส
Dead Possum

ดีมาก แต่มันเป็นเพียง 163 ไบต์
wythagoras

@wythagoras โอ้ฉันลืมอัปเดตจำนวนไบต์
Dead Possum

1

PHP, 95 77 71 69 68 ไบต์

for($p=1;$n=$argv[++$i];)echo$p=$n>0?$n:++$p-in_array($p,$argv)," ";

รับอินพุตจากอาร์กิวเมนต์บรรทัดคำสั่งพิมพ์รายการที่คั่นด้วยช่องว่าง -nrทำงานด้วย

ทำให้พังถล่ม

for($p=1;$n=$argv[++$i];)   # loop through arguments
    echo$p=                     # print and copy to $p:
    $n>0                            # if positive number
        ?$n                             # then argument
        :++$p                           # else $p+1 ...
            -in_array($p,$argv)         # ... -1 if $p+1 is in input values
    ," ";                       # print space

$nเป็น truthy สตริงใด ๆ "0"แต่สตริงที่ว่างเปล่าและ
$n>0เป็นความจริงสำหรับตัวเลขบวก - และสตริงที่มีพวกเขา


1

Perl 6 , 97 ไบต์

{my $p;~S:g/(\d+' ')?<(('?')+%%' ')>(\d*)/{flat(+($0||$p)^..(+$2||*),(+$2 xx*,($p=$2)))[^+@1]} /}

อินพุตเป็นรายการของค่าหรือสตริงที่คั่นด้วยช่องว่างซึ่ง?ใช้แทนค่าที่จะถูกแทนที่

เอาต์พุตเป็นสตริงที่คั่นด้วยช่องว่างที่มีช่องว่างต่อท้าย

ลองมัน

ขยาย:

{                       # bare block lambda with implicit parameter 「$_」

    my $p;              # holds the previous value of 「$2」 in cases where
                        # a number is sandwiched between two replacements

    ~                   # stringify (may not be necessary)
    S                   # replace
    :global
    /
        ( \d+ ' ' )?    # a number followed by a space optionally ($0)

        <(              # start of replacement

          ( '?' )+      # a list of question marks
          %%            # separated by (with optional trailing)
          ' '           # a space

        )>              # end of replacement

        (\d*)           # an optional number ($2)

    /{                  # replace with the result of:

        flat(

          +( $0 || $p ) # previous value or 0
          ^..           # a range that excludes the first value
          ( +$2 || * ), # the next value, or a Whatever star

          (
            +$2 xx *,   # the next value repeated endlessly

            ( $p = $2 ) # store the next value in 「$p」
          )

        )[ ^ +@1 ]      # get as many values as there are replacement chars
    } /                 # add a space afterwards
}

ฉันไม่รู้ Perl 6 แต่ใน Perl 5 คุณสามารถใช้$"แทน' 'การโกนไบต์ได้ ใช้งานได้ที่นี่หรือไม่
msh210

@ msh210 ตัวแปรเกือบทั้งหมดหายไปหรือมีชื่อที่ยาวกว่า $!เกี่ยวกับเพียงคนเดียวที่ยังคงมีอยู่และมีจุดประสงค์เดียวกันคือ ( $/มีอยู่ แต่ใช้สำหรับ$1$/[1]และ$<a>$/{ qw< a > })
Brad Gilbert b2gills

1

JavaScript (ES6), 65 ไบต์

a=>a.map(e=>a=e||-~a).reduceRight((r,l)=>[r[0]<l?r[0]:l,...r],[])

reduceRightเพราะผมอยากจะใช้ คำอธิบาย: mapแทนที่แต่ละค่าเท็จด้วยค่ามากกว่าหนึ่งค่าก่อนหน้าจากนั้นreduceRightทำงานกลับมาจากจุดสิ้นสุดทำให้มั่นใจได้ว่าไม่มีค่าเกินกว่าค่าต่อไปนี้


1

Q, 63 ไบต์

{1_(|){if[y>min x;y-:1];x,y}/[(|){if[y=0;y:1+-1#x];x,y}/[0,x]]}

เป็นหลักขั้นตอนวิธีการเดียวกับOrjan ฮันเซนของคำตอบ

  • ถือว่า? = 0
  • แทรก 0 ที่จุดเริ่มต้นของอาร์เรย์ในกรณีของ? เมื่อเริ่มต้น
  • สแกนอาร์เรย์ที่แทนที่ 0 ด้วย 1 + องค์ประกอบก่อนหน้า
  • ย้อนกลับอาร์เรย์และสแกนอีกครั้งแทนที่องค์ประกอบที่มากกว่าองค์ประกอบก่อนหน้าด้วยองค์ประกอบก่อนหน้า
  • ย้อนกลับและตัดองค์ประกอบแรกออก (เพิ่ม 0 จากจุดเริ่มต้น)

การใช้ min vs last ถูกใช้เพื่อบันทึกหนึ่งไบต์เนื่องจากสามารถถือว่าอิลิเมนต์สุดท้ายจะเป็นอิลิเมนต์ min ที่เรียงลำดับจากมากไปหาน้อยของอาร์เรย์


คำตอบยอดเยี่ยมยินดีต้อนรับสู่เว็บไซต์! :)
DJMcMayhem

1

TI-Basic (TI-84 Plus CE), 81 ไบต์

not(L1(1))+L1(1→L1(1
For(X,2,dim(L1
If not(L1(X
1+L1(X-1→L1(X
End
For(X,dim(L1)-1,1,-1
If L1(X)>L1(X+1
L1(X+1→L1(X
End
L1

HaskellของØrjan Johansen ที่ตอบโจทย์ TI-Basic ได้อย่างง่ายดาย ใช้ 0 เป็นค่า Null นำข้อมูลจาก L 1

คำอธิบาย:

not(L1(1))+L1(1→L1(1 # if it starts with 0, change it to a 1
For(X,2,dim(L1     # starting at element 2:
If not(L1(X              # if the element is zero
1+L1(X-1→L1(X            # change the element to one plus the previous element
End
For(X,dim(L1)-1,1,-1 # starting at the second-last element and working backwards
If L1(X)>L1(X+1           # if the element is greater than the next
L1(X+1→L1(X               # set it equal to the next
End
L1                   # implicitly return

1

Java 8, 199 164 ไบต์

a->{for(int l=a.length,n,j,x,i=0;i<l;)if(a[i++]<1){for(n=j=i;j<l;j++)if(a[j]>0){n=j;j=l;}for(j=i-3;++j<n-1;)if(j<l)a[j+1]=j<0?1:a[j]+(l==n||a[n]>a[j]|a[n]<1?1:0);}}

ปรับเปลี่ยนอินพุตอาร์เรย์แทนที่จะส่งคืนใหม่เพื่อบันทึกไบต์
ใช้แทน0?

ลองออนไลน์

คำอธิบาย:

a->{                      // Method with integer-array parameter and no return-type
  for(int l=a.length,     //  Length of the input-array
      n,j,x,              //  Temp integers
      i=0;i<l;)           //  Loop `i` over the input-array, in the range [0, length):
    if(a[i++]<1){         //   If the `i`'th number of the array is 0:
                          //   (And increase `i` to the next cell with `i++`)
      for(n=j=i;          //    Set both `n` and `j` to (the new) `i`
          j<l;j++)        //    Loop `j` in the range [`i`, length):
        if(a[j]>0){       //     If the `j`'th number of the array is not 0:
          n=j;            //      Set `n` to `j`
          j=l;}           //      And set `j` to the length to stop the loop
                          //    (`n` is now set to the index of the first non-0 number 
                          //     after the `i-1`'th number 0)
      for(j=i-3;++j<n-1;) //    Loop `j` in the range (`i`-3, `n-1`):
        if(j<l)           //     If `j` is still within bounds (smaller than the length)
          a[j+1]=         //      Set the `j+1`'th position to:
            j<0?          //       If `j` is a 'position' before the first number
             1            //        Set the first cell of the array to 1
            :             //       Else:
             a[j]+        //        Set it to the `j`'th number, plus:
              (l==n       //        If `n` is out of bounds bounds (length or larger)
               ||a[n]>a[j]//        Or the `n`'th number is larger than the `j`'th number
               |a[n]<1?   //        Or the `n`'th number is a 0
                1         //         Add 1
               :          //        Else:
                0);}}     //         Leave it unchanged by adding 0

0

Python 2 , 144 124 119 ไบต์

l=input()
for n in range(len(l)):a=max(l[:n]+[0]);b=filter(abs,l[n:]);b=len(b)and b[0]or-~a;l[n]=l[n]or a+(b>a)
print l

ลองออนไลน์!


ใช้0แทน?


ไม่b=filter(abs,l[n:])เท่ากับb=l[n:] หรือ
Dead Possum

@DeadPossum ตัวกรอง (abs ... กรอง 0 ทั้งหมดออก
ovs

โอ้เอาค่าศูนย์ฉันเข้าใจแล้ว
Dead Possum

0

JavaScript (ES6), 59

ฟังก์ชั่นที่มีอาร์เรย์จำนวนเต็มเป็นอินพุต จุดที่ว่างเปล่าถูกทำเครื่องหมายด้วย0

a=>a.map((v,i)=>v?w=v:(a.slice(i).find(x=>x)<=w?w:++w),w=0)

ทดสอบ

var F=
a=>a.map((v,i)=>v?w=v:(a.slice(i).find(x=>x)<=w?w:++w),w=0)

;[[2, 4, 10]
,[1, 0, 3]
,[1, 0, 4]
,[]
,[8]
,[0]
,[0, 0, 0]
,[0, 1]
,[0, 2]
,[0, 3]
,[45, 0]
,[1, 0, 0, 0, 1]
,[3, 0, 0, 0, 0, 30]
,[1, 0, 2, 0, 3, 0, 4]
,[1, 0, 3, 0, 5, 0, 7]
,[1, 0, 3, 0, 5, 0, 0, 7]
,[1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 4, 0, 0, 6]
,[98, 0, 0, 0, 102, 0, 104]]
.forEach(a=>{
  console.log(a+'\n'+F(a))
})


0

C # (. NET Core) 182 ไบต์

ใช้กลยุทธ์เดียวกับØrjan Johansen

ใช้ 0 ในรายการอินพุตเพื่อทำเครื่องหมาย var ที่ไม่รู้จัก

l=>{if(l[0]<1)l[0]=1;int j;for(j=0;j<l.Length;j++)l[j]=l[j]==0?l[j-1]+1:l[j];for(j=l.Length-2;j>=0;j--)l[j]=l[j]>l[j+1]?l[j+1]:l[j];foreach(var m in l) System.Console.Write(m+" ");};

ลองออนไลน์!


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