ไม่ A เพียงแค่ล็อค LOCK


197

จะเกิดอะไรขึ้นเมื่อCapsLockคีย์บนแป้นพิมพ์ของคุณไม่มีรอยบาก

"hPPENS นี้"

เป้าหมายของโครงการนี้คือการอย่างต่อเนื่องเลียนแบบพลาดท่าแป้นพิมพ์ที่แต่ละกดจะถูกแทนที่ด้วยA CapsLockตัวพิมพ์ใหญ่ 'A จากแหล่งที่มาควรให้ผลเหมือนกัน เมื่อCapsLockเปิดใช้งานตัวพิมพ์ใหญ่จะถูกย้อนกลับ

กรณีทดสอบ

"The quick brown fox jumps over the lazy dog."
-> "The quick brown fox jumps over the lZY DOG."

"Compilation finished successfully."
-> "CompilTION FINISHED SUCCESSFULLY."

"What happens when the CapsLock key on your keyboard doesn't have a notch in it?"
-> "WhT Hppens when the CPSlOCK KEY ON YOUR KEYBOrd doesn't hVE  notch in it?"

"The end of the institution, maintenance, and administration of government, is to secure the existence of the body politic, to protect it, and to furnish the individuals who compose it with the power of enjoying in safety and tranquillity their natural rights, and the blessings of life: and whenever these great objects are not obtained, the people have a right to alter the government, and to take measures necessary for their safety, prosperity and happiness."
-> "The end of the institution, mINTENnce, ND dministrTION OF GOVERNMENT, IS TO SECURE THE EXISTENCE OF THE BODY POLITIC, TO PROTECT IT, nd to furnish the individuLS WHO COMPOSE IT WITH THE POWER OF ENJOYING IN Sfety ND TRnquillity their nTURl rights, ND THE BLESSINGS OF LIFE: nd whenever these greT OBJECTS re not obtINED, THE PEOPLE Hve  RIGHT TO lter the government, ND TO Tke meSURES NECESSry for their sFETY, PROSPERITY nd hPPINESS."

"aAaaaaAaaaAAaAa"
-> "" (Without the notch, no one can hear you scream)

"CapsLock locks cAPSlOCK"
-> "CPSlOCK LOCKS CPSlOCK"

"wHAT IF cAPSlOCK IS ALREADY ON?"
-> "wHt if CPSlOCK IS lreDY ON?"

เกณฑ์ที่ชนะคือขนาดของรหัสต้นฉบับของโปรแกรมที่ส่ง


110
ยินดีต้อนรับสู่เว็บไซต์! นี่เป็นความท้าทายครั้งแรกที่ดีและน่าเสียดายมากสำหรับฉันและนิ้วมือของฉัน
DJMcMayhem

5
กรณีทดสอบที่แนะนำ:teSTateSTateSTateST
Rod

88
หากมีเพียงปุ่ม Enter เท่านั้นที่มีรอยบากอยู่ดังนั้นนี่จะไม่ '
12Me21

75
ไม่เกิดขึ้น .......
12Me21

22
แท้จริงเข้าร่วมเว็บไซต์นี้เพื่อ upvote "โดยไม่มีรอยไม่มีใครสามารถได้ยินคุณกรีดร้อง"
lucasvw

คำตอบ:


115

AutoHotKeyขนาด 7 ไบต์

a::vk14

// มันใช้ได้ไหม? นี้จริงๆทำในสิ่งที่ต้องการ OP - แทนที่โดยaCapsLock (vk14)

เรียกใช้โปรแกรมนี้และพิมพ์อินพุตจากแป้นพิมพ์ ..


4
"สิ่งนี้ถูกต้องหรือไม่" OP ไม่ได้ระบุข้อ จำกัด อินพุตหรือเอาต์พุตดังนั้นฉันจึงพิจารณาว่าถูกต้อง
Nefrin

5
อย่าเห็นคำตอบ ahk มากเกินไป!
HaveSpacesuit

57
ดีมาก แต่ฉันจะปฏิเสธมันได้อย่างไร
RobbG

69
@ RobbG เพียงพิมพ์ "killLL utohotkey" ... โอ้ด้วยปัญญา
Nefrin

5
@tsh ฉันคิดว่าคุณพลาดเรื่องตลกที่นี่ ...
RobbG

32

V , 9 ไบต์

ò/ãa
xg~$

ลองออนไลน์!

hexdump:

00000000: f22f e361 0a78 677e 24                   ./.a.xg~$

คำอธิบาย:

ò       " Recursively:
 /ãa    "   Move forward to the next 'a' (upper or lowercase)
        "   This will break the loop when there are no more 'a's
x       "   Delete the 'a'
 g~$    "   Toggle the case of every character after the cursor's position.

21

เป็นกลุ่ม 16 ไบต์

qq/\ca
xg~$@qq@q

สมมติว่าอินพุตอยู่ในบรรทัดเดียว

คำอธิบาย

qq            Start a loop
 /\ca␊         Find the first occurence of an a, end the loop if there are none left
 xg~$          Remove it and invert the case of the rest of the file
@qq@q         End the loop 

การค้นพบนี้ไม่สำคัญหรือไม่ในกรณีของ 'a'?
Gnudiff

@Gnudiff \cที่ใดก็ได้ในการค้นหา regex ช่วยให้ case-insensitivity
Herman L

คุณต้องการตั้งค่าสถานะที่เฉพาะเจาะจงสำหรับg~$การทำงานหรือไม่ เพราะสำหรับฉันมันจะแปลงกลับเฉพาะกรณีจนถึงท้ายบรรทัดไม่ใช่ไฟล์ทั้งหมดดังนั้นนี่จึงไม่ได้ผลสำหรับไฟล์หลายบรรทัดสำหรับฉัน
Cubic

1
@Cubic ขณะที่ผมเขียนไว้ในคำตอบที่ว่า "ถือว่าเข้าเป็นบนบรรทัดเดียว"
เฮอร์แมน L

@Cubic ถ้าคุณอยากให้มันไปจุดสิ้นสุดของแฟ้มและการสนับสนุนปัจจัยการผลิตในหลายเส้นคุณสามารถทำหรือg~vG vG~
DJMcMayhem

15

C, 72 ไบต์

ขอบคุณ @Ton Hospel ที่ช่วยประหยัด 16 ไบต์!

t,c;f(char*s){for(t=0;c=*s++;6305%c?putchar(isalpha(c)?c^t:c):(t^=32));}

ลองออนไลน์!


2
คุณสามารถสลับกรณีของตัวอักษรโดยใช้ xor กับ 32
Ton Hospel

คุณอาจจะสามารถประหยัดมากยิ่งขึ้นโดยมีtจะ0/32แทนแม้กระทั่ง / คี่ (xor ที 32 สำหรับแต่ละa) แล้วตัวอักษร xor โดยตรงกับt
Ton Hospel

2
วิธีที่ดีในการตรวจสอบa's
Ton Hospel

1
ฟังก์ชั่น @TonHospel ต้องสามารถนำมาใช้ซ้ำได้และฉันไม่คิดว่ามันจะใช้ซ้ำได้หากคุณต้องการรหัสภายนอกเพื่อให้สามารถใช้งานได้อีกครั้งหลังจากการโทรแต่ละครั้ง
Steadybox

1
6305%cคือ 0 ถ้าcคือ 13.
Rosie F

11

Huskขนาด 11 ไบต์

Γ·§?m\:€"Aa

ลองออนไลน์!

คำอธิบาย

ฉันใช้การบรรทุกเกินพิกัดที่ค่อนข้างคลุมเครือซึ่งΓเรียกว่าlistNFสร้างฟังก์ชันแบบเรียกซ้ำซึ่งทำงานกับรายการ มันสอดคล้องกับรูปแบบ Haskell ต่อไปนี้:

listNF f = g
  where g (x : xs) = f g x xs
        g [] = []

แนวคิดคือการlistNFใช้ฟังก์ชันตัวช่วยfและส่งคืนฟังก์ชันใหม่gซึ่งรับรายการ ฟังก์ชั่นfใช้ฟังก์ชั่นซึ่งมักจะเป็นgและหัวxและหางxsของรายการและทำอะไรกับพวกเขา ในแอปพลิเคชันของเราfโทรgซ้ำxsๆ โปรแกรมตีความเช่นนี้

Γ (· (§ (?m\) : (€"Aa")))
Γ (                     )  Create a function g that takes a list (x:xs) and applies a function on x and xs.
   · (                 )   Compose g with second argument of function in parentheses.
                           Instead of x and xs, the function is called on x and the result of a recursive call of g on xs.
                (€"Aa")    Check if x is 'A' or 'a'.
        (?m\)              If it is, then swap the case of every char in g(xs).
      §       :            Otherwise, prepend x to g(xs).

3
ว้าว, สิ่งที่ดีฉันสดชื่นก่อนที่ผมโพสต์วิธีการแก้ปัญหา 12 Ḟ·+m\ṁx'Ax'aไบต์ของฉัน: เราขอคำอธิบายได้ไหม? ฉันไม่สามารถหาข้อมูลเกี่ยวกับสิ่งที่Γทำอย่างแน่นอนและนี่เป็นโอกาสที่ดีที่จะเรียนรู้
Sophia Lechner

1
@SophiaLechner เรียบร้อยแล้ว รุ่นΓนี้ค่อนข้างยากที่จะอธิบายฉันหวังว่าคุณจะเข้าใจมัน
Zgarb

ว้าวนี่ช้า มันเป็นเพียง TIO?
FrownyFrog

1
@FrownyFrog It's Husk การอนุมานชนิดของโปรแกรมที่มีΓดูเหมือนจะช้าโดยทั่วไป หากคุณไม่คุ้นเคยกับ Husk โปรแกรมจะแปลความหมายโดยการวนลูปผ่านโครงสร้างที่เป็นไปได้ทั้งหมดของโปรแกรม (โดยหลักคือตำแหน่งที่เป็นไปได้ของวงเล็บ) และการโอเวอร์โหลดทั้งหมดของแต่ละบิวด์อินและเลือกอันแรกที่ผลลัพธ์ดี พิมพ์ ล่ามนั้นฉลาดพอที่จะปฏิเสธความเป็นไปได้บางอย่างในช่วงต้น แต่ดูเหมือนว่ารุ่นที่เรียกซ้ำของΓสามารถยุ่งกับขั้นตอนนี้และบังคับให้มันวนผ่านตัวเลือกมากมาย
Zgarb

@SophiaLechner ผมเขียนเคล็ดลับที่จะอธิบายΓในรายละเอียดบาง
Zgarb

11

เรติน่า , 33 21 17 ไบต์

i(Tv`lL`Ll`a.*
a

ลองออนไลน์

คำอธิบาย:

i(              i is for case-insensitive, the paren makes it modify both stages
  Tv`           Transliteration, with simple overlaps (v) - 1 match at every start pos
     lL`Ll`     Replace lowercase with uppercase, and vice versa
           a.*  Every 'a' will match, overlapping to the end of the string
                This swaps the case on all letters after each 'a'
a               Replace all 'a's with nothing

-12 ไบต์ขอบคุณมาร์ติน
-4 ไบต์ขอบคุณลีโอ


น่าประหลาดใจที่นี่เกือบจะสั้นเท่ากับโซลูชั่น
Pyth

1
ฉันคิดว่ามันiT`aAlL`__Ll`a[^a]*a?ใช้ได้กับ 21 ไบต์ด้วย
Neil

สั้นลง 4 ไบต์โดยใช้การจับคู่ที่ทับซ้อนกัน
Leo

ฉันสนใจว่ามันจะทำงานอย่างไรถ้าคุณมีเวลาเพิ่มคำอธิบาย ขอบคุณ!
seshoumara

9

C # , 121 ไบต์

Console.WriteLine(string.Join("",Console.ReadLine().Split(new[]{'a','A'}).Select((a,i)=>i%2==0?a:a.ToUpper()).ToList()));

** อัปเดต (ขอบคุณ @John & @aloisdg) **

C # , 69 ไบต์

x=>string.Concat(x.Split('a','A').Select((a,i)=>i%2>0?a.ToUpper():a))

2
ยินดีต้อนรับสู่ PPCG! คำตอบแรกที่ดี!
RedClover

2
คุณสามารถบันทึก 7 ไบต์new[] { 'a', 'A' }เพื่อเปลี่ยนเป็น'a', 'A'
John

5
คุณสามารถทำได้ใน 69 ไบต์ด้วยตรรกะเดียวกัน! ลองออนไลน์! (ใช้อินพุต / ouput แทนคอนโซลลบ ToList ผกผัน ternary และใช้ความคิดเห็น @John) นี่เป็นคำตอบแรกที่ดี ทำต่อไป!
aloisdg

3
ทั้งสองเวอร์ชันเหล่านี้ไม่ได้สลับตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เป็นตัวพิมพ์ใหญ่เท่านั้นเมื่อเปิดใช้งาน CapsLock นี่คือข้อกำหนด (ดูกรณีทดสอบล่าสุด)
Broadwell

@Broadwell คุณจะรู้ได้อย่างไรว่าเปิดใช้งาน CapsLock อยู่หรือไม่ คุณแน่ใจว่ากรณีทดสอบสุดท้ายถูกต้องหรือไม่ มันผ่านกรณีทดสอบอื่น ๆ ทั้งหมดเท่าที่ฉันเห็น ขอบคุณ!
Aalawlx

7

JavaScript (ES6), 93 88 84 82 ไบต์

(บันทึกไว้ 5 ไบต์ด้วย @Shaggy, 4 ไบต์ขอบคุณ @ user81655 และ 2 ไบต์ขอบคุณ @ l4m2)

a=>a.replace(A=/./g,c=>c in{a,A}?(A=!A,''):A?c:c[`to${c<{}?'Low':'Upp'}erCase`]())

กรณีทดสอบ:


1
['to${c<'a'?'Low':'Upp'}erCase']ควรช่วยให้คุณประหยัดไม่กี่ไบต์แทนที่คำพูดเดียวกับ backticks
Shaggy

แน่นอน @Shaggy ขอบคุณ!
Rick Hitchcock

การใช้^1เพื่อuเป็นพาริตีสามารถช่วยให้คุณกำหนดค่าเริ่มต้นให้สั้นลงได้:s=>s.replace(u=/./g,c=>/a/i.test(c)?(u^=1,''):+u?c[`to${c<'a'?'Low':'Upp'}erCase`]():c)
user81655

นี่เป็นอีกวิธีหนึ่งในการทดสอบตัวอักษรaที่สั้นกว่า:a=>a.replace(A=/./g,c=>c in{a,A}?(A^=1,''):+A?c[`to${c<'a'?'Low':'Upp'}erCase`]():c)
user81655

Brilliant, @ user81655 โดยเฉพาะการใช้ตัวinดำเนินการเช่นนั้น เรียนรู้มากขึ้นเสมอ!
Rick Hitchcock

6

R , 92 ไบต์

cat(`[<-`(v<-el(strsplit(scan(,""),"a|A")),w<-c(F,T),chartr("a-zA-Z","A-Za-z",v)[w]),sep="")

ขอบคุณ @Giuseppe สำหรับการแก้ไขคำตอบ

คำอธิบาย

# Write
cat(
  # Replace and return, this is the function that powers
  # the R store at index operations, a[i]<-b
  `[<-`(
    # First arg - what to replace = extract first list element
    # of a string input after splitting at a or A
    v<-el(strsplit(scan(,""),"a|A")),
    # Second arg - index to replace = abuse vector recycling
    # to create infinite F, T, F, T, F, etc series
    w<-c(F,T),
    # Third arg - replacement values = replace with case toggled letters
    chartr("a-zA-Z","A-Za-z",v)[w]),
  # Write without separation
  sep="")

ลองออนไลน์!


บางทีฉันอาจไม่ได้อธิบายอย่างชัดเจน แต่คำตอบนี้ไม่ได้แปลงเป็นตัวพิมพ์ใหญ่เมื่อเปิดใช้งาน CapsLock (ทำได้เพียงอย่างเดียวtoupper) ซึ่งเป็นข้อกำหนด
Broadwell

2
ooohhhhhhh ฉลาดมากกับc(F,T)@Broadwell แม้ว่าจะถูกต้อง; ดูเหมือนว่ามันจะเป็นchartr("a-zA-Z","A-Za-z",v)[w]มากกว่าtoupper
Giuseppe

@Giuseppe Thanks
Vlo

6

PowerShell Coreขนาด 105 ไบต์

"$args"|% t*y|%{if($_-in97,65){$c=!$c}else{Write-Host -n($_,("$_"|%("*per","*wer")[$_-in65..90]))[!!$c]}}

ลองออนไลน์!

สิ่งที่ไม่มีผู้ประกอบการที่แท้จริงและไม่มีนามแฝงเริ่มต้นสำหรับการพิมพ์ไปที่หน้าจอมันไม่สั้น

  • % t*yขยายไปยัง| ForEach-Object -Method ToCharArrayequiv ของ"$args".ToCharArray()
  • Write-Host -n สำหรับพารามิเตอร์ -NoNewLine
  • "$_"เปลี่ยน[char]ประเภทกลับเป็น[string](ตัวอักษรไม่มีตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็กใน. Net)
  • |% *perทำวิธีการโทรแบบเดียวกันกับทางลัดก่อนหน้านี้ แต่ใช้วิธี.ToUpper()เดียวกันกับ.ToLower()
  • ($a,$b)[boolean test] ถูกทารุณกรรมเป็นผู้ประกอบการปลอม -
  • !!$cบังคับให้ใช้งาน[bool]ที่นี่มันเริ่มไม่ได้กำหนด$nullดังนั้นมันจึงถูกบังคับให้มีอยู่ในฐานะ "ตัวพิมพ์ใหญ่: $ false"

1
นั่น|% t*yเป็นกลลวงที่ฉันต้องจำ สั้นกว่า[char[]]ซึ่งฉันใช้บ่อยมาก ฉันเกือบจะบอกว่าควรไปที่หัวข้อเคล็ดลับ
AdmBorkBork

94 -join($args|% t*y|%{if($_-eq'a'){$c=!$c}else{(("$_"|%("*per","*wer")[$_-in65..90]),$_)[!$c]}})ไบต์: ขอบคุณสำหรับ|% *ethodผู้ประกอบการ!
mazzy

6

Perl 5 -p , 31 30 29 ไบต์

-1 ไบต์ขอบคุณ@nwellnhof

-1 ไบต์ขอบคุณ@ikegami

#!/usr/bin/perl -p
s/a([^a]*)a?/$1^uc$1^lc$1/egi

ลองออนไลน์!


ทำไมไม่เพียงs/a(.*?)(a|$)/uc$1/egi(22 ไบต์)
nwellnhof

@nwellnhof เนื่องจาก capslock เมื่อเปิดใช้งานสลับกรณีไม่ได้เป็นเพียงตัวพิมพ์ใหญ่
Ton Hospel

1
อ่าฉันเข้าใจแล้ว จากนั้นs/a(.*?)(a|$)/$1^uc$1^lc$1/egiสั้นลงหนึ่งไบต์
nwellnhof

@nwellnhof ขอบคุณที่เรียบร้อยมาก
Ton Hospel

a([^a]*)a?สั้นกว่าa(.*?)(a|$)
ikegami

5

Python ขนาด 63 ไบต์

f=lambda s:s and[s[0]+f(s[1:]),f(s[1:]).swapcase()][s[0]in"aA"]

โซลูชัน Python อื่นทำงานใน Python 2 และ 3 ใช้เวลานานมากสำหรับอินพุตทั้งหมดยกเว้นอินพุตขนาดเล็ก


5

รหัสประจำเครื่อง 6502 (C64), 51 ไบต์

A0 00 84 FE B1 FC F0 2A C9 41 F0 06 90 1A C9 C1 D0 08 A9 80 45 FE 85 FE B0 11
B0 06 C9 5B B0 08 90 04 C9 DB B0 02 45 FE 20 16 E7 C8 D0 D6 E6 FD D0 D2 60

คาดหวังว่าตัวชี้ไปยังสายป้อนข้อมูลที่สิ้นสุดด้วย 0 $fc/$fdส่งออกไปยังหน้าจอ

ความคิดเห็นถอดแยกชิ้นส่วน

 .caps:
A0 00       LDY #$00
84 FE       STY $FE             ; init capslock state
 .loop:
B1 FC       LDA ($FC),Y         ; next char from string
F0 2A       BEQ .done           ; NUL -> we're done
C9 41       CMP #$41            ; compare to 'a'
F0 06       BEQ .isa            ; if equal, toggle capslock
90 1A       BCC .out            ; if smaller, direct output
C9 C1       CMP #$C1            ; compare to 'A'
D0 08       BNE .ctog           ; if not equal, check for letter
 .isa:
A9 80       LDA #$80            ; toggle bit 7 in caps lock state
45 FE       EOR $FE
85 FE       STA $FE
B0 11       BCS .next           ; and go on
 .ctog:
B0 06       BCS .cZ             ; if char larger 'A', check for 'Z'
C9 5B       CMP #$5B            ; compare with 'z'+1
B0 08       BCS .out            ; larger or equal -> direct output
90 04       BCC .tog            ; smaller -> apply capslock
 .cZ:
C9 DB       CMP #$DB            ; compare with 'Z'+1
B0 02       BCS .out            ; larger or equal -> direct output
 .tog:
45 FE       EOR $FE             ; toggle bit from capslock state
 .out:
20 16 E7    JSR $E716           ; output char
 .next:
C8          INY                 ; and loop to next char
D0 D6       BNE .loop
E6 FD       INC $FD
D0 D2       BNE .loop
.done:
60          RTS

ตัวอย่างโปรแกรมแอสเซมเบลอร์โดยใช้รูทีน:

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

ภาพหน้าจอ

รหัสในรูปแบบca65 :

.import caps ; link with routine above

.segment "BHDR" ; BASIC header
                .word   $0801           ; load address
                .word   $080b           ; pointer next BASIC line
                .word   2018            ; line number
                .byte   $9e             ; BASIC token "SYS"
                .byte   "2061",$0,$0,$0 ; 2061 ($080d) and terminating 0 bytes

.bss
string:         .res    $800

.data
prompt:         .byte   $d, "input> ", $0

.code
                lda     #$17            ; set upper/lower mode
                sta     $d018

                lda     #<prompt        ; display prompt
                ldy     #>prompt
                jsr     $ab1e

                lda     #<string        ; read string into buffer
                sta     $fc
                lda     #>string
                sta     $fd
                jsr     readline

                lda     #>string        ; call our caps routine on buffer
                sta     $fd
                jmp     caps

; read a line of input from keyboard, terminate it with 0
; expects pointer to input buffer in $fc/$fd
; NO protection agains buffer overflows !!!
.proc readline
                ldy     #$0
                sty     $cc             ; enable cursor blinking
                sty     $fe             ; temporary for loop variable
                lda     $fd
                sta     $2              ; initial page of string buffer
getkey:         jsr     $f142           ; get character from keyboard
                beq     getkey
                sta     $fb             ; save to temporary
                and     #$7f
                cmp     #$20            ; check for control character
                bcs     prepout         ; no -> to normal flow
                cmp     #$d             ; was it enter/return?
                beq     prepout         ; -> normal flow
                cmp     #$14            ; was it backspace/delete?
                bne     getkey          ; if not, get next char
                lda     $fe             ; check current index
                bne     prepout         ; not zero -> ok
                lda     $2              ; otherwise check if we're in the
                cmp     $fd             ;    first page of the buffer
                beq     getkey          ; if yes, can't use backspace
prepout:        ldx     $cf             ; check cursor phase
                beq     output          ; invisible -> to output
                sei                     ; no interrupts
                ldy     $d3             ; get current screen column
                lda     ($d1),y         ; and clear 
                and     #$7f            ;   cursor in
                sta     ($d1),y         ;   current row
                cli                     ; enable interrupts
output:         lda     $fb             ; load character
                jsr     $e716           ;   and output
                ldx     $cf             ; check cursor phase
                beq     store           ; invisible -> to store
                sei                     ; no interrupts
                ldy     $d3             ; get current screen column
                lda     ($d1),y         ; and show
                ora     #$80            ;   cursor in
                sta     ($d1),y         ;   current row
                cli                     ; enable interrupts
                lda     $fb             ; load character
store:          cmp     #$14            ; was it backspace/delete?
                beq     backspace       ; to backspace handling code
                ldy     $fe             ; load buffer index
                sta     ($fc),y         ; store character in buffer
                cmp     #$d             ; was it enter/return?
                beq     done            ; then we're done.
                iny                     ; advance buffer index
                sty     $fe
                bne     getkey          ; not zero -> ok
                inc     $fd             ; otherwise advance buffer page
                bne     getkey
done:           lda     #$0             ; terminate string in buffer with zero
                ldy     $fe             ; get buffer index
                iny
                bne     termidxok       ; and advance ...
                inc     $fd
termidxok:      sta     ($fc),y         ; store terminator in buffer
                inc     $cc             ; disable cursor blinking
                rts                     ; return
backspace:      ldy     $fe             ; load buffer index
                bne     bsidxok         ; if zero
                dec     $fd             ;   decrement current page
bsidxok:        dey                     ; decrement buffer index
                sty     $fe
                bcs     getkey          ; and get next key
.endproc        

ฉันแค่ต้องบอกว่าฉันชื่นชมคุณไปที่ความพยายามในการเขียนในการชุมนุม ฉันไม่คิดว่าสิ่งนี้เกี่ยวข้องกับความจริงที่ฉันเคยสนุกกับ asm จริงๆ แต่บางทีการมีประสบการณ์ทำให้ฉันตระหนักถึงสิ่งที่เกี่ยวข้อง ประสบการณ์หรือความสะดวกสบายเป็นสิ่งที่นอกเหนือจากจุดที่ฉัน มันทำให้วันของฉันสว่างขึ้นเล็กน้อยเพื่อดูความกระตือรือร้นเช่นกัน
Pryftan

ขอบคุณ @Pryftan :) มันเป็นเพียงวิธีที่ดีที่จะทำให้ในทางปฏิบัติผมทำงานในบางเกมและเมื่อเร็ว ๆ นี้นอกจากนี้ยังมีรหัสการสาธิตเครื่องเก่านี้ดี :)
เฟลิกซ์ Palmen

มันเยี่ยมมากที่ได้เห็น! ตามทัน ฉันจำได้ว่าเพลิดเพลินไปกับ asm แต่ฉันไม่คิดว่าฉันจะสนุกกับมันมากในทุกวันนี้ (เว้นแต่ฉันจะมีเครื่องจักรเก่าอย่างที่คุณทำนั่นก็เป็นได้ ใช้. อย่างไรก็ตามจะไม่ปล่อยให้เรื่องนี้พัฒนาไปสู่การแชทแค่อยากบอกว่าฉันซาบซึ้งกับคำตอบ!
Pryftan

5

Java 8, 119 108 98 ไบต์

s->{int f=0,t;for(int c:s)if((t=c&95)==65)f^=1;else System.out.printf("%c",f<1|t<66|t>90?c:c^32);}

-11 ไบต์ขอบคุณที่@ OlivierGrégoire
-10 ไบต์ขอบคุณที่@Nevay

คำอธิบาย:

ลองออนไลน์

s->{                           // Method with char-array parameter and no return-type
  int f=0,t;                   //  Flag-integer, starting at 0
  for(int c:s)                 //  Loop over the characters of the input as integers
    if((t=c&95)==65)           //   If the current character is an 'A' or 'a':
      f^=1;                    //    Toggle the flag (0→1 or 1→0)
    else                       //   Else:
      System.out.printf("%c",  //    Print integer as character
        f<1|                   //     If the flag-integer is 0,
        t<66|t>90?             //     or the current character isn't a letter:
         c                     //      Simply output the character as is
        :                      //     Else (the flag it 1 and it's a letter)
         c^32);}               //      Print it with its case reversed

1
คำสั่งประณาม ... พวกเขาห้ามไม่ให้ฉันโพสต์คำตอบของฉันต่อหน้าคุณ ... ต่อไปนี่คือคำตอบของฉันสั้นลง 11 ไบต์:s->{int z=0,d;for(int c:s)if((d=c&95)==65)z^=1;else System.out.printf("%c",z<1|d<66|d>90?c:c<91?c|32:c&95);}
Olivier Grégoire

@ OlivierGrégoireคำตอบที่ดี! และคุณห้ามไม่ให้โพสต์หมายความว่าอย่างไร เครือข่ายงานของคุณเข้มงวดหรือไม่?
Kevin Cruijssen

คำตอบของฉันก็พร้อมสักครู่: ฉันเพิ่งขัดกรณีทดสอบก่อนโพสต์ แต่ทันใดนั้นมีการประชุมที่ไม่สิ้นสุด
Olivier Grégoire

1
ไม่มันโอเคฉันต้องโทษตัวเองเพราะไม่เร็วพอก่อนการประชุม ;-) แต่ขอบคุณสำหรับการแนะนำสิ่งนี้!
Olivier Grégoire

2
98 ไบต์:s->{int f=0,t;for(int c:s)if((t=c&95)==65)f^=1;else System.out.printf("%c",f<1|t<66|t>90?c:c^32);}
Nevay

5

C, 167 168 158 131 ไบต์

ขอบคุณสำหรับ @Martin Ender สำหรับการตรวจสอบโค้ด: ฉันได้สลับการประมวลผลสตรีมสำหรับการประมวลผลสตริงเพื่อช่วยในการนำมาใช้ใหม่ ขอบคุณมากสำหรับ @RiaD และ @ceilingcat สำหรับคำแนะนำของพวกเขา

c,d;(*t[][2])()={{isupper,tolower},{islower,toupper}};f(char*s){for(d=1;c=*s++;)t[0][1](c)==97?d=!d:putchar(t[!t[d][0](c)][1](c));}

ลองออนไลน์!

มันทำงานยังไง?

/* int c is the input character,
   int d is the Caps Lock flag (1=off, 0=on)  starting as "Off". */
int c, d;
/* array of comparison functions and transformation functions for each state */
(*t[][2])() = {{isupper, tolower}, {islower, toupper}};

f(char *s) {
  /* Loop if we haven't hit the terminator */
  for(d = 1; c = *s++;)
    t[0][1](c) == 97 ?
      /* If tolower(c)=='a' then flip the Caps Lock state */
      d=!d:
      /* Otherwise, convert character according to the following table:

                       Character case
         Caps Lock  UPPER       LOWER
                ON  tolower()   toupper()
               OFF  toupper()   tolower()
      */
      putchar(t[!t[d][0](c)][1](c));
  }
}

หมายเหตุ

  • s[][]คือสิ่งที่เวทมนตร์เกิดขึ้น: [][0]เป็นฟังก์ชันการเปรียบเทียบและ[][1]เป็นฟังก์ชันการแปลงที่เกี่ยวข้องสำหรับแต่ละรัฐ
  • ! ใช้กับฟังก์ชั่นการเปรียบเทียบเพื่อบังคับให้อยู่ในช่วง [0,1]

ยินดีต้อนรับสู่ PPCG! น่าเสียดายที่คุณไม่สามารถพึ่งพาการกำหนดค่าเริ่มต้นdเช่นนี้ได้เนื่องจากหมายความว่าฟังก์ชันของคุณไม่สามารถใช้ซ้ำได้ ง่าย ๆd=0;ควรแก้ไข
Martin Ender

ฉันไม่แน่ใจว่าการใช้ซ้ำหรือการรักษาสถานะมีความสำคัญมากกว่าในกรณีนี้หรือไม่ void f(){int c,d=0;[...]หากนำมาใช้เป็นสิ่งสำคัญมากที่ผมจะย้ายการประกาศตัวแปรภายในฟังก์ชันเพื่อการเริ่มต้นที่จะอ่าน ไม่ว่าในกรณีใดสตรีมจะตายดังนั้นการแก้ไขจึงเป็นไปตามลำดับ!
ErikF

คุณต้องการ s ในขณะที่วนซ้ำหรือไม่? ไม่สามารถกลายเป็น NULL ได้เว้นแต่คุณจะเรียกใช้ด้วย f (NULL)
RiaD

d =! d สำหรับการพลิก
RIAD

!! จะ ! ถ้าคุณกลับคำสั่งของ t และเริ่ม d ด้วย 1
RiaD

4

Haskell , 92 ไบต์

import Data.Char
g x|x<'['=toLower x|1>0=toUpper x
f(a:b)|elem a"aA"=f$g<$>b|1>0=a:f b
f x=x

ลองออนไลน์!

คำอธิบาย

ก่อนอื่นเราประกาศว่าgเป็นฟังก์ชั่นที่จับคู่ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็ก นี่คือส่วนใหญ่ของ bytecount ของเรา fจากนั้นเราจะกำหนดฟังก์ชั่น หากอินพุตfเป็นของแบบฟอร์มที่a:bเราทำ

f(a:b)
 |elem a"aA"=f$g<$>b
 |1>0=a:f b

aและAจับคู่รูปแบบแรกและดังนั้นเราจึงนำfไปใช้กับการป้อนข้อมูลด้วยมันเป็นกรณีกลับ มิฉะนั้นเราย้ายaออกด้านหน้าและนำไปใช้ในการfb


4

ภาษา Wolfram (Mathematica) , 70 ไบต์

#//.{x___,"a"|"A",y___}:>Join[{x},ToUpperCase@#+ToLowerCase@#-#&@{y}]&

ลองออนไลน์!

รับอินพุตและเอาต์พุตเป็นรายการของอักขระ เพื่อความสะดวกฉันได้เพิ่มโค้ดในส่วนท้ายเพื่อแปลงจากและกลับเป็นสตริง

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

#//.{x___,"a"|"A",y___}:>Join[{x},... {y}]&ส่วนหนึ่งเป็นมาตรฐาน: เราพบครั้งแรกA(ตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก) ย้อนกลับกรณีที่มาหลังจากที่Aและทำซ้ำจนกว่าจะมีไม่มากA's ที่จะพบ

ส่วนที่น่าสนใจคือวิธีที่เราย้อนกลับกรณี: ToUpperCase@# + ToLowerCase@# - #&ฟังก์ชั่น เราเพิ่มเวอร์ชั่นที่ใส่เข้าด้วยกันของช่องสัญญาณเข้าและรุ่นที่ใส่ช่องใส่เสียงต่ำกว่าแล้วจึงลบข้อมูลจริง ตัวอย่างเช่นให้รายการ{"I","n","P","u","T"}คำนวณนี้

{"I","N","P","U","T"}+{"i","n","p","u","t"}-{"I","n","P","u","T"}

เธรดใดที่เป็นรายการ

{"I"+"i"-"I","N"+"n"-"n","P"+"p"-"P","U"+"u"-"u","T"+"t"-"T"}

และถึงแม้ว่า Mathematica ไม่ได้มีวิธีการใด ๆ โดยเฉพาะอย่างยิ่งการเพิ่มสองสายก็ฉลาดพอที่จะลดความซับซ้อนของa+b-aการbค่าใด ๆaและรวมถึงค่าสตริงดังนั้นนี้ช่วยลดความยุ่งยากในการb{"i","N","p","U","t"}


4

Ruby , 42 41 ไบต์

->s{s.sub!(/a(.*)/i){$1.swapcase}?redo:s}

ลองออนไลน์!

แลมบ์ดายอมรับสตริงเปลี่ยนสายให้เข้าที่และคืนค่า เคล็ดลับที่นี่คือsubส่งคืนสตริง (ค่าจริง) หากทำการทดแทนและส่งกลับเป็นnilอย่างอื่น การดำรงอยู่ของswapcaseมันก็ค่อนข้างมีประโยชน์เช่นกัน

-1 ไบต์: แทนที่ตรรกะบูลีนด้วยโอเปอร์เรเตอร์ที่ประกอบไปด้วยAsone Tuhid

->s{
  s.sub!(/a(.*)/i){     # Replace "a" followed by anything with
    $1.swapcase         #   the case-swapped capture group
  } ? redo              # If a match was found, restart the block
    : s                 # Otherwise, return the modified string
}

บันทึก 1 ไบต์ ลิงก์ยาวเกินไปถ้าฉันรวมทุกกรณีทดสอบ
Asone Tuhid

@ AsoneTuhid ขอบคุณ ... วันหนึ่งฉันจะจำได้ว่าใช้ผู้ประกอบการที่ประกอบไปด้วยรถทันทีดังนั้นคุณไม่จำเป็นต้องเตือนฉัน
benj2240

4

PHP 101 99 ไบต์

for($s=$argn;$i<strlen($s);$i++)lcfirst($s[$i])==a?$s=strtolower($s)^strtoupper($s)^$s:print$s[$i];

ทำงานแบบนี้:

echo '[the input]' | php -nR '[the code]'

Ungolfed:

for ($s = $argn; $i < strlen($s); $i++) {
    if (lcfirst($s[$i]) == 'a') {
        $s = strtolower($s) ^ strtoupper($s) ^ $s; // Flip the whole string's case.
    } else {
        print $s[$i]; // Print the current letter.
    }
}

นี่เป็นการวนลูปผ่านสตริงด้วย for for loop และในแต่ละการวนซ้ำมันจะตรวจสอบว่าตัวอักษรปัจจุบันคือaถ้าใช่จากนั้นให้พลิกกรณีของสตริงทั้งหมด (เมธอดจากที่นี่ ) และหากไม่ใช่ให้พิมพ์ตัวอักษรปัจจุบัน


1
การประชุมสำหรับรหัสกอล์ฟคือต้องรวมรหัสทั้งหมด นั่นหมายความว่าคุณต้องใช้การป้อนข้อมูลเป็นพารามิเตอร์ฟังก์ชั่นและจริงประกาศฟังก์ชั่น (ผ่านคำหลักที่ฟังก์ชั่นใน PHP) หรือมีสคริปต์สมบูรณ์ (เช่นใช้$argn, $argv, $_GET) ดังนั้นในขณะนี้นี่ไม่ใช่การส่งที่ถูกต้อง การส่งคืนต้องเป็นechoed หรือreturned (อนุญาตสำหรับฟังก์ชัน ofc เท่านั้น)
Christoph

1
ขอบคุณ @Christoph ที่ฉันยังใหม่กับการเล่นกอล์ฟ :) ฉันได้อัปเดตคำตอบแล้วตอนนี้เพียงแจ้งให้เราทราบหากมีสิ่งใดผิดปกติ
Davіd

@Christoph ว้าว! 75! ดีมาก! คุณมี 1 :) ของฉัน
Davіd

4

เยลลี่ขนาด 14 ไบต์

Œu=”Aœp⁸ŒsJḤ$¦

ลองออนไลน์!

โปรแกรมเต็มรูปแบบ

คำอธิบาย:

Œu=”Aœp⁸ŒsJḤ$¦ Arguments: x
Œu             Uppercase x
  =”A          ^ Equals 'A' (vectorizes)
     œp⁸       ^ Partition ⁸ [⁸=x]
             ¦ Apply link A, keep results at specific indices B
        Œs     A: Swap case
            $  B: Form a >=2-link monadic chain
          JḤ      Arguments: y
          J       Get list indices ([1, length(list)]) of y
           Ḥ      Double (vectorizes) ^
                  This way, we only "apply" link A to even indices, so every second
                  element, starting from the secondd one.

คำอธิบายของรหัส?
SK19

1
@ SK19 เพิ่มคำอธิบาย
Erik the Outgolfer

4

MATL , 23 20 ไบต์

'a A'Yb&Ybt2L)Yo2L(g

ลองออนไลน์!

คำอธิบาย:

'a A'Yb   % form a cell array containing {'a', 'A'}
&Yb       % split input into substrings, with either of those ('a' or 'A') as delimiters
t2L)      % extract out the even positioned cells from that result
Yo        % switch the case of those substrings
2L(       % place the result back in even positioned cells of the original cell array
g         % convert cell array to matrix, concatenating all substrings in the process
          % implicit output

คำตอบที่เก่ากว่า (23 ไบต์):

"H @ 'aA'm? ~ xhx} W @ ~? Yo] & h

วิธีอื่น ๆ ที่ฉันพยายาม:

0w"@t'aA'm?x~}y?Yo]w]]xv!
t'aA'mXHYsot&y*XzcYowf([]H(
t'aA'mXHYsoy3Y2m*32*Z~c[]H(

3

Huskขนาด 15 ไบต์

ω(F·+otm\↕·≠_'a

ลองออนไลน์!

คำอธิบาย

ω(F·+(tm\)↕·≠_'a) -- example input: "Bar, baz and Foo."
ω(              ) -- apply the following, until fixpoint is reached:
          ↕       -- | split string with predicate
           · _    -- | | the lower-cased character
            ≠ 'a  -- | | is not 'a'
                  -- | : ("B","ar, baz and Foo.")
  F               -- | apply the following to the tuple
    +             -- | | join the elements with..
   · (   )        -- | | ..the second element: "ar, baz and Foo."
       m\         -- | | | swap case: "AR, BAZ AND fOO."
      t           -- | | | tail: "R, BAZ AND fOO."
                  -- | : "BR, BAZ AND fOO."
                  -- : "BR, Bz ND fOO."

3

05AB1E , 12 ไบต์

õ?„AaS¡Dvć?š

ลองออนไลน์!

คำอธิบาย

õ?             # print an empty string (to account for the special case of only A's)
  „AaS¡        # split on occurrences of "A" or "a"
       D       # duplicate
        v      # for each element in the top copy
         ć?    # extract and print the head of the other copy
           š   # switch the case of the rest of the other copy

3

Japt v2.0a0, 16 ไบต์

e/a.*/i_År\l_c^H

ลองมัน


คำอธิบาย

e                   :Recursively replace
 /a.*/i             :RegEx /a.*/gi
       _            :Pass each match through a function
        Å           :  Slice off the first character
         r          :  Replace
          \l        :  RegEx /[A-Za-z]/g
            _       :  Pass each match though a function
             c^     :    Bitwise XOR the character code
               H    :    With 32

3

SNOBOL4 (CSNOBOL4) , 141 92 ไบต์

	I =INPUT
S	I ANY("Aa") REM . R =REPLACE(R,&LCASE &UCASE,&UCASE &LCASE) :S(S)
	OUTPUT =I
END

ลองออนไลน์!

ถือว่าอินพุตบรรทัดเดียว

บันทึกแล้ว 49 ไบต์โดย@ninjalj !

Line Sทำงานได้ทั้งหมดอธิบายด้านล่าง:

I                    # in the subject string I match the following PATTERN:
 ANY("Aa")           # match A or a and
 REM . R             # match the remainder of I, assigning this to R
 =REPLACE(           # replace the PATTERN above with
          R, ...)    # R with swapped cases.
   :S(S)             # and if there was a match, goto S, else goto next line 


สิ่งนี้จะให้คำตอบที่ผิด (ตามที่คุณระบุไว้ในความคิดเห็นของคุณกรณีถูกสลับเมื่อเปิดใช้ CapsLock)
mbomb007

ฉันได้แก้ไขโพสต์เพื่อต้องการการสลับตัวพิมพ์เล็ก (ไม่ใช่แค่ตัวพิมพ์ใหญ่) เมื่อเปิดใช้งาน CapsLock เพราะฉันไม่เคยรู้ว่าเครื่องของฉันทำสิ่งนี้
Broadwell

@ mbomb007 อ่าฉันไม่เคยรู้ว่า OP เปลี่ยนไปหรอก ฉันกำลังแก้ไขเพื่อขอคำอธิบายในขณะนี้ดังนั้นฉันจะรวมไว้ในคำอธิบาย
Giuseppe

I =INPUT;S I ANY("Aa") REM . R =REPLACE(R,&LCASE &UCASE,&UCASE &LCASE) :S(S); OUTPUT =I;END
ninjalj

@ninjalj คุณจะยังเป็นนักกอล์ฟที่ SNOBOL หรือฉันเพียงแค่สาหัสที่เล่นกอล์ฟมัน ??
Giuseppe

3

Fortran (GFortran) 307 ไบต์

CHARACTER(999)F,G
G=' '
READ(*,'(A)')F
N=1
M=1
DO I=1,999
IF(F(I:I)=='a'.OR.F(I:I)=='A')THEN
M=-M
ELSEIF(M==1)THEN
G(N:N)=F(I:I)
N=N+1
ELSE
J=IACHAR(F(I:I))
SELECTCASE(J)
CASE(65:90)
G(N:N)=ACHAR(J+32)
CASE(97:122)
G(N:N)=ACHAR(J-32)
CASE DEFAULT
G(N:N)=F(I:I)
ENDSELECT
N=N+1
ENDIF
ENDDO
PRINT*,TRIM(G)
END

ลองออนไลน์!

เนื่องจาก Fortran ไม่มีเครื่องมือ "ขั้นสูง" สำหรับจัดการกับสายอักขระฉันจึงได้พบกับสัตว์ประหลาดตัวเล็กนี้

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

CHARACTER(999)F,G	!Define input and output strings (up to 999 characters)
G=' '			!Fill output with spaces
READ(*,'(A)')F		!Take input
N=1			!Represent the position to be written in output string
M=1			!M=-1: Change case; M=1: Do not change case
DO I=1,999
	IF(F(I:I)=='a'.OR.F(I:I)=='A')THEN	!If the character is A...
		M=-M				!Ah-ha - you pressed cPS-LOCK!
	ELSEIF(M==1)THEN			!Case the character is not A, and do not need to change case...
		G(N:N)=F(I:I)			!...only copy the character
		N=N+1
	ELSE !Otherwise...
		J=IACHAR(F(I:I))			!...get ascii of current character
		SELECTCASE(J)
			CASE(65:90)			!If is upper case,
				G(N:N)=ACHAR(J+32)	!now is lower case
			CASE(97:122)			!If is lower case,
				G(N:N)=ACHAR(J-32)	!now is upper case
			CASE DEFAULT			!If do not belong to alphabet,
				G(N:N)=F(I:I)		!simply copy the character
		ENDSELECT
		N=N+1
	ENDIF
ENDDO
PRINT*,TRIM(G) !Trim out trailing spaces
END !That's all folks!

3

Stax , 12 ไบต์

ìo'½`║â↨╪U?5

เรียกใช้และตรวจแก้จุดบกพร่องออนไลน์

มันแยกบน regex แล้วสลับสลับกรณีและปัญหา นี่คือโปรแกรมเดียวกันแตกออก ungolfed และแสดงความคิดเห็น

"a|A"|s split on regex /a|A/
rE  reverse and explode array to stack
W   repeat forever...
p   print top of stack with no newline
:~p print top of stack, case inverted, with no newline

เรียกใช้อันนี้


ฉันไม่สามารถเกี่ยวข้องกับคำอธิบายของคุณกับรหัสของคุณ
SK19

ลองใช้ขั้นตอนที่แสดงความคิดเห็นและดูสถานะภายในของล่าม มันช่วยได้ไหม
เรียกซ้ำ

1
@ SK19: โอ้ฉันคิดว่าฉันเห็นปัญหา ฉันไม่ได้พูดถึงโปรแกรมสแตกซ์ที่มีการรับรองสองแบบ Ascii และอัดแน่น มีการสูญเสียการแปลงระหว่างสอง Ascii นั้นง่ายต่อการพิมพ์ แต่สิ้นเปลืองสำหรับการเล่นกอล์ฟเนื่องจากมีเพียง 95 สัญลักษณ์เท่านั้น โปรแกรม golfed ได้รับการบรรจุดังนั้นมันจึงดูต่างกัน แต่เป็นโปรแกรมเดียวกัน
เรียกซ้ำ

3

Javascript (ES6), 80 79 ไบต์

(ตามคำตอบนี้โดย Rick Hitchcock บางส่วนการโพสต์เป็นคำตอบแยกต่างหากเพราะฉันไม่มีชื่อเสียงเพียงพอที่จะแสดงความคิดเห็น)

(บันทึกแล้ว 1 ไบต์ขอบคุณที่โพสต์ของ @ l4m2 ที่นี่ )

a=>a.replace(j=/a()|./gi,(c,o=c[`to${j^c>{}?'Low':'Upp'}erCase`]())=>(j^=!o,o))

ยินดีต้อนรับสู่ PPCG!
Laikoni

2

Dirty , 55 ไบต์

⇙U◌␛⮕⇨'aA'⇗⭱∈⊭⋱2wẂ[⭱y⋱1wx⮕⭧]
    \   ␛◌Ẃ!w1/      \1wX/

ลองออนไลน์!

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


2

Python 3, 78 72 ไบต์

import re
lambda x:re.sub("[Aa](.*?)(a|A|$)",lambda m:m[1].swapcase(),x)

คุณสามารถใช้m[1]แทนm.group(1)Python 3.6+
Bubbler

เหตุใดสิ่งนี้จึงถูกตั้งค่าสถานะว่ามีคุณภาพต่ำ ...
Nissa

ฉันไม่มีความคิด ...
pppery

1
โพสต์ใหม่จะถูกตั้งค่าสถานะโดยอัตโนมัติหากโพสต์นั้นสั้นและไม่มีข้อความ การเพิ่มคำอธิบายมักจะป้องกันไม่ให้
mbomb007

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