ทำซ้ำ & สลับตัวพิมพ์เล็ก


34

เป้าหมายคือใช้สตริงเป็นอินพุตทำซ้ำตัวอักษรละตินแต่ละตัวและ "สลับ" ในกรณีของมัน (เช่นตัวพิมพ์ใหญ่กลายเป็นตัวพิมพ์เล็กและในทางกลับกัน)

ตัวอย่างอินพุตและเอาต์พุต:

Input      Output
bad        bBaAdD
Nice       NniIcCeE
T e S t    Tt eE Ss tT
s E t      sS Ee tT
1!1!1st!   1!1!1sStT!
n00b       nN00bB     
(e.g.)     (eE.gG.)
H3l|@!     Hh3lL|@!

อินพุตประกอบด้วยสัญลักษณ์ ASCII ที่พิมพ์ได้

คุณไม่ควรทำซ้ำตัวอักษรที่ไม่ใช่ละตินตัวเลขตัวอักษรพิเศษ


17
นี่เป็นความท้าทายที่ดีมากเรียบง่าย แต่ไม่สำคัญ
Mego

คำตอบ:



17

Python 56 56ไบต์

lambda s:''.join(c+c.swapcase()*c.isalpha()for c in s)

ทดสอบบนIdeone


แดง! ออกแข็งแรงเล่นกอล์ฟฉันโดย 4 ไบต์ ...
อาร์ Kap

วิธีนี้จะรักษาอักขระที่ไม่ใช่ตัวอักษรได้อย่างไร ฉันคิดว่าพวกเขาแสดงเป็นสตริงว่างเปล่า
กายวิภาคศาสตร์

@atlasologist ตามที่คุณเห็นใน Ideone พวกเขาทำไม่ได้ *มีลำดับความสำคัญสูงกว่า+ดังนั้นจะมีผลcกับกรณีที่มีการสลับ
Dennis

โอ้ไม่เป็นไรฉันไม่ได้คิดอย่างนั้น ดี
กายวิภาคศาสตร์

16

JavaScript ES6, 70 68 66 64 ไบต์

บันทึก 2 ไบต์ขอบคุณ@Kevin Lau - ไม่ใช่ Kenny

บันทึก 2 ไบต์ขอบคุณ@ CᴏɴᴏʀO'Bʀɪᴇɴ

s=>s.replace(/[A-Z]/gi,l=>l+l[`to${l<"a"?"Low":"Upp"}erCase`]())

คำอธิบาย

สิ่งนี้ใช้แฮ็คจริงๆ:

l[`to${l<"a"?"Low":"Upp"}erCase`]()

สิ่งที่ไม่ดีงามคือ:

l[`to${
   l < "a" ?
   "Low" : 
   "Upp"
}erCase`]()

l < "a"ตรวจสอบโดยทั่วไปว่าจุดรหัสของตัวอักษรน้อยกว่าจุดรหัสของa(ดังนั้นจึงเป็นตัวอักษรตัวพิมพ์ใหญ่) ถ้ามันจะทำto + Low + erCaseซึ่งl['toLowerCase']()จะกลายเป็นและทำให้ตัวละครตัวเล็ก `เครื่องหมายคำพูดอนุญาตการจัดรูปแบบสตริงดังนั้นโดยพื้นฐานแล้วคุณสามารถคิดถึง:

`to${l < "a" ?"Low" : "Upp"}erCase`

as: "to" + (l<"a" ? "Low" : "Upp") + "erCase"ซึ่งสร้างฟังก์ชันที่จะเรียกใช้ (ทำสตริงตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก) เราใส่สิ่งนี้ลงในวงเล็บเหลี่ยม[ ... ]ซึ่งทำให้เราสามารถเข้าถึงคุณสมบัติที่กำหนดชื่อเป็นสตริงได้ นี่จะส่งคืนฟังก์ชันที่เหมาะสมแล้วเราก็เรียกมันว่า


3
/[A-Z]/giเป็น regex ที่สั้นกว่า: 3
หมึกมูลค่า

@ KevinLau-notKenny โอ้จับได้ดีมากขอบคุณ!
Downgoat

1
to${l<"a"?"Lower":"Upper"}Caseถึงto${l<"a"?"Low":"Upp"}erCase
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴโอ้ดีขอบคุณ!
Downgoat

4
l[`to${l<"a"?"Low":"Upp"}erCase`]()ฉันคิดว่าเรามีคำนิยามใหม่ของความชั่วร้าย
gcampbell

10

Ruby, 37 33 (30 + -pค่าสถานะ) ไบต์

swapcaseช่วยเหลือ! เรียงจาก -4 ไบต์จาก @Lynn

gsub(/[a-z]/i){$&+$&.swapcase}

gsub(/[a-z]/i){$&+$&.swapcase}บวกpแฟล็กคือ 31 ไบต์
ลินน์

1
@Lynn ฉันเชื่อว่าฉันทามติคือความแตกต่างในการแก้ไขที่จำเป็นจากสคริปต์เริ่มต้นดังนั้นpค่าสถานะคือ(space)-paka 3 ไบต์
หมึกมูลค่า

8

C, 63 60 ไบต์

f(char*s){for(;*s;s++)isalpha(putchar(*s))&&putchar(32^*s);}

ใช้ความจริงนั้น'a' XOR 32 == 'A'เป็นต้น

บันทึกสามไบต์ด้วย FryAmTheEggman


คุณสามารถย้ายs++ในputchar( &&putchar(32^*s++)) สุดท้ายเพื่อบันทึกหนึ่งไบต์
Giacomo Garabello

ฉันคิดว่าคุณสามารถแทนที่&&ด้วย*ใช่ไหม
aloisdg พูดว่า Reinstate Monica

1
ฉันค่อนข้างมั่นใจว่าทั้งสองอย่างนี้ไม่ทำงานถ้าฉันคิดว่า&&พฤติกรรมการลัดวงจรของทำงานอย่างไร
ลินน์

f(char*s){isalpha(putchar(*s))&&putchar(32^*s);*s&&f(1+s);}recursive?
l4m2

1
f(char*s){*s&&f(1+s,isalpha(putchar(*s))&&putchar(32^*s));}recursive?
l4m2

6

CJam, 11 ไบต์

l_el_eu.+.|

ทดสอบที่นี่

คำอธิบาย

l      e# Read input.
_el    e# Duplicate, convert to lower case.
_eu    e# Duplicate, convert to upper case.
.+     e# Concatenate the two characters in matching positions from those two
       e# strings. E.g. "ab!" "AB!" would give ["aA" "bB" "!!"].
       e# For each character from the original string and the corresponding 
.|     e# string from this list, take the set union (which eliminates duplicates
       e# and keeps the order the values appear in from left to right, so that
       e# the original case of each letter comes first).




5

Cheddar , 118 104 bytes

(s)->s.chars.map((i)->{if String.letters has i.lower{if i<"a"{i+i.lower}else{i+i.upper}}else{i}}).join()

คำตอบของ Cheddar ตัวจริง !!! นี่เป็นจุดสูงสุดน้อยกว่าที่ฉันคิดว่ามันจะเป็น ... ; _;

ทำงานร่วมกับรีลีส1.0.0-beta.9ซึ่งไม่ใช่การแข่งขัน


อย่างที่คุณบอกได้ว่าฉันไม่ได้ออกแบบเชดดาร์ให้เป็นกอล์ฟ: /

Ungolfed:

(str) -> str.chars.map(
    (i) -> {
        if String.letters has i {
            if i < "a" { // Check char code, meaning it's upper case if true
                i+i.lower
            }
            else {
                i+i.upper
            }
        } else {
            i
        }
    }
).join()

การใช้งาน:

var doThing = <code here>;
doThing("input...");

อัปเดต: 7/14/16 ฉันได้เสร็จสิ้นการทำไตรภาคทำให้เรื่องนี้ลดลงถึง 84 ไบต์

Cheddar, 84 ไบต์

(s)->s.chars.map((i)->String.letters has i.lower?i<"a"?i+i.lower:i+i.upper:i).join()

ทำงานเหมือนเวอร์ชันv1.0.0-beta.14


4
เย้! เรารอมานานแล้ว!
DJMcMayhem

เมื่อมีการเปลี่ยนชื่อวิธีหนึ่งหรือสองรายการก็สามารถใช้งานได้Sidef
cat

@cat o_o ความคล้ายคลึงกันไม่มั่นคง
Downgoat

พวกมันทั้งคู่ได้รับอิทธิพลจาก Perl, Perl 6, Ruby, Python และอื่น ๆ ดังนั้นจึงไม่น่าแปลกใจที่: P
cat

1
@cat โอ้ไม่ไม่ไม่ไม่ไม่เชดดาร์ไม่ได้รับอิทธิพลจากหลาม
Downgoat

4

Retina, 28 27 21 ไบต์

นั่นคือแท็บไม่ใช่ที่ว่าง

.
$&  $&
T`lL    p`Ll_`  .

ลองออนไลน์

ขอบคุณสำหรับคำแนะนำทุกคน


ช่องว่างถูกกินโดย SE
Conor O'Brien

[A-Za-z]->i`[A-Z]
Downgoat

มาร์ตินกับฉันกำลังคุยกันอยู่และเราก็มาด้วย: retina.tryitonline.net/ …
FryAmTheEggman

@FryAmTheEggman อ่าฉันลืมไป_แล้ว ฉันจะใช้แท็บเพื่อทดสอบกรณีทดสอบทั้งหมดในครั้งเดียว
mbomb007

1
แต่ชุดทดสอบไม่จำเป็นต้องเล่นกอล์ฟ: P เพียงแค่ทิ้งข้อความไว้ว่า "บรรทัดแรกทำให้แยกกันในแต่ละบรรทัด" มักจะดีพอ ที่นี่จะช่วยให้คุณประหยัดความบ้าคลั่งของตัวละครแท็บ
FryAmTheEggman

4

C, 87 80

ส่งผ่านสตริงเป็นอินพุตf()และเอาต์พุตถูกเขียนไปยัง STDOUT สตริงไม่ถูกแก้ไข

f(char*v){for(;*v;++v)putchar(*v),isalpha(*v)?putchar(*v-32+64*!islower(*v)):0;}

คุณสามารถหาวิธีทดลองออนไลน์ได้หรือไม่?
aloisdg พูดว่า Reinstate Monica

@aloisdg ลองideone.com
cat

4

sed, 30 ไบต์

รหัส 29 ไบต์ + พารามิเตอร์ 1 ไบต์ -r

s/([a-z])|([A-Z])/&\u\1\l\2/g

การใช้งาน:

echo -e 'bad\nNice\nT e S t\ns E t\n1!1!1st!\nn00b\n(e.g.)\nH3l|@!' |\
sed -r 's/([a-z])|([A-Z])/&\u\1\l\2/g'

4

J, 31 29 ไบต์

[:;]<@~."1@,.tolower,.toupper

คำอธิบาย

[:;]<@~."1@,.tolower,.toupper  Input: s
                      toupper  Convert s to all uppercase
             tolower           Convert s to all lowercase
                    ,.         Join them as columns in a 2d array
   ]                           Identity function, get s
           ,.                  Prepend s as a column to the 2d array
      ~."1@                    Take the unique chars on each row
    <@                         Box them
[:;                            Unbox the list of boxes and join their contents and return

4

Haskell, 121, 101, 85, 82

import Data.Char
g n|isLower n=toUpper n|1<2=toLower n
(>>= \x->x:[g x|isAlpha x])

3
โดยการแทนที่ if-then-else โดย guards คุณสามารถบันทึก 15 ไบต์หรือมากกว่านั้น และisLowerสั้นกว่าโครงสร้างด้วยelemอีก 5 ไบต์
arjanen

1
>>=คือconcatMap(หรือconcat.map) f n = n >>= (\x->if isAlpha x then[x,r x]else[x])ที่มีการขัดแย้งพลิก: คุณสามารถไป pointfree และงดชื่อฟังก์ชั่นและเปลี่ยนความหมายของด้วยf (>>= \x->if isAlpha x then[x,r x]else[x])
nimi

1
แทนการotherwiseที่คุณสามารถใช้การแสดงออกใด ๆ ที่ประเมินเช่นTrue 1<2คุณสามารถแทนที่ด้วยความเข้าใจรายการ:if .. then .. else \x->[x]++[g x|isAlpha x]โอ้และมีข้อผิดพลาด: ที่สองtoUpperในจะต้องเป็นg toLower
nimi

1
โอ้อีกหนึ่ง: คือ[x]++ x:
nimi

4

Perl, 36 ไบต์ ( -nธง+ 35 )

s/[a-z]/$&.(ord$&<97?lc$&:uc$&)/ige

( -pจำเป็นต้องติดแท็ก)

(-2 ไบต์ขอบคุณ @Dom Hasting)

คำอธิบายสั้น ๆ :
ordคืนค่าตัวเลขของถ่าน และord(any lower case) >= 97ord(any upper case) <= 90)

ทำงานด้วย:

perl -pe 's/[a-z]/$&.(ord$&<97?lc$&:uc$&)/ige'

คุณยังจำเป็นต้องใช้มิ/iฉะนั้น regexp ของคุณจะจับคู่ codepoints หลายตัวระหว่างตัวอักษร
Oleg V. Volkov

@ OlegV.Volkov โอ้ใช่แล้วขอบคุณตอบตอบแก้ไข
Dada

รับมันลงอีกหนึ่งไบต์โดยใช้วิธีการของคุณ: ลองออนไลน์!
Xcali

4

Ruby, 31 + 1 = 32 30 + 1 = 31 bytes

ด้วยการ-pตั้งค่าสถานะเรียกใช้

gsub(/(?<=(.))/){$1.swapcase!}

ใช้ประโยชน์จากความจริงที่ว่าswapcase!จะส่งคืนnilในทุกสิ่งยกเว้นตัวอักษร ASCII ซึ่งแปลเป็นสตริงว่างเมื่อส่งคืนจากgsubบล็อก @Jordan บันทึก byte โดยการจับตัวอักษรก่อนหน้าในลักษณะที่อยู่เบื้องหลัง


จับคู่กับ//และจากนั้นใช้$`[-1]ฉลาด
จอร์แดน

1
ฉันจัดการเพื่อโกนหกไบต์กับ gsub(/(?<=(.))/){$1.swapcase!}lookbehind: อย่างไรก็ตามแนวคิดพื้นฐานที่เหมือนกันดังนั้นอย่าลังเลที่จะใช้มัน
จอร์แดน

เย็น! นั่นดูสั้นลงหนึ่งไบต์สำหรับฉัน
ฮิสโทแกต

เอ้อใช่หนึ่งไบต์ ฉันคิดว่าฉันมีรหัสพิเศษในการทดสอบว่าฉันนับโดยไม่ได้ตั้งใจ
จอร์แดน

.swapcase!ไม่มีความจำเป็นต้องใช้รุ่นด้วยตนเองการปรับเปลี่ยนคือ (ฉันหมายถึงให้ลบออก!.)
จัดการ

4

R, 191 187 168 156 98 99 ไบต์

99 ไบต์เนื่องจากการปรับปรุงเทียวจูเซปเป้และMickyT

paste0(x<-unlist(strsplit(readline(),"")),gsub("[^A-Za-z]","",chartr("a-zA-Z","A-Za-z",x)),collapse="")

98 ไบต์ - บางทีในปีหน้าเราสามารถหาสนามกอล์ฟแห่งนี้ได้ฮ่าฮ่าฮ่า
Giuseppe

1
ฉันเกลียดที่จะเป็นผู้ถือของใหม่ที่ไม่ดี แต่มันล้มเหลวในกรณีทดสอบที่มีช่องว่าง readline()สามารถใช้งานได้ แต่จะมีค่าใช้จ่ายไบต์
MickyT

@MickyT ขอบคุณคงตอนนี้
rturnbull

@MickyT scanจะทำงานร่วมกับการป้อนข้อมูลที่ได้รับการห่อในเครื่องหมายคำพูด (เช่นมักจะเป็นกรณีสำหรับอาร์กิวเมนต์บรรทัดคำสั่งในภาษาอื่น ๆ )
Giuseppe

@Giuseppe ขออภัยฉันไม่ทราบว่า ฉันแค่คิดว่ามันแยกโดยอัตโนมัติในช่องว่างเว้นแต่คุณจะระบุตัวละครที่ไม่ใช่ช่องว่าง ขออภัย rturnbull
MickyT

3

05AB1E , 7 ไบต์

รหัส:

vyyš«Ù?

คำอธิบาย:

v       # For each in input.
 yyš    # Push y and y swapcased.
    «Ù  # Concatentate and uniquify.
      ? # Print without a newline.

ใช้การเข้ารหัสCP-1252 ลองออนไลน์!


คุณอาจให้ลิงค์ไปยังล่ามหรือไม่
nicael

2
@nicael มันเชื่อมโยง ... มันอยู่ตรงนั้นบน github
mbomb007

ดังนั้นไม่มีล่ามออนไลน์? :(
nicael

@nicael จากนั้นดาวน์โหลดและเรียกใช้ ไม่จำเป็นต้องเป็นล่ามออนไลน์แต่เป็นล่าม
mbomb007

1
@nicael ใช่ยังไม่มีล่ามออนไลน์ให้ :( รุ่นออฟไลน์น่าจะใช้ได้นะ
Adnan




3

MATL, 11 9 ไบต์

tYov"@uv!

ลองออนไลน์

คำอธิบาย

        % Implicitly grab input as string
t       % Duplicate the input
Yo      % Swap case of all characters
v       % Vertically concatenate the original and swap-cased versions
"       % For each column (letter in the original)
  @u    % Compute the unique values (without sorting)
  v!    % Vertically concatenate with the existing output and transpose
        % Implicit end of for loop and implicit display

3

Perl, 28 22 21 ไบต์ (20 + -pธง)

s/[a-z]/$&.$&^$"/ige

ฉันคิดว่าคุณสามารถบันทึกไบต์โดยใช้$"แทน' 'แต่ฉันยังไม่ได้ทดสอบ
msh210

@ msh210 ดีมาก! ฉันจะลืมตรวจสอบ perlvar สำหรับสตริงเริ่มต้นได้อย่างไร ขอบคุณ!
Oleg V. Volkov

3

Stax , 7 6 ไบต์

ขอบคุณ @recursive สำหรับบันทึกไบต์!

┤§ÆP♦■

เรียกใช้และแก้ไขปัญหาได้ที่ staxlang.xyz! (ลิงก์ไปยังเวอร์ชันที่คลายการแพคแล้ว)

คลายการแพค (7 ไบต์):

c:~\{um

คำอธิบาย:

c:~\{um
c          Copy the top element of the stack (the input, in this case).
 :~        Switch case of each letter in the copy.
   \       Zip. This produces an array of two-character strings.
    { m    Map a block over this array of two-character strings.
     u       Get all unique elements.
           Implicit concatenate and print.

ขอบคุณที่ให้สแตกซ์ลอง หนึ่งในการปรับปรุงเรื่องง่ายที่คุณสามารถทำคือการใช้แทนu :gมันจะได้รับองค์ประกอบที่ไม่ซ้ำกันทั้งหมดในอาร์เรย์ซึ่งเป็นสิ่งที่คุณต้องการในกรณีนี้ นอกจากนั้นมันก็ดูดีมาก
เรียกซ้ำ

@ ขอบคุณขอบคุณ! ลืมเรื่องนั้น: / จะแก้ไขในไม่ช้า
Khuldraeseth na'Barya

123ไม่ทำงานสำหรับ คุณอาจต้องเปลี่ยนรูปแบบสำหรับอินพุตทั้งหมด (เช่นอ้างถึง) ลิงค์เสีย คุณต้องแทนที่ด้วยm=11 m=2มีปุ่มสร้างโพสต์ PPCG บน staxlang.xyz ดังนั้นคุณอาจต้องการใช้ปุ่มนั้น
Weijun Zhou

@ WeijunZhou ขอบคุณคงที่!
Khuldraeseth na'Barya

2

Python ขนาด 59 ไบต์

lambda s:''.join((x,x+x.swapcase())[x.isalpha()]for x in s)

แก้ไขเพื่อแก้ไขการทำซ้ำตัวอักษรที่ไม่ใช่ตัวอักษร



2

PHP 4.1, 57 ไบต์

รหัสนี้ถือว่าการเข้าถึงผ่านเว็บเซิร์ฟเวอร์ (เช่น Apache) โดยใช้การกำหนดค่าเริ่มต้น

คุณสามารถส่งผ่านสตริงโดยการส่งกุญแจสำคัญSโดยวิธีใด ๆ ( POST, GET, COOKIE, SESSION... )

<?for($i=0;$c=$S[$i++];)echo$c,ctype_alpha($c)?$c^' ':'';


2

Common Lisp (Lispworks), 262 ไบต์

(defun f(s)(let((b""))(dotimes(i(length s))(if(lower-case-p(elt s i))(progn #1=(setf b(concatenate 'string b(string #2=(elt s i))))(setf b(concatenate 'string b(string(char-upcase #2#)))))(progn #1#(setf b(concatenate 'string b(string(char-downcase #2#)))))))b))

ungolfed:

(defun f (s)
  (let ((b ""))
    (dotimes (i (length s))
      (if (lower-case-p (elt s i))
          (progn
           #1=(setf b (concatenate 'string b (string #2=(elt s i))))
           (setf b (concatenate 'string b (string (char-upcase #2#)))))
        (progn
          #1#
          (setf b (concatenate 'string b (string (char-downcase #2#)))))))
    b))

การใช้งาน:

CL-USER 1 > (f "abc")
"aAbBcC"

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