เสียบกลับในคืนนี้หรือสุดสัปดาห์นี้


20

นี่คือรหัสกอล์ฟครั้งแรกของฉันดังนั้นโปรดแจ้งให้เราทราบว่ามันกว้างเกินไปหรือหากฉันขาดข้อมูลใด ๆ สำหรับปริศนาที่ดี!

ท้าทาย

ในออนแทรีโอและพื้นที่อื่น ๆ ของโลกจะมีการเรียกเก็บค่าไฟฟ้าโดยใช้การกำหนดราคาตามเวลา (TOU)ซึ่งจะมีค่าใช้จ่ายต่อกิโลวัตต์ชั่วโมงต่อชั่วโมงตามการใช้พลังงาน

ได้รับวันที่และเวลาฉันต้องการทราบว่าฉันอยู่ในช่วงเวลาที่เหมาะสม (สีแดง), ช่วงกลางช่วงสูงสุด (สีเหลือง) หรือช่วงเวลาที่ไม่มาก (สีเขียว)

อินพุต

สมมติว่าอินพุตมีให้ในรูปแบบวันที่และเวลาที่น้อยกว่าISO 8601 ที่ได้รับการยอมรับโดยมีความแม่นยำขั้นต่ำชั่วโมง: YYYY-MM-DDThh[:mm[:ss]](T เป็นตัวอักษร)

ตัวอย่าง

  • 2014-09-01T14
  • 2014-09-01T17: 30
  • 2014-09-01T17: 30: 02

เอาท์พุต

การส่งออกควรเป็นสตริงOn, หรือMidOff

กฎระเบียบ

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

ข้อมูล

ฤดูร้อนวันธรรมดา (1 พฤษภาคมถึง 31 ตุลาคม)

นาฬิกาบอกเวลาในช่วงฤดูร้อนสำหรับวันธรรมดา

  • ปิดยอด: 19h00 - 07h00
  • ช่วงกลางสูงสุด: 07.00 - 11.00 น. และ 17.00 น. - 19.00 น
  • บนยอด: 11h00 - 17h00

วันธรรมดาช่วงฤดูหนาว (1 พฤศจิกายนถึง 30 เมษายน)

นาฬิกาบอกเวลาในช่วงฤดูหนาวสำหรับวันธรรมดา

  • ปิดยอด: 19h00 - 07h00
  • ช่วงกลางสูงสุด: 11h00 - 17h00
  • บนยอดเขา: 07.00 - 11.00 น. และ 17.00 น. - 19.00 น

วันหยุดสุดสัปดาห์

นาฬิกาบอกเวลาในวันหยุดสุดสัปดาห์

  • ปิดยอด: ทุกวัน

คุณแน่ใจหรือไม่ว่าวันธรรมดาในฤดูหนาวไม่มีการสลับระหว่างกลาง - บน / สูงสุด
John Dvorak

3
@ JanDvorak ในฤดูหนาวคนใช้ไฟและความร้อนในตอนเช้าและเย็น ในฤดูร้อนพวกเขาใช้เครื่องปรับอากาศตอนเที่ยง
Peter Taylor

4
นี่เป็นเส้นเขตแดนที่ซ้ำกันของcodegolf.stackexchange.com/q/7008/194 (แยกวิเคราะห์วันที่และทำการคำนวณอย่างง่ายโดยพิจารณาจากว่าเป็นวันทำการหรือไม่) ฉันคิดว่าการพึ่งพาฤดูกาลแตกต่างกันมากพอ แต่คนอื่นอาจไม่เห็นด้วย
Peter Taylor

@ PeterTaylor กฎดูเหมือนง่ายกว่าที่นี่ในคำถามที่เชื่อมโยง เช่นนี้ไม่ต้องจัดการกับปีอธิกสุรทิน
John Dvorak

3
รูปแบบวันที่ทั่วไปควรเป็นYYYY-MM-DDThh[:mm[:ss]]ตั้งแต่วินาทีที่จะสามารถใช้งานได้หากมีการใช้นาทีเท่านั้น
Cruncher

คำตอบ:


3

ทับทิม - 147 144 143 141 137 135

x=->s{y,m,d,h=s.scan(/\d+/).map &:to_i
g=Time.new(y,m,d).wday%6<1?0:[0..11,4..9].count{|r|r===h-7}
%W{Off Mid On}[m<5||m>10?(3-g)%3:g]}

สิ่งนี้แสดงถึงฟังก์ชั่นที่รับสตริงเป็นพารามิเตอร์และส่งคืนสตริง

นี่คือตัวอย่างออนไลน์ที่มีกรณีทดสอบบางส่วน: http://ideone.com/wyIydw


8

Python 2 - 164

from datetime import*
d,t=input().split('T')
y,m,d=map(int,d.split('-'))
t=int(t[:2])
print'OMOfinfd'[(1+((10<t<17)==(4<m<11)))*(date(y,m,d).weekday()<5<6<t<19)::3]

หากจำเป็นด้านล่างคือคำอธิบายของตรรกะในบรรทัดสุดท้าย:

บรรทัดสุดท้ายพิมพ์ส่วนย่อย'OMOfinfd'โดยขึ้นอยู่กับการประเมินผลของเงื่อนไข

  • 1+((10<t<17)==(4<m<11))ครั้งแรกประเมินผลการดำเนินงาน

    หาก XNOR ระหว่างเงื่อนไข10<t<17และ4<m<11เป็นเช่นนี้จะประเมินFalse มิฉะนั้นการดำเนินการจะประเมิน1+False => 1+0 => 11+True => 1+1 => 2

  • สุดท้ายให้คูณผลลัพธ์ของการดำเนินการข้างต้นด้วยว่าวันนั้นเป็นวันทำงานหรือไม่และเวลานั้นอยู่ระหว่าง 6.00 น. - 19.00 น.

    ถ้าเป็นแบบนี้Falseทั้งวันเป็นวันหยุดสุดสัปดาห์หรือเวลาอยู่ระหว่าง 07:00-06:00 (1|2)*0 => 0และผลที่จะได้รับ (1|2)*1 => 1|2มิฉะนั้นผลจะเป็น

เป็นผลมาจาก0การพิมพ์ประสงค์Off, 1จะพิมพ์Midและจะพิมพ์2On


รุ่น golfed ไม่ได้จริง ๆ แล้วเพราะคุณใช้เครื่องหมายอัฒภาค หรือมีการขึ้นบรรทัดใหม่หรือไม่
สลายตัวเบต้า

บรรทัดใหม่มักถูกนับ ใน Notepad ++ (โดยปกติแล้วฉันจะนับ) รุ่น ungolfed คือ 4bytes อีกต่อไปที่ 168.
BeetDemGuise

3
@BeetDemGuise แก้ไข→การแปลง EOL →รูปแบบ UNIX / OSX
Schism

5

C # - 240 220 ตัวอักษร

string x(string s){var d=DateTime.Parse((s+":00:00").Substring(0,19));int h=d.Hour,i=(int)d.DayOfWeek,x=d.Month;string o="off",m="mid",f="on";return i==6|i==0?o:x>=5&x<11?h>18|h<7?o:h>10&h<17?f:m:h>18|h<7?o:h>10&h<17?m:f;}

ไม่มีอะไรพิเศษ. ส่งต่อการเข้ารหัสตรงไปข้างหน้า

ขอบคุณ w0lf :)


1
ฉันคิดว่าคุณสามารถตัดs.Length==13?s+":00:00":s.Length==16?s+":00":sให้สั้นลงได้(s+":00:00").Substring(0,19)
Cristian Lupascu

5

ทับทิม - 135

ละเมิดโมดูลเวลา อินพุตตามอาร์กิวเมนต์บรรทัดรับคำสั่ง

d=Time.new(*$*[0].scan(/\d+/)[0..3])
o,m,f=%w{On Mid Off}
o,m=m,o if (d.mon-5)%10<6
p d.wday%6<1||(12>h=(d.hour+5)%24)?f:15<h&&h<22?m:o

แก้ไข:ขอบคุณ w0lf สำหรับเวลาที่ช่วยย่อและแก้จุดบกพร่อง


โปรแกรมของคุณไม่ถูกต้อง สำหรับการป้อนข้อมูล2014-09-01T17:30ได้อย่างถูกต้องผล"Mid"แต่มันเอาท์พุท2014-09-01T17 "Off"
Cristian Lupascu

3

Groovy - 621 534 524 491 ตัวอักษร

การเล่นกอล์ฟต่อไปต้องทำ แต่ค่อนข้างง่ายเมื่อใช้ Joda-Time

@Grab(group='joda-time',module='joda-time',version='2.3')
f={p,a->org.joda.time.format.DateTimeFormat.forPattern(p).parseDateTime a}
g={p,a->def x=null;try{x=f p,a}catch(Exception e){}}
a=args[0]
d=["",":mm",":mm:ss"].collect{g "yyyy-MM-dd'T'HH$it",a}.find{it}
r="Off"
m="Mid"
j={d,a,b->d.hourOfDay>a&&d.hourOfDay<b}
k={j(it,6,11)||(j(it,16,19))}
if(d.dayOfWeek<6){x=d.monthOfYear;if(x>4&&x<12){if(j(d,10,17))r="On";if(k(d))r=m}else if(x<5||x>10){if(j(d,10,17))r=m;if(k(d))r="On"}}
println r

วิ่งตัวอย่าง:

bash-3.2$ ./run.peak.sh 
groovy Peak.groovy 2014-08-26T19
Off
groovy Peak.groovy 2014-08-26T07:00
Mid
groovy Peak.groovy 2014-08-26T18:00:00
Mid
groovy Peak.groovy 2014-08-26T12:30:30
On
groovy Peak.groovy 2014-11-01T00
Off
groovy Peak.groovy 2014-02-05T11:11:11
Mid
groovy Peak.groovy 2014-01-05T08:08
Off
groovy Peak.groovy 2014-12-18T18:59:59
On
groovy Peak.groovy 2014-08-31T14
Off

Ungolfed:

@Grab(group='joda-time',module='joda-time',version='2.3')

f = { p,a -> org.joda.time.format.DateTimeFormat.forPattern(p).parseDateTime a}
g = { p,a -> def x=null; try{x=f p,a} catch(Exception e) {} }
a=args[0]

d = ["",":mm",":mm:ss"].collect{g "yyyy-MM-dd'T'HH$it",a}.find{it}
r = "Off"
m = "Mid"

j = {d,a,b -> d.hourOfDay > a && d.hourOfDay < b}
k = { j(it,6,11) || (j(it,16,19)) }

if (d.dayOfWeek<6) {
    x = d.monthOfYear;
    if ( x>4 && x<12 ) {
        if (j(d,10,17)) r="On";
        if (k(d)) r=m
    } else if (x<5||x>10) {
        if (j(d,10,17)) r=m;
        if (k(d)) r="On"
    }
}
println r

2
ตั้งแต่ Java 8 ยังมีjava.time.*ซึ่งคล้ายกับ Joda Time แต่เป็นส่วนหนึ่งของ JRE บางทีนี่อาจทำให้รหัสสั้นลงเล็กน้อย
ntoskrnl

Re: Java 8. จุดที่ยอดเยี่ยม
Michael Easter

ในตัวอย่างที่ 3 ถึงครั้งสุดท้ายของ'2014-01-05T08:08'คุณวันที่ 5 มกราคม 2014 เป็นวันอาทิตย์ ดังนั้นมันควรจะเป็น'Off'
BeetDemGuise

Re: 5 ม.ค. 2014 ค่อนข้างถูกต้อง รหัสปัจจุบันถูกต้อง แต่การเรียกใช้ผลลัพธ์ไม่ถูกต้อง จะแก้ไข
Michael Easter

java.time.*พยายาม ล้มเหลวอย่างน่าสังเวช โปรแกรมแยกวิเคราะห์เข้มงวดเกินไป ใช้DateParserจาก nashorn (รวมถึงส่วนหนึ่งของ JRE8) ซึ่งอ่อนโยนและมีการแฮ็คที่ไม่เหมาะสมแม้กระทั่งผ่อนปรนพอที่จะข้ามนาทีและวินาที
Mark Jeronimus

2

R, 243 204 ตัวละคร

b=strptime(scan(,""),"%Y-%m-%dT%H");i=function(x)as.integer(format(b,x));h=i("%H");d=i("%m%d");w=d>1100|d<430;f=ifelse;cat(c("Off","Mid","On")[f(i("%u")%in%5:6|h<7|h>19,1,f(h>11&h<17,f(w,2,3),f(w,3,2)))])

เยื้องและแสดงความคิดเห็น:

b=strptime(scan(,""),"%Y-%m-%dT%H") #Takes stdin and converts into POSIXct
i=function(x)as.integer(format(b,x)) #Format the POSIXct and convert it to integer
h=i("%H")      #Format to hours
d=i("%m%d")    #Format to Month/Day
w=d>1100|d<430 #True if winter time, false if summer
f=ifelse
cat(c("Off","Mid","On")[f(i("%u")%in%5:6|h<7|h>19, #If weekend or night
                          1,                       #Case 1
                          f(h>11&h<17,            #Else if mid-day
                             f(w,3,2),             #Case 2 in winter, case 3 in summer
                             f(w,2,3)))])          #else vice versa

ตัวอย่าง:

> b=strptime(scan(,""),"%Y-%m-%dT%H");i=function(x)as.integer(format(b,x));h=i("%H");d=i("%m%d");w=d>1100|d<430;f=ifelse;cat(c("Off","Mid","On")[f(i("%u")%in%5:6|h<7|h>19,1,f(h>11&h<17,f(w,3,2),f(w,2,3)))])
1: 2014-08-26T15
2: 
Read 1 item
On
> b=strptime(scan(,""),"%Y-%m-%dT%H");i=function(x)as.integer(format(b,x));h=i("%H");d=i("%m%d");w=d>1100|d<430;f=ifelse;cat(c("Off","Mid","On")[f(i("%u")%in%5:6|h<7|h>19,1,f(h>11&h<17,f(w,3,2),f(w,2,3)))])
1: 2014-12-10T15
2: 
Read 1 item
Mid
> b=strptime(scan(,""),"%Y-%m-%dT%H");i=function(x)as.integer(format(b,x));h=i("%H");d=i("%m%d");w=d>1100|d<430;f=ifelse;cat(c("Off","Mid","On")[f(i("%u")%in%5:6|h<7|h>19,1,f(h>11&h<17,f(w,3,2),f(w,2,3)))])
1: 2014-08-26T23
2: 
Read 1 item
Off

1

Bash, 286

นี่เป็นคำตอบง่ายๆโดยใช้โปรแกรมวันที่

d(){ date -d $1 +%$2; };D=$(echo $1|sed 's/\(T..\)$/\1:00/');H=$(d $D H);M=$(d $D m);if [ $(d $D u) -gt 5 ]||[ $H -lt 7 ]||[ $H -gt 18 ];then echo Off;exit;fi;if [ $M -gt 4 ]&&[ $M -lt 11 ];then I=On;O=Mid;else I=Mid;O=On;fi;if [ $H -gt 10 ]&&[ $H -lt 17 ];then echo $I;else echo $O;fi

1

ที่นี่ไปอีกคนหนึ่ง!

JavaScript, 175 171

function f(x){d=new Date(x.slice(0,10));t=x.slice(11,13),m=(x.slice(5,7)+1)%12;return(t<8||t>18||!(d.getUTCDay()%6)?'off':((t<11||t>17)?(m<5?'on':'mid'):(m<5?'mid':'on'))}

Unminified:

function f(x) {
  d = new Date(x.slice(0, 10));
  t = x.slice(11, 13), m = (x.slice(5, 7) + 1) % 12;
  return (t < 8 || t > 18 || !(d.getUTCDay() % 6) ? 'off' : ((t < 11 || t > 17) ? (m < 5 ? 'on' : 'mid') : (m < 5 ? 'mid' : 'on'))
}

ทำงานเฉพาะกับล่ามที่สามารถใช้สตริงวันที่ ISO8601 ลงในตัวDateสร้างได้

CoffeeScript, 192 189

น่าแปลกที่มันอยู่ใน CoffeeScript อีกต่อไปเพราะไม่มีผู้ประกอบการที่สามในภาษานั้น (ซึ่งอย่างที่คุณเห็นได้จาก JavaScript ของฉันฉันพึ่งมาก)

f=(x)->d=new Date(x.slice(0,10));t=x.slice(11,13);m=(x.slice(5,7)+1)%12;return'off'if(t<8||t>18||!(d.getUTCDay()%6));if(t<11||t>17)then(if m<5then'on'else'mid')else(if m<5then'mid'else'on')

0

ES6 - 146

นี่คือในรูปแบบฟังก์ชั่นใช้แฮ็กน่ารังเกียจคู่

let y,m,d,h,c=s=>[y,m,d,h]=s.split(/[T:-]/g).map(i=>+i),new Date(y,m,d).getDay()in{0:1,6:1}||h<20||8>h?'Off':['Mid','On'][(10>h&&h>16)^(m>5||m<8)]

อธิบาย:

// These variables are declared outside of the function scope to save
// characters.
let y, // year
    m, // month
    d, // day
    h, // hour
    c = s => // c for check, called as c(isoString)
      [y, m, d, h] = // Assign to fields
        s.split(/[T:-]/g) // Split at delimiters
         .map(i => +i), // Convert all to numbers
                        // Comma used to keep it as a single statement.
      new Date(y, m, d).getDay() // Create Date to get day of week
        in {0:1, 6:1} // Check if it is good (0 = Sunday, 6 = Saturday). It
                      // is shorter to use an object literal than to
                      // do individual checks.
      ||
      h < 20 || 8 > h ? // h is between 7 and 19 (7pm)
       'Off' : // Return 'Off'
       ['Mid','On'][ // Two other outputs
        (10 > h && h > 16) ^ // Check if it is 11-16 (5pm)
        (m > 5 || m < 8)] // Invert that if the month is in summer/fall. Note
                          // that this returns a number, either 1 or 0. This
                          // is an ugly hack using the bitwise xor operator.

0

Python 3 - 352 ตัวอักษร

import datetime as dt
t=input()
i=int
p=print
a='on'
b='mid'
c='off'
m=i(t[5:7])
h=i(t[11:13])
d=dt.date(i(t[0:4]),m,i(t[8:10])).weekday()
if 5==d or 6==d:p(c)
elif h>=19 and h<7:p(c)
elif m<=10 and m>=4:
 if h>=7 and h<11:p(b)
 if h>=11 and h<17:p(a)
 if h>=17 and h<19:p(b)
else:
 if h>=7 and h<11:p(a)
 if h>=11 and h<17:p(b)
 if h>=17 and h<19:p(a)

1
คุณควรเปลี่ยนs=['high','mid','off']เป็นs=['on','mid','off']- ไม่เพียง แต่จะบันทึก 2 ตัวอักษรเท่านั้น แต่ข้อมูลจำเพาะระบุว่าจะส่งออก "เปิด"
Sellyme

0

Java - 426 309/301? (ดูความคิดเห็น)

String z(String a){
    DateParser b=new DateParser(a);
    boolean c=b.parseEcmaDate();
    Integer[]d=b.getDateFields();
    GregorianCalendar e=new GregorianCalendar(d[0],d[1]-(c?0:1),d[2]);
    e.setTimeZone(new SimpleTimeZone(0,""));
    return(124>>e.get(7)&1)>0&d[3]>6&d[3]<19?
           d[3]>10&d[3]<17^(1008>>e.get(2)&1)>0?"Mid":"On":"Off";
}

ตัวอย่างผลลัพธ์:

2014-03-02T00   Off
2014-03-02T06   Off
2014-03-02T07   Off
2014-03-02T10   Off
2014-03-02T11   Off
2014-03-02T16   Off
2014-03-02T17   Off
2014-03-02T18   Off
2014-03-02T19   Off
2014-03-02T23   Off
2014-04-02T00   Off
2014-04-02T06   Off
2014-04-02T07   On
2014-04-02T10   On
2014-04-02T11   Mid
2014-04-02T16   Mid
2014-04-02T17   On
2014-04-02T18   On
2014-04-02T19   Off
2014-04-02T23   Off
2014-05-02T00   Off
2014-05-02T06   Off
2014-05-02T07   Mid
2014-05-02T10   Mid
2014-05-02T11   On
2014-05-02T16   On
2014-05-02T17   Mid
2014-05-02T18   Mid
2014-05-02T19   Off
2014-05-02T23   Off

ฉันใช้เคล็ดลับ EXOR เดียวกับการส่ง Python ฉันยังใช้+เป็นฟังก์ชั่นหรือสำหรับเมื่อมันweekend OR nightเป็นหรือฟังก์ชั่นสำหรับเมื่อมัน

เคล็ดลับสำคัญอื่น ๆ ของฉัน: มาสก์บิต

ตัวอย่างเช่นเพื่อดูว่าตัวเลขอยู่ระหว่าง 2 ถึง 6 (วันจันทร์ถึงวันศุกร์) ก่อนอื่นให้สร้างรูปแบบบิตโดยที่ค่าที่น่าสนใจคือ 1:

  6   2 
0b1111100 = 124

จากนั้นใช้การเลื่อนบิตเพื่อรับบิตที่น่าสนใจไปยัง LSB และแตกไฟล์:

(124 >> day_of_week) & 1

ฉันทำรูปแบบบิตสำหรับเดือนและชั่วโมง:

  9    4
0b1111110000 = 1008

      76          76
0b111110000000000001111111 = 16253055
0b000000011111100000000000 = 129024

น่าเสียดายที่มันกลายเป็นเรื่องง่าย x>y&x<zเป็นว่าสั้นลงในกรณีส่วนใหญ่ดังนั้นฉันจึงไม่ได้ใช้ในบางสถานที่

และท้ายที่สุดบิตของการแฮ็กเกอร์ (ขึ้นอยู่กับการใช้งานสูง) กับjdk.nashorn.internal.parser.DateParser: เมื่อparseEcmaDate()ไม่ได้แยกวันที่อย่างสมบูรณ์ (เช่นเมื่อมันอ่านชั่วโมงและฮิตปลายสตริง) มันกลับเท็จ

  • เมื่อเสร็จสิ้นอย่างถูกต้องวันที่จะถูกเก็บไว้ใน Integer[] (auto-unboxing ftw) โดยเดือนถูกกำหนดให้เป็น base-0 (เช่นคลาส Java อื่น ๆ )
  • เมื่อมันคืนค่าเท็จมันจะถูกยกเลิกครึ่งทางและไม่ได้ทำการแก้ไขนี้ อย่างไรก็ตามมันยังคงใส่สิ่งที่แยกวิเคราะห์ลงในอาเรย์ซึ่งพร้อมใช้งาน -(c?0:1)ดังนั้น

ฉันคิดว่าการใช้งาน.parse()อาจจะใช้งานได้ (การตัดออก 8 ตัวอักษร) แต่ฉันไม่ได้ทดสอบอย่างละเอียดด้วยอินพุตที่แตกต่างกัน parseภายในเรียกและถ้ามันล้มเหลวโทรparseEcmaDate parseLegacyDateหลังนี้อาจทำให้เกิดการผิดพลาด แต่สิ่งนี้ไม่ได้เกิดขึ้นกับบางกรณีที่ฉันทดสอบ
Mark Jeronimus

-1

ไม่มีอะไรที่ห้ามไม่ให้ฉันเข้ามาในตัวเองและยังมีอีกสั้น ๆ ที่นี่อยู่แล้วดังนั้น ...

PHP 5.4+, 194

<?function f($x){$t=substr($x,11,2);$m=(substr($x,5,2)+1)%12;if($t<8||$t>18||(new DateTime(substr($x,0,10)))->format('N')>5)return'off';return($t<11||$t>17)?($m<5?'on':'mid'):($m<5?'mid':'on');}

ไม่ระบุและแสดงความคิดเห็น:

<?
function f($x) {
  $t = substr($x,11,2); // hour
  $m = (substr($x,5,2) + 1) % 12; // month shifted up by 1

  if ($t < 8 || $t > 18 || (new DateTime(substr($x,0,10)))->format('N') > 5)
    return 'off'; // evenings and weekends

  return ($t < 11 || $t > 17)
    ? ($m < 5 ? 'on' : 'mid') // morning and mid-afternoon
    : ($m < 5 ? 'mid' : 'on'); // afternoon
}

โปรดทราบว่าdate.timezoneจะต้องตั้งค่าคำสั่งใน php.ini มิฉะนั้นจะมีการโยนข้อยกเว้น

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