AlTeRnAtE CaSe


41

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

hello world

และแปลงตัวละครอื่น ๆ ให้เป็นตัวพิมพ์ใหญ่คุณจะได้รับ:

hElLo wOrLd

ในขณะที่คุณสามารถดูตัวพิมพ์เล็กตามด้วยตัวพิมพ์เล็กo wสิ่งนี้ไม่ถูกต้อง แต่คุณต้องเพิกเฉยช่องว่างโดยให้ผลลัพธ์นี้แก่เรา:

hElLo WoRlD

อักขระที่ไม่ใช่ตัวอักษรทั้งหมดต้องอยู่ในสภาพเดียวกัน เอาต์พุตสามารถเริ่มต้นด้วยตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กตราบใดที่มันสลับกันอย่างสม่ำเสมอ นี่หมายความว่าสิ่งต่อไปนี้จะเป็นผลลัพธ์ที่ยอมรับได้:

HeLlO wOrLd

โปรแกรมของคุณควรทำงานโดยไม่คำนึงถึงกรณีของอินพุต

สตริงอินพุตจะมีASCII ที่พิมพ์ได้เท่านั้นคุณจึงไม่ต้องกังวลเกี่ยวกับอักขระที่ไม่สามารถพิมพ์ได้บรรทัดใหม่หรือ unicode การส่งของคุณอาจเป็นโปรแกรมเต็มรูปแบบหรือฟังก์ชั่นและคุณอาจใช้อินพุตและเอาต์พุตในรูปแบบที่เหมาะสม ตัวอย่างเช่นฟังก์ชันอาร์กิวเมนต์ / ค่าส่งคืน STDIN / STDOUT การอ่าน / เขียนไฟล์ ฯลฯ

ตัวอย่าง:

ASCII                                   ->  AsCiI
42                                      ->  42
#include <iostream>                     ->  #InClUdE <iOsTrEaM>
LEAVE_my_symbols#!#&^%_ALONE!!!         ->  lEaVe_My_SyMbOlS#!#&^%_aLoNe!!!
PPCG Rocks!!! For realz.                ->  PpCg RoCkS!!! fOr ReAlZ.
This example will start with lowercase  ->  tHiS eXaMpLe WiLl StArT wItH lOwErCaSe
This example will start with uppercase  ->  ThIs ExAmPlE wIlL sTaRt WiTh UpPeRcAsE
A1B2                                    ->  A1b2

เนื่องจากนี่เป็นจึงมีช่องโหว่มาตรฐานและคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ!


32
ฮึฉันได้เพียงแค่การตระหนักในเรื่องนี้เป็นที่มส์ xD
เบต้าผุ

@BetaDecay ฮ่าฮ่าฮ่านั่นไม่ใช่ความตั้งใจของฉัน เวลาที่โชคร้ายมากขึ้น ฉันคิดว่ามันเป็นความท้าทายในการแชทและฉันชอบความคิดที่อยู่เบื้องหลังเพราะมันยากกว่าที่คิด
DJMcMayhem

4
ความท้าทายต่อไปคือการพิมพ์ ascii spongebob à lacowsay
Frambot

1
สาปมัน! ฉันเพิ่งเขียนสคริปต์ CJam สำหรับสิ่งนี้ (เหมือนเมื่อวานนี้) และลบมัน
แยกผลไม้

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

คำตอบ:


19

JavaScript (ES6), 66 63 ไบต์

เริ่มด้วยตัวพิมพ์ใหญ่

s=>s.replace(/[a-z]/gi,c=>c[`to${(s=!s)?'Low':'Upp'}erCase`]())

กรณีทดสอบ


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

ใช่การใช้แบบไตรภาคคือสิ่งที่ฉันจะแนะนำ
Shaggy

1
วิธีการที่ไม่s=!sทำงานเคล็ดลับ?
Kritixi Lithos

7
@KritixiLithos เพราะsเป็นสตริงป้อนข้อมูล!sอันดับแรกให้ประเมินfalse(ยกเว้นสตริงอินพุตว่างซึ่งในกรณีนี้จะประเมินเป็นtrue- แต่สตริงว่างจะไม่สร้างการแข่งขันใด ๆ อยู่แล้ว) หลังจากนั้นก็จะกลายเป็นเพียงการดำเนินการบูลีนมาตรฐานการสลับระหว่างและfalse trueนอกจากนี้เราไม่รังเกียจที่จะสูญเสียเนื้อหาของsณ จุดนี้เนื่องจากเคยใช้ฟีด.replace()แล้ว
Arnauld

3
@MayorMonty น่าเสียดายที่ตรงกับสัญลักษณ์บางอย่าง อินพุตเช่น"A[I"จะล้มเหลว
Arnauld

12

05AB1E , 11 8 ไบต์

รหัส:

lvyJ¤aiš

ใช้การเข้ารหัส05AB1E ลองออนไลน์!

คำอธิบาย:

l           # Lowercase the input
 vy         # For each element..
   J        #   Join the entire stack into a single string
    ¤a      #   Check if the last character is alphabetic
      iš    #   If true, swapcase the entire string

ฉันชอบที่จะลองตาบอดโดยรู้ว่าฉันต้องเอาชนะ 11 ไบต์; จากนั้นช้าลงจาก 17 ถึง 11 ไบต์และตระหนักlvy¾Fš}Da½Jว่าเป็นสิ่งที่คุณมีอยู่แล้ว
Magic Octopus Urn

1
@carusocomputing มีวิธีแก้ปัญหา 8 ไบต์ได้ง่ายกว่ามาก: p
Adnan

4
โอ้ใช่ซุปเปอร์ haha ง่าย
Magic Octopus Urn

2
@Octopus มีการอภิปรายเกี่ยวกับเรื่องนี้ แต่ฉันใช้ทั้ง 'osable' และ 'osabie'
Adnan

1
@octopus แท้จริงฉันพูดว่าOh-Five-Ay-Bee-One-Eeeฉันไม่ใช่คนที่มีความคิดสร้างสรรค์
Magic Octopus Urn


8

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

nŒsTm2
ŒlŒuǦ

ลองออนไลน์!

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

ŒlŒsǦ  Main link. Argument: s (string)

Œl      Cast to lowercase.
    Ǧ  At indices returned by the helper link...
  Œu        apply uppercase.


nŒsTm2      Helper link. Argument: s (string)

 Œs         Apply swapcase to s.
n           Perform vectorizing not-equal comparison.
   T        Compute the truthy indices.
    m2      Select every other one, starting with the first.

7

Japt , 16 14 ไบต์

r"%l"_m"uv"gT°

ลองออนไลน์!

คำอธิบาย

r              // RegEx replace input
 "%l"          // [A-Za-z] as first arg to replace
     _         // created function Z=>Z as second arg to replace
       "uv"gT° // alternates "u" & "v"
      m        // map Z to either "u" upper or "v" lower

ดีมาก! ,คุณสามารถลบ ยกเว้นว่าเป็นตัวเลข (เช่น[12]) Japt รู้ว่ามันเป็นไอเท็มที่ต่างกัน ฉันเชื่อว่าคุณสามารถลบได้&1เช่นกัน
Oliver

ขอบคุณ @obarakon เอกสาร Japt ค่อนข้างกระจัดกระจาย
powelles

ขอบคุณที่ใช้ Japt อย่าลังเลที่จะถามคำถามข้อเสนอแนะอื่น ๆ ในห้องแชท Japt นอกจากนี้ยังมีเคล็ดลับสำหรับด้าย Japt :)
โอลิเวอร์

_m"uv"gT°ดี ฉันแค่อยากจะแนะนำว่า
Oliver

@obarakon ใช่ฉันเห็นว่า ETH ตอบคำถามของคุณในการแชทและทำให้ฉันลองสิ่งต่าง ๆ
powelles

6

Python 3 , 86 76 68 66 63 ไบต์

ขอขอบคุณ DJMcMayhem -2
ไบต์ -3 ขอบคุณ Cyoce

x=0
for i in input():print(end=(2*i).title()[x]);x^=i.isalpha()

ลองออนไลน์! หรือลองกรณีทดสอบทั้งหมด


สั้นลงสองไบต์ใน python 3: ลองออนไลน์!
DJMcMayhem

1
เหตุผลใดที่คุณทำไม่ได้print(end=(2*i).title()[x])?
Cyoce

5

อลิซอายุ 18 ไบต์

/olZlYuN
@iy.u..//

ลองออนไลน์!

คำอธิบาย

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

il.l.uN.YuZyo@

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

i - push input onto stack            ["Hello world!"]
l - convert to lowercase             ["hello world!"]
. - duplicate                        ["hello world!", "hello world!"]
l - convert to lowercase (should be no-op, but avoids what seems to be a bug in the TIO implementation)
. - duplicate again                  ["hello world!", "hello world!", "hello world!"]
u - convert to uppercase             ["hello world!", "hello world!", "HELLO WORLD!"]
N - difference between sets          ["hello world!", "helloworld"]
. - duplicate reduced string         ["hello world!", "helloworld", "helloworld"]
Y - unzip (extract even positions)   ["hello world!", "helloworld", "hlool", "elwrd"]
u - convert to uppercase             ["hello world!", "helloworld", "hlool", "ELWRD"]
Z - zip evens back into string       ["hello world!", "helloworld", "hElLoWoRlD"]
y - perform substitution             ["hElLo WoRlD!"]
o - output                           []
@ - terminate

โดยไม่ต้องใช้lในการทำซ้ำกองหลังจะเป็นN ["helloworld", "helloworld"]ฉันสงสัยอย่างยิ่งว่านี่เป็นข้อผิดพลาด


5

C (tcc) , 60 57 56 ไบต์

ขอบคุณ DigitalTrauma สำหรับการสังเกตบิต 5 เป็นความแตกต่างเพียงอย่างเดียวสำหรับตัวพิมพ์ใหญ่ / เล็ก ASCII

ขอขอบคุณเป็นพิเศษสำหรับ zch สำหรับการเล่นกอล์ฟอีกสามไบต์

บันทึกอีกหนึ่งไบต์จากแนวคิดของ RJHunter

l;f(char*s){for(;*s=isalpha(*s)?*s&95|++l%2<<5:*s;s++);}

ลองออนไลน์!


ฉันเล่นกอล์ฟเพิ่มขึ้นเล็กน้อยและปรับเปลี่ยนเพื่อให้ทำงานได้กับ gcc, tcc และ clang ทั้งหมด FWIW, gcc ใส่ตัวอักษรสตริงในหน่วยความจำแบบอ่านอย่างเดียวดังนั้นฉันจึงใช้strdup()ตัวชี้ไปยังหน่วยความจำแบบอ่าน - เขียนในรหัสโปรแกรมควบคุมการทดสอบ
Digital Trauma

1
@ DigitalTrauma ขอบคุณสำหรับสิ่งนั้น ฉันควรได้รับการยอมรับบิต 5 คือความแตกต่างระหว่างบนและล่าง เยี่ยมมาก!
cleblanc

ฉันพยายามทำให้รุ่นนี้ซ้ำด้วย แต่ก็ไม่สามารถทำให้สั้นลงได้
Digital Trauma

คุณสามารถแทนที่เงื่อนไขภายในด้วย*s&~32|++l%2<<5เพื่อบันทึก 3 ไบต์
2560

เนื่องจากอินพุตสัญญาว่าจะสามารถพิมพ์ได้ ASCII คุณสามารถแทนที่&~33ด้วย&95เพื่อบันทึกไบต์เพิ่มเติม
RJHunter

4

Java 8, 99 ไบต์

a->{String r="";int i=0;for(int c:a)r+=(char)(c>64&c<91|c>96&c<123?i++%2<1?c|32:c&~32:c);return r;}

คำอธิบาย:

ลองที่นี่

a->{                          // Lambda with char-array parameter and String return-type
  String r="";                //  Result-String
  int i=0;                    //  Flag for alteration
  for(int c:a)                //  Loop over the characters of the input
    r+=(char)                 //   And append the result-String with the following (converted to char):
      (c>64&c<91|c>96&c<123?  //    If it's a letter:
       i++%2<1?               //     And the flag states it should be lowercase:
        (c|32)                //      Convert it to lowercase
       :                      //     Else (should be uppercase):
        (c&~32)               //      Convert it to uppercase
      :                       //    Else:
       c);                    //     Simply append the non-letter character as is
                              //  End of loop (implicit / single-line body)
  return r;                   //  Return result-String
}                             // End of method

ฉันไม่สามารถทำให้สั้นลงได้ แต่คุณสามารถใช้(c+"").matches("[A-Za-z]")หรือCharacter.isLetter(c)บันทึกไบต์ได้
TheLethalCoder

@TheLethalCoder ทั้งสองมีความยาวมากกว่าc>64&c<91|c>96&c<123แม้ว่า และเนื่องจากฉันใช้intสำหรับชิ้นส่วนCharacter.toUpperCase(...)และCharacter.toLowerCase(...)กอล์ฟ (เหล่านี้: (char)(c&~32)และ(char)(c|32)) ฉันสงสัยว่าฉันสามารถทำให้มันสั้นลงได้ด้วยชิ้นส่วนเหล่านี้
Kevin Cruijssen

1
ฉันคิดว่าคุณจะไม่สามารถที่จะโพสต์ แต่คุ้มค่าเพื่อดูว่าคุณสามารถทำให้การใช้งานของพวกเขาต่อไป
TheLethalCoder

@TheLethalCoder อ่าโอเค :) ในบางกรณีครั้งแรกอาจช่วยด้วยวิธีที่แตกต่างกันเล็กน้อยสำหรับความท้าทายอื่น ๆ แต่สำหรับความท้าทายนี้มันสั้นลงตามที่เป็นอยู่ ขอบคุณอยู่ดี
Kevin Cruijssen

a->{String r="";int i=0,f=32;for(int c:a)r+=(char)(c>64&c<91|c>96&c<123?(f=~f):c);return r;} ??
Roman Gräf

4

Ruby, 57 55 47 41 ไบต์

จำนวนไบต์ประกอบด้วยสองไบต์สำหรับตัวเลือกบรรทัดคำสั่ง
เรียกใช้ตัวอย่างเช่นนี้:$ ruby -p0 alternate_case.rb <<< "some input"

gsub(/\p{L}/){($&.ord&95|32*$.^=1).chr}

ด้วยp0ตัวเลือกการป้อนข้อมูลทั้งหมดจะถูกใช้ในครั้งเดียวและโลกแห่งเวทย์มนตร์$.จะเพิ่มขึ้นเป็น 1 ซึ่งจะสลับในภายหลังระหว่าง 0 และ 1 และใช้ในการรักษาสถานะ

ทำงานร่วมกับอินพุตหลายบรรทัด; ลองออนไลน์!

ขอบคุณ Ventero สำหรับการป้อนข้อมูลที่น่าทึ่ง - ตรวจสอบความคิดเห็นเพื่อดูรายละเอียด


1
มนุษย์ถ้าไม่ใช่เพราะการ$.เพิ่มอัตโนมัติในแต่ละการgetsโทรโปรแกรมเต็มรูปแบบที่มี-pค่าสถานะจะสั้นลง ...
Value Ink

1
1&$.+=1ช่วยให้คุณวางวงเล็บได้ และเพื่อความสมบูรณ์มีอีกจำนวนเต็มทั่วโลก - มันน่าเสียดายที่อ่านอย่างเดียว: $$.
Ventero

1
อีกสิ่งหนึ่งที่เกี่ยวกับธงบรรทัดคำสั่ง: -p0ทำให้ล่ามอ่านเข้าที่มีอยู่ทั้งหมดในหนึ่งไป - $.เพื่อให้รหัสของคุณจะถูกเรียกเพียงครั้งเดียวที่ช่วยให้คุณใช้งานได้อย่างอิสระ เมื่อรวมกับความจริงที่ว่าgsubทำงานโดยปริยาย$_.gsub!เมื่อระบุ-pทำให้โปรแกรมเต็มรูปแบบสั้นลงอย่างมีนัยสำคัญ: 48 ตัวอักษรgsub(/[a-z]/i){[$&.upcase,$&.downcase][1&$.+=1]}และ 2 สำหรับการp0ตั้งค่าสถานะ
Ventero

1
คำพูดสุดท้ายฉันสัญญา :) เมื่อคุณใช้งาน-p0คุณสามารถประหยัดจริงไม่กี่ตัวอักษรในวิธีที่คุณพลิก$.กลับมา: ตั้งแต่ก็รับประกันในขณะนี้ที่จะได้รับเมื่อรหัสของคุณจะถูกเรียกคุณก็สามารถใช้1 $.^=1
Ventero

2
ปรากฎฉันโกหกฉันมีความคิดเห็นอื่น: D ขณะที่การป้อนข้อมูลที่มีการประกันเพื่อเท่านั้นที่เคยมี ASCII พิมพ์เราสามารถใช้การสนับสนุนทับทิมสำหรับประเภท Unicode ในการแสดงออกปกติ: /\p{L}/(Unicode หมวดหมู่หนังสือ ) /[a-z|/iเป็นหนึ่งในตัวละครที่สั้นกว่า
Ventero

3

Brachylogขนาด 25 ไบต์

{ḷ|ụ}ᵐ.{ḷ∈Ạ&}ˢ¬{s₂{∈Ạ}ᵐ}∧

ลองออนไลน์!

นี่คือทั้งยาวและช้า

คำอธิบาย

{   }ᵐ.                       The Output is the result of mapping on each char of the Input:
 ḷ                              Lowecase the char
  |                             Or
   ụ                            Uppercase the char
       {    }ˢ                In the Ouput, select the chars that:
        ḷ∈Ạ&                    when lowercased are in "abc...xyz" (ie are letters)
              ¬{       }∧     In that new string, it is impossible to find:
                s₂              a substring of 2 consecutive chars
                  {∈Ạ}ᵐ         where both of them are in the lowercase alphabet

3

MATL , 16 15 ไบต์

Xktkyy-f2L))5M(

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

พิจารณาอินพุต 'hello world'

Xk    % To upper case
      % STACK: 'HELLO WORLD'
t     % Duplicate top element
      % STACK: 'HELLO WORLD', 'HELLO WORLD'
k     % To lower case
      % STACK: 'HELLO WORLD', 'hello word'
yy    % Duplicate top two elements
      % STACK: 'HELLO WORLD', 'hello word', 'HELLO WORLD', 'hello word'
-     % Difference (of code points; element-wise)
      % STACK: 'HELLO WORLD', 'hello word', [-32 -32 -32 -32 -32 0 -32 -32 -32 -32 -32]
f     % Indices of nonzeros
      % STACK: 'HELLO WORLD', 'hello word', [1 2 3 4 5 7 8 9 10 11]
2L)   % Keep only even-indexed values (*)
      % STACK: 'HELLO WORLD', 'hello word', [2 4 7 9 11]
)     % Reference indexing (get values at indices)
      % STACK: 'HELLO WORLD', 'elwrd'
5M    % Push (*) again
      % STACK: 'HELLO WORLD', 'elwrd', [2 4 7 9 11]
(     % Assignment indexing (write values at indices). Implicit display
      % STACK: 'HeLlO wOrLd

'


3

Perl 6 ,  32  30 ไบต์

{S:g/<:L><-:L>*<:L>?/$/.tclc()/}

ลองมัน

{S:g{<:L><-:L>*<:L>?}=$/.tclc}

ลองมัน

ขยาย:

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

  S            # string replace (not in-place) implicitly against 「$_」

  :global

  {

    <+ :L >    # a letter
    <- :L >*   # any number of non-letters
    <+ :L >?   # an optional letter

  }

  =

  $/.tclc()    # uppercase the first letter, lowercase everything else
}

3

q / kdb +, 51 42 38 ไบต์

วิธีการแก้:

{@[x;;upper]1#'2 cut(&)x in .Q.a}lower

ตัวอย่าง:

q){@[x;;upper]1#'2 cut(&)x in .Q.a}lower"hello world"
"HeLlO wOrLd"

หมายเหตุ:

.Q.a        // abcde...xyz lowercase alphabet
(&) x in    // where, returns indices for where x (hello world) is an alpha
2 cut       // splits list into 2-item lists
1#'         // takes first item of each 2-item list; ie the indices to uppercase
@[x;;upper] // apply (@) upper to x at these indices

2

V , 17 , 13 ไบต์

VUÍშáü$©/ì&

ลองออนไลน์!

หรือตรวจสอบกรณีทดสอบทั้งหมด!

hexdump:

00000000: 5655 cde1 83a8 e1fc 24a9 2fec 26         VU......$./.&

คำอธิบาย:

นี่ใช้การบีบอัด regex ™️ดังนั้นก่อนที่จะอธิบายให้ลองขยาย regex ออก:

:%s/\v\a.{-}(\a|$)/\l&

VUแปลงทุกอย่างเพื่อตัวพิมพ์ใหญ่ จากนั้นเรารันสิ่งนี้:

:%                      " On every line:
  s/\v                  "   Substitute:
      \a                "     A letter
        .{-}            "     Followed by as few characters as possible
            (\a|$)      "     Followed by either another letter or an EOL
                  /     "   With:
                   \l   "     The next character is lowercased
                     &  "     The whole text we matched

คำตอบเก่า / น่าสนใจ:

:se nows
Vuò~h2/á


2

CJam , 26 24 ไบต์

qeu{_'[,65>&,T^:T{el}&}%

ลองออนไลน์!

คำอธิบาย

q         e# Read all input.
eu        e# Uppercase it.
{         e# For each character:
 _        e#  Duplicate it.
 '[,65>&  e#  Set intersection with the uppercase alphabet.
 ,        e#  Length (either 0 or 1 in this case).
 T^:T     e#  XOR with T (T is initially 0), then store the result back in T.
 {el}&    e#  If The result of the XOR is true, lowercase the character.
}%        e# (end for)

2

Pyth, 11 ไบต์

srR~xZ}dGrZ

ลองที่นี่

คำอธิบาย

              # Z = 0; Q = eval(input())
srR~xZ}dGrZQ  # Auto-fill variables
         rZQ  # lowercase the input
 rR           # Apply the r function to each letter of the input with
   ~xZ}dG     # ... this as the other argument
   ~          # use the old value of the variable Z, then update it with the value of ...
    xZ        # Z xor ...
      }dG     # the variable d is a lowercase letter
              # because of how mapping works in pyth, d will contain the current letter
              # This causes Z to flip between 0 and 1, alternately upper and lower casing
              # the current character if it is a letter

2

PowerShell, 86 ไบต์

-join($args[0]|%{if($_-match"[a-z]"-and($i=!$i)){"$_".toupper()}else{"$_".tolower()}})

อินพุตเป็น[char[]]อาร์เรย์

ความคิดเห็นในรหัสสำหรับคำอธิบาย

# Join the array of string and char back together.
-join
    # Take the first argument and pass each element ([char]) down the pipe. 
    ($args[0]|%{
        # Check if this is a letter. Second condition is a boolean that changes at every pass 
        # but only if the current element is a letter. If not the condition never fires
        if($_-match"[a-z]"-and($i=!$i)){
            # Change the character to uppercase
            "$_".toupper()
        }else{
            # Output the character to lowercase. 
            # Special characters are not affected by this method
            "$_".tolower()
        }
    })

2

Haskell, 105 83 + 2 4 + 1 ไบต์ของตัวคั่น = 108 86 88 Bytes

import Data.Char
f#(x:y)|isLetter x=([toUpper,toLower]!!f)x:(1-f)#y|1>0=x:f#y
_#l=l

ฟังก์ชั่นคือ(1#)เริ่มตัวพิมพ์เล็ก ลองออนไลน์!

สิ่งที่น่าเศร้าก็คือนี่มันนานกว่า Java และ C # คำตอบขอบคุณØrjan Johansen ที่ช่วยประหยัด 22 ไบต์ด้วยการรวมสามบรรทัดเข้าด้วยกัน!


2
ฉันเห็นมันต้องการฟังก์ชั่นที่นำเข้ามานานดังนั้นฉันจึงไม่ได้ลอง ... แต่มันก็ค่อนข้างมากคุณสามารถรวมบางบรรทัด:f#(x:y)|isLetter x=([toUpper,toLower]!!f)x:(1-f)#y|1>0=x:f#y
Ørjan Johansen

ขออภัยสำหรับ nitpicking แต่ฉันคิดว่า1#ไม่นับเป็นฟังก์ชั่นที่ไม่ระบุชื่อ ในความเข้าใจของฉันเราควรจะสามารถผูกฟังก์ชันที่ไม่ระบุชื่อกับตัวระบุได้ แต่เช่นf=1#จะไม่ทำงาน แต่คุณต้องการส่วน(1#)สำหรับ +2 ไบต์ นี่คือสิ่งที่ระบุไว้โดยนัยในแนวทางชุมชนของเราสำหรับการเล่นกอล์ฟใน Haskellแม้ว่าอาจจะมีการดัดแปลงเพื่อพูดถึงกรณีนี้อย่างชัดเจน
Laikoni

@Laikoni ตกลงตอบรับการอัปเดต
ชื่อที่แสดงทั่วไป

2

Google ชีต 264 ไบต์

=ArrayFormula(JOIN("",IF(REGEXMATCH(MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1),"[A-Za-z]"),CHAR(CODE(UPPER(MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1)))+MOD(LEN(REGEXREPLACE(LEFT(A1,ROW(OFFSET(A1,0,0,LEN(A1)))),"[^A-Za-z]","")),2)*32),MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1))))

มันเป็นเรื่องใหญ่ แต่มันก็ง่ายขึ้นนิดหน่อยถ้าคุณขยายออก:

=ArrayFormula(
  JOIN(
    "",
    IF(REGEXMATCH(MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1),"[A-Za-z]"),
      CHAR(
        CODE(UPPER(MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1)))
        +
        MOD(LEN(REGEXREPLACE(LEFT(A1,ROW(OFFSET(A1,0,0,LEN(A1)))),"[^A-Za-z]","")),2)*32
      ),
      MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1)
    )
  )
) 

หลอกลอจิกจะทำงานดังนี้:

For each character {                                    // ArrayFormula()
  If (character is a letter) {                          // REGEXMATCH(MID())
    Return CHAR(                                        // CHAR()
      CODE(UPPER(letter))                               // CODE(UPPER(MID()))
      +
      If (nth letter found and n is odd) {32} else {0}  // MOD(LEN(REGEXREPLACE(LEFT())))
    )
  } else {
    Return character                                    // MID()
  }
}

2

Perl 5 , 24 ไบต์

23 ไบต์ + 1 -pไบต์สำหรับ

ขอบคุณ@Dadaสำหรับ -2 ไบต์

s/\pl/--$|?uc$&:lc$&/eg

ลองออนไลน์!


เรียบร้อย \plแทนที่จะ[a-z]เป็น 2 ไบต์จนถึง :)
Dada

@ ดาด้าฉันไม่รู้จริง ๆ ! ฉันไม่รู้ได้อย่างไรว่า !! ขอขอบคุณ!
Dom Hastings

ฉันคิดว่าฉันเรียนรู้จาก Ton Hospel และฉันใช้ตอนนี้แล้ว (จริง ๆ แล้วฉันมักจะลืมมันบ่อยเกินไปและใช้[a-z]แทน!) หากคุณสงสัยว่ามันมาจากperlrecharclass ;)
Dada


1

C 64 ไบต์

B;R(char *s){for(;*s=isalpha(*s)?(B=!B)?*s|=32:*s&=~32:*s;s++);}

ใช้ประโยชน์จากการเข้ารหัส ascii เมื่อตัวอักษรตัวพิมพ์ใหญ่และเล็กถูกชดเชยด้วย 0x20


คุณไม่ต้องการช่องว่าง '' ระหว่างcharและ*s
cleblanc

มันดูดีมากคล้ายกับของ @ cleblanc คำตอบ
Digital Trauma

ฉันโพสต์ไว้เมื่อโพสต์ของ @ cleblanc ใช้ toUpper () และ toLower ()
230118

1
ความคิดเห็นของฉันแนะนำวิธีนี้คือเวลา 18: 29: 34Z การแก้ไขของ cleblanc เพื่อรวมสิ่งนี้คือเวลา 18: 37: 36Z คำตอบของคุณถูกโพสต์เมื่อ 18: 38: 21Z ดังนั้นฉันคิดว่าคำตอบของ cleblanc น้อยกว่าหนึ่งนาทีก่อนโพสต์ของคุณ คำตอบของคุณคล้ายกับข้อเสนอแนะของฉัน แต่ฉันคิดว่านั่นเป็นลักษณะของรหัสกอล์ฟ - บ่อยครั้งที่การแก้ปัญหาในภาษาเดียวกันจะมาบรรจบกันในสิ่งเดียวกัน - ดังนั้นฉันจะปล่อยให้มันเลื่อน :)
Digital Trauma

1

เรติน่า 32 ไบต์

T`l`L
01T`L`l`[A-Z][^A-Z]*[A-Z]?

ลองออนไลน์!

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

01ในขั้นตอนที่สองแปลคร่าว ๆ ไปที่: ไม่เปลี่ยนพฤติกรรมของขั้นตอนนี้ขึ้นอยู่กับจำนวนการแข่งขัน แต่ใช้การเปลี่ยนแปลงไปยังตัวอักษรตัวแรกของการแข่งขันแต่ละครั้ง






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