สนุกมากขึ้นด้วยสตริงตัวพิมพ์ใหญ่ - เล็ก


28

ได้รับแรงบันดาลใจจากการท้าทายนี้ (หรือเฉพาะเจาะจงมากขึ้นโดยการเข้าใจผิด) ฉันได้พบกับความท้าทายต่อไปนี้

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

สวัสดีชาวโลก!

โปรดทราบว่าตัวพิมพ์ใหญ่W(ตัวอักษรตัวพิมพ์ใหญ่ตัวแรก) ถูกแทนที่ด้วยH(ตัวสุดท้าย) ตัวอักษรตัวพิมพ์เล็ก: 'd' (ตัวแรก) เปลี่ยนเป็นe(ตัวสุดท้าย), l(วินาที) จะถูกแทนที่ด้วยl(สุดยอดปากกา) ... ตัวอักษรที่ไม่ใช่ตัวอักษรทั้งหมดจะถูกวางไว้

อินพุต

  • อินพุตเป็นสตริงที่มีอักขระ ASCII เท่านั้นในช่วง 32-126
  • การป้อนข้อมูลรับประกันว่ามีความยาวอย่างน้อย 1 ตัวอักษรและจะไม่เกินขีด จำกัด ของภาษาของคุณ

เอาท์พุต

  • สตริงเดียวกันนั้นโดยมีการสลับอักขระตามที่อธิบายไว้

กฎเพิ่มเติม

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

กรณีทดสอบ

A
A

Ok
Ok

OK
KO

Hello, World!
Wdlro, Holle!

0123456789
0123456789

The quick brown Fox jumps over the lazy doge
Feg odyza lehtr Tev ospmu jxon wor bkci uqeh

odd
ddo

racecar
racecar

EtOn Em OsN R AaToNsIsIhT!!1!
ThIs Is NoT A RaNsOmEnOtE!!1!

คุณอาจต้องการรวม testcase แบบ 2 ถ่านโซลูชันดั้งเดิมของฉันล้มเหลวในตอนแรก (แก้ไขโดยไม่มีค่าใช้จ่ายโดยเปลี่ยน.+เป็น.*)
ผลิตภัณฑ์ ETH

"lazy doge" ทำให้ฉันนึกถึงสิ่งนี้: youtube.com/watch?v=W-d6uUSY9hk
FinW

คำตอบ:


5

MATL , 14 ไบต์

2:"t@Y2myy)Pw(

ลองใช้ที่ MATL Online

คำอธิบาย

        % Impicitly grab input as a string
2:      % Push the array [1, 2] to the stack
"       % For each value in this array
  t     % Duplicate the top element of the stack (S)
  @     % Get the current loop index
  Y2    % Load the predefined literal 1Y2 ('ABC...Z') on the first loop
        % and the predefined literal 2Y2 ('abc...z') on the second loop (M)
  m     % Create a logical array the length of S that is TRUE when a character is in the
        % array M and FALSE otherwise (B)
  yy    % Make a copy of both S and B
  )     % Grab just the letters of S that were in M using B as an index
  P     % Reverse this array
  w     % Flip the top two stack elements
  (     % Assign them back into the string
        % Implicit end of for loop and implicit display

1
เยี่ยมมาก! ฉันมี2:"tttXk>f)5MP(Yoขนาด 17 ไบต์
หลุยส์เมนโด

11

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

Retina ไม่มีวิธีโดยตรงในการย้อนกลับสตริง แต่เราสามารถทำได้โดยใช้ประโยชน์จากขั้นตอนการเรียงลำดับ:

O^#`[a-z]
O^#`[A-Z]

เรียงลำดับ ( O) อ่านค่าเป็นตัวเลข ( #) จากนั้นสลับลำดับ ( ^) ของสตริงทั้งหมดที่ตรงกับ regex ที่กำหนด (ตัวอักษรตัวพิมพ์เล็กสำหรับบรรทัดแรกและตัวอักษรตัวพิมพ์ใหญ่สำหรับวินาที)

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

ลองออนไลน์!


10

Perl , 45 ไบต์

44 รหัสไบต์ + -pธง

for$c(u,l){@T=/\p{L$c}/g;s/\p{L$c}/pop@T/ge}

ลองออนไลน์!

คลาสอักขระ Unicode \p{Lu}และการ\p{Ll}จับคู่ตามลำดับตัวอักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก
ดังนั้น/\p{L$c}/จะส่งคืนรายการของตัวอักษรตัวพิมพ์ใหญ่ทั้งหมด (หรือด้านล่าง) (และเก็บไว้ข้างใน@T)
แล้ว regex สามารถs/\p{$c}/pop@T/geจะเข้ามาแทนที่แต่ละ (บนแล้วกรณีที่ต่ำกว่า) ตัวอักษรโดยตัวอักษรตัวสุดท้ายของในขณะที่ลบออกจาก@T@T


7

JavaScript (ES6), 74 73 71 70 ไบต์

f=
s=>(g=r=>s=s.replace(r,_=>a.pop(),a=s.match(r)))(/[A-Z]/g,g(/[a-z]/g))
<input oninput=o.textContent=f(this.value)><pre id=o>

แก้ไข: บันทึก 1 ไบต์ขอบคุณ @Arnauld


4
ฉันรู้ว่ามีวิธีที่ดีกว่า ...
ETHproductions

5

JavaScript (ES6), 92 ไบต์

s=>(F=(r,s)=>s.replace(r,([x],a,y)=>y+F(r,a)+x))(/[a-z](.*)([a-z])/,F(/[A-Z](.*)([A-Z])/,s))

มีได้จะเป็นวิธีการที่จะใช้ประโยชน์จากความคล้ายคลึงกันระหว่าง regexes ฯ ...

ตัวอย่างการทดสอบ


นี่ถือว่าสมมติว่าฟังก์ชันถูกกำหนดให้กับตัวแปรที่เรียกว่าfหรือไม่? ไม่ควรนับจำนวนไบต์?
steenbergh

@steenbergh ฟังก์ชั่นไม่ระบุชื่อก็สามารถเรียกได้ว่าสิ่งที่คุณต้องการให้เป็น
Kritixi Lithos

1
@steenbergh Nope เป็นฟังก์ชันที่ไม่ระบุตัวตนซึ่งสร้างฟังก์ชันอื่นFแล้วเรียกมันซ้ำสองครั้ง ฟังก์ชั่นด้านนอกไม่ได้เรียกตัวเองว่า ณ จุดใด
ETHproductions

ทำไมคุณต้องใช้วงเล็บ.*ใน regexes?
ลุค

@Luke เพื่อจับภาพตัวละครเหล่านั้น ( aใน([x],a,y)=>)
ETHproductions

4

Perl 6 , 75 69 bytes

{my @a=.comb;@(grep $_,@a).&{@$_=[R,] $_} for /<:Lu>/,/<:Ll>/;[~] @a}

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

  1. my @a=.comb;
    แยกสตริงออกเป็นอักขระและเก็บไว้ในอาร์เรย์

  2. for /<:Lu>/,/<:Ll>/
    สำหรับ regexes สองตัวที่ตรงกับตัวอักษรพิมพ์ใหญ่และตัวพิมพ์เล็กตามลำดับ ...

    • @(grep $_,@a)
      รับส่วนของรายการอาร์เรย์ทั้งหมดที่ตรงกับ regex

    • .&{@$_=[R,] $_}
      กำหนดด้านหลังของชิ้นให้กับตัวเอง

  3. [~] @a
    เชื่อมต่ออาร์เรย์ที่ถูกดัดแปลงเพื่อสร้างสตริงอีกครั้งและส่งคืน


-6 ไบต์โดยการขโมยความคิดในการใช้คลาส Unicode แทนช่วงอักขระจากโซลูชันของ @ Dada


3

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

nŒlT,Ṛ$yJịŒsµ⁺

ลองออนไลน์!

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

nŒlT,Ṛ$yJịŒsµ⁺  Main link. Argument: s (string)

 Œl             Convert to lowercase.
n               Test for inequality.
   T            Truth; yield all indices of 1's.
    ,Ṛ$         Pair with its reverse. Yields [A, B] (pair of lists).
        J       Indices; yield I := [1, ..., len(s)].
       y        Translate; replace the integers of I that occur in A with the
                corresponding integers in B.
          Œs    Swapcase; yield s with swapped case.
         ị      Use the translated index list to index into s with swapped case.
            µ   Combine all links to the left into a chain.
             ⁺   Duplicate the chain, executing it twice.

ไม่ควรเป็น nitpicky แต่ .. 14 ตัวอักษร! = 23 bytes :) mothereff.in/byte-counter
Gizmo

@Gizmo Jelly ใช้เพจรหัส ดูโพสต์เมตานี้สำหรับข้อมูลเพิ่มเติม
Suever

@Suever โอ้เรียบร้อยแล้วเรียนรู้บางสิ่งบางอย่างในวันนี้ ^. ^
Gizmo

3

ยูทิลิตีBash + Unix, 122 121 ไบต์

f()(p=[^$1*
v="\)\([$1\)\("
for((n=99;n;n--)){
q="$q;s/^\($p$v.*$v$p\)$/\1\4\3\2\5/"
p=[^$1*[$1$p
}
sed $q)
f a-z]|f A-Z]

ลองออนไลน์!

ไม่สั้นมากจริงๆ บางทีใครบางคนสามารถเล่นกอล์ฟต่อไปได้

อินพุตบน stdin, เอาต์พุตบน stdout

สิ่งนี้จะทำงานได้อย่างถูกต้องในอินพุตที่น้อยกว่า 200 อักขระ

(อันที่จริงมันจัดการสตริงอย่างถูกต้องด้วยตัวอักษรตัวพิมพ์เล็กน้อยกว่า 200 ตัวและตัวพิมพ์เล็กตัวน้อยกว่า 200 ตัว)

หากคุณเพิ่ม 99 ในรหัสเป็น 102 (ที่ราคาหนึ่งไบต์เพิ่มเติม) มันจะจัดการกับสายอักขระสูงสุด 205 ตัว

อย่างไรก็ตามคุณไม่สามารถเพิ่ม 99 ในรหัสเกิน 102 เพราะคุณจะเกินความยาวอาร์กิวเมนต์สูงสุดของ sed

นี่คือรุ่นที่ไม่มีข้อ จำกัด ขนาดอินพุตเฉพาะ แต่การนับมีความยาวเล็กน้อย 137 ไบต์ (เวอร์ชันที่ยาวกว่านี้เขียนลงในไฟล์เสริมชื่อ t.)

f()(p=[^$1*
v="\)\([$1\)\("
for((n=`wc -c<t`;n;n--)){
sed -i "s/^\($p$v.*$v$p\)$/\1\4\3\2\5/" t
p=[^$1*[$1$p
})
cat>t
f a-z]
f A-Z]
cat t

ทดสอบการทำงาน:

for x in A Ok OK 'Hello, World!' 0123456789 'The quick brown Fox jumps over the lazy doge' odd racecar 'EtOn Em OsN R AaToNsIsIhT!!1!'
  do
    echo "$x"
    ./swapping3 <<<"$x"
    echo
  done

A
A

Ok
Ok

OK
KO

Hello, World!
Wdlro, Holle!

0123456789
0123456789

The quick brown Fox jumps over the lazy doge
Feg odyza lehtr Tev ospmu jxon wor bkci uqeh

odd
ddo

racecar
racecar

EtOn Em OsN R AaToNsIsIhT!!1!
ThIs Is NoT A RaNsOmEnOtE!!1!

น่าสนใจว่ามันล้มเหลวใน TIO ☹อาจขึ้นอยู่กับsedการติดตั้งใช้งานในระบบของคุณ แต่สำหรับ GNU sedคุณสามารถเพิ่ม-rตัวเลือกและลบการยกเว้น\ของวงเล็บทั้งหมด
จัดการ

2

Python 2 , 115 ไบต์

s=input();u=str.isupper
exec"r='';i=0\nfor c in s:r+=c[u(c):]or filter(u,s)[~i];i+=u(c)\ns=r.swapcase();"*2
print s

ลองออนไลน์!


คุณสามารถแทนที่ \ n ด้วย;
ทิม

น่าเสียดายที่ไม่มี อาร์กิวเมนต์ของexecถูกวิเคราะห์คำเป็นรหัส Python ปกติดังนั้น for for loop จะต้องอยู่ในบรรทัดของตัวเอง
เดนนิส

2

Java (OpenJDK 8) , 271 ไบต์

s->new String(new Error(){char[]o=s.toCharArray();char c;int b;{while(b++<2)for(int l=0,r=o.length;l<r;l++){for(--r;r>l&&f(r);r--);for(;l<r&&f(l);l++);if(l<r){o[l]=o[r];o[r]=c;}}}boolean f(int i){c=o[i];return b>1?!Character.isUpperCase(c):!Character.isLowerCase(c);}}.o)

ลองออนไลน์!


คุณสามารถบันทึกไบต์ได้ด้วยการทำให้เป็นแลมบ์ดา s->new String...
ไม่เป็นเชิงเส้น

1
@NonlinearFruit ขอขอบคุณ! 294 -> 272 เช่นกันแก้ไขข้อผิดพลาดเมื่อ r l ถูกนำมาใช้ใหม่โดยไม่ต้องเตรียมใช้งาน
DmitrySamoylenko

ยินดีต้อนรับสู่ PPCG! บางสิ่งที่คุณยังสามารถเล่นกอล์ฟ: char[]o=s.toCharArray();char c;int b;ถึงchar o[]=s.toCharArray(),c,b;; และทั้ง&&ที่&'; และc=o[i];return b>1?!Character.isUpperCase(c):!Character.isLowerCase(c);ถึงc=o[i];Character x=c;return b>1?!x.isUpperCase(c):!x.isLowerCase(c);( 259 ไบต์รวม ) และฉันอาจพลาดบางสิ่งบางอย่างในการเล่นกอล์ฟมากขึ้น นอกจากนี้หากคุณยังไม่เคยเห็นคำแนะนำในการเล่นกอล์ฟใน Javaอาจน่าสนใจ
Kevin Cruijssen

1

R , 107 ไบต์

u=utf8ToInt(scan(,''));for(i in c(65,97)){l=which(u%in%i:(i+25));u[l]=u[rev(l)]};cat(intToUtf8(u,T),sep="")

ดัดแปลงมาจากการตอบสนองต่อความท้าทายที่เชื่อมโยง มันง่ายกว่าการแลกเปลี่ยนคู่ ฉันสงสัยว่าฉันจะได้ย่อย 100 กับสนามกอล์ฟ ...

ลองออนไลน์!

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