การเปลี่ยนแปลงกรณี


27

ใครบ้างที่จะต้องเปรียบเทียบสิ่งต่าง ๆ ในกรณีที่คุณไม่สามารถสร้างการเปลี่ยนแปลงของตัวพิมพ์ใหญ่และตัวพิมพ์เล็กได้ ไม่มีใคร! นั่นคือคำตอบ ไม่มีใครทำ งานของคุณคือการบรรลุผลสำเร็จนี้ สร้างการเรียงสับเปลี่ยนที่เป็นไปได้ทั้งหมดของตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็กสำหรับอินพุตที่กำหนด

อินพุต

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

เอาท์พุต

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

ตัวอย่าง

a1a
['a1a', 'a1A', 'A1a', 'A1A']

abc
['abc', 'abC', 'aBc', 'aBC', 'Abc', 'AbC', 'ABc', 'ABC']

Hi!
['hi!', 'hI!', 'Hi!', 'HI!'] 

เกณฑ์การให้คะแนน

นี่คือดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ

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

ž1a -> ['ž1a', 'ž1A', 'Ž1a', 'Ž1A']

(โปรแกรมของคุณไม่จำเป็นต้องสนับสนุนสิ่งนี้)


10
กรณีทดสอบ Unicode ที่น่าสนใจ: Σ['Σ', 'σ', 'ς']
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

เราสามารถใช้รายการอักขระแทนสตริงได้หรือไม่? ตัวอย่างเช่นถ้าHi!ให้{('H', 'i', '!'), ('h', 'I', '!'), ('h', 'i', '!'), ('H', 'I', '!')}นั่นจะเป็นที่ยอมรับ?
DJMcMayhem

@DrGreenEggsandHamDJ รายการของตัวละครที่ได้รับอนุญาตโดยค่าเริ่มต้น ใน Python สตริงเหล่านี้เป็นสายเดี่ยวแม้ว่าจะแตกต่างกัน
Dennis

1
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ ที่น่าสนใจยิ่งกว่านั้นคือนั่นΣคือตัวพิมพ์ใหญ่ที่จุดเริ่มต้นของคำσคือเวอร์ชันตัวพิมพ์เล็กที่จุดเริ่มต้นหรือตรงกลาง แต่ไม่ใช่จุดสิ้นสุดของคำและςเป็นตัวพิมพ์เล็กในตอนท้ายของคำเท่านั้น
FantaC

1
@DomHastings ในขณะที่คุณมีรายการและคุณเป็นเพียงการเว้นวรรคส่งออกพื้นที่? ดูเหมือนว่าสมเหตุสมผลสำหรับฉัน
Poke

คำตอบ:


11

Pyth, 13 12 11

{msrVQd^U2l

1 ไบต์ต้องขอบคุณ Leaky Nun!

ขอขอบคุณ Jakube อีกหนึ่งไบต์!

ลองที่นี่หรือเรียกใช้ชุดทดสอบ

เราสร้างรายการของรายการค่าจริง / เท็จโดยการใช้ผลิตภัณฑ์คาร์ทีเซียนของรายการ[0, 1]ด้วยตัวเองจำนวนครั้งเท่ากับความยาวของสตริงการป้อนข้อมูล ดังนั้นรายการย่อยแต่ละรายการมีความยาวเท่ากับสตริงป้อนข้อมูล จากนั้นเราใช้rฟังก์ชั่นเป็นการดำเนินการเวกเตอร์กับอินพุตและรายการดังนั้นเราจึงได้รับr letter valueสำหรับแต่ละองค์ประกอบย่อย rด้วยอาร์กิวเมนต์ที่สองศูนย์คือการเป็นตัวพิมพ์เล็กและมีหนึ่งเป็นตัวพิมพ์ใหญ่ สิ่งนี้จะสร้างรายการที่ซ้ำกันที่ไม่ใช่ตัวอักษรซึ่งหมายความว่าเราจำเป็นต้องลบรายการที่ซ้ำออกจากผลลัพธ์



@ LeakyNun Ah ฉันลองแล้ว แต่ด้วยเหตุผลบางอย่างที่ฉันคิดว่าใช้Mกับทั้งคู่sและ.nมีความยาวเท่ากัน ฉันดูเหมือนจะเก่งในการนับ อย่างไรก็ตามแก้ไขทันทีขอบคุณ!
FryAmTheEggman

ใช่พวกเขามีความยาวเท่ากันฉันเพิ่งเปลี่ยนส่วนสุดท้าย
Leaky Nun

{msrVQd^U2lสั้นกว่านี้เล็กน้อย
Jakube

@Jakube ขอบคุณ! การใช้Vเป็นเรื่องลับๆล่อๆฉันไม่คิดว่าฉันจะคิดถึงเรื่องนี้ที่นี่
FryAmTheEggman

8

เยลลี่ 6 ไบต์

żŒsŒpQ

นี่คือลิงก์ monadic (ฟังก์ชัน) ที่คาดว่าสตริงเป็นอาร์กิวเมนต์ด้านซ้ายและส่งคืนรายการสตริง

จัดการอักขระที่ไม่ใช่ ASCII ลองออนไลน์!

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

żŒsŒpQ  Monadic link. Argument: s (string)

 Œs     Swapcase; change the case of all letters in s.
ż       Zipwith; pair each character with itself with changed case.
   Œp   Take the Cartesian product of all pairs.
     Q  Unique; deduplicate the Cartesian product.

3
รับ rekt ภาษาอื่น ๆ : p
Adnan

2
แม้หลังจากดูหน้ารหัสแล้วความจริงที่ว่าฉันเห็น Jelly อย่างสม่ำเสมอด้วยจำนวนไบต์ต่ำสุดในการแข่งขันกอล์ฟรหัสทำให้ฉันประหลาดใจ
Poke

5

Python ขนาด74 71 ไบต์

f=lambda s:s and{r[0]+t for r in{s,s.swapcase()}for t in f(s[1:])}or{s}

จัดการอักขระที่ไม่ใช่ ASCII ทดสอบบนIdeone


5

Oracle SQL 11.2, 276 ไบต์

WITH v AS(SELECT SUBSTR(:1,LEVEL,1)c,ROWNUM p FROM DUAL CONNECT BY LEVEL<=LENGTH(:1))SELECT w FROM(SELECT REPLACE(SYS_CONNECT_BY_PATH(c,','),',','')w FROM(SELECT UPPER(c)c,p FROM v UNION SELECT LOWER(c),p FROM v)START WITH p=1CONNECT BY PRIOR p=p-1)WHERE LENGTH(:1)=LENGTH(w);

ยกเลิกแข็งแรงเล่นกอล์ฟ

WITH v AS
( -- Split input into an array of characters 
  SELECT SUBSTR(:1,LEVEL,1)c,ROWNUM p FROM DUAL CONNECT BY LEVEL<=LENGTH(:1)
)
SELECT w 
FROM   ( -- Build every string combination
         SELECT REPLACE(SYS_CONNECT_BY_PATH(c,','),',','')w 
         FROM   ( -- Merge upper and lower arrays, keep same position for each character, it allows to mix cases
                  SELECT UPPER(c)c,p FROM v UNION SELECT LOWER(c),p FROM v
                )
         START WITH p=1          -- Start with first character (either lowercase or uppercase)
         CONNECT BY PRIOR p=p-1  -- Add the next character (either lowercase or uppercase)
       )
WHERE LENGTH(:1)=LENGTH(w); -- Keep only full strings

น่าเกลียดเหมือนนรกต้องเล่นกอล์ฟได้มากกว่า


4

05AB1E, 17 ไบต์

รหัส:

vyDš‚N0Êiâvy˜J})Ù

อธิบาย:

vy                     # for each character in input
  Dš‚                  # create a pair of different case, eg: ['ž', 'Ž']
     N0Êiâ             # for all pairs but the first, take cartesian product
                         result will be a list of layered lists eg: [['ž', '1'], 'a'] 
            vy         # for each such list
              ˜J}      # deep flatten and join as a string eg: ž1a
                 )Ù    # wrap in array and remove duplicates

ลองออนไลน์


4

Brachylogขนาด25 22 ไบต์

:ef:1fd.
:2ac.
@u.|@l.

มันทำงานได้ดีเช่นเดียวกับตัวพิมพ์เล็ก / ตัวพิมพ์ใหญ่ของ Prolog ดังนั้นมันจึงใช้ได้กับตัวอักษรที่ไม่ใช่ ASCII ด้วย:

?- run("ž1a",Z).
Z = ["Ž1A", "Ž1a", "ž1A", "ž1a"] .

คำอธิบาย

ซึ่งแตกต่างจากคำตอบอื่น ๆ ทั้งหมดในขณะที่ฉันโพสต์สิ่งนี้ไม่ได้ใช้แนวทางผลิตภัณฑ์คาร์ทีเซียนเลย

  • ภาคแสดงหลัก

    :ef       Split the Input string into a list of 1-char strings
       :1f    Find all valid outputs of predicate 1 with the previous list
              of outputs as input
          d.  Unify the Output with that list excluding all duplicates
    
  • คำกริยา 1

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

    :2a       Apply predicate 2 on the each element of the Input
       c.     Unify the Output with the concatenation of the elements of
              the previous list
  • คำกริยา 2

ใช้เพื่อเปลี่ยนอักขระของสตริงให้เป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก

    @u.       Unify the Output with the uppercase version of the Input
       |      Or
        @l.   Unify the Output with the lowercase version of the input


3

MATL , 13 ไบต์

tYov!Z}N$Z*Xu

ลองออนไลน์!

คำอธิบาย

t       % Implicit input string. Duplicate
Yo      % Change case of string
v       % Concatenate as a 2xN char array, where N is input length
!       % Transpose: Nx2 char array. Each row has different case, if letter
Z}      % Split into rows: gives N strings of 2 chars. Each char has different 
        % case if it's a letter, or is repeated otherwise
N$      % Specify N inputs for next function
Z*      % Cartesian product of the N strings. Each combination is a row.
        % Repeated chars (i.e. non-letters) give rise to duplicate rows.
Xu      % Remove duplicate rows. Implicit display

3

JavaScript (Firefox 30-57), 92 90 ไบต์

f=([c,...s])=>c?[for(t of f(s))for(d of new Set(c.toUpperCase()+c.toLowerCase()))d+t]:['']

แก้ไข: บันทึก 2 ไบต์เพราะnew Setจะดึงอักขระที่ไม่ซ้ำกันออกจากสตริงอย่างมีความสุข


เมื่อ!c sใด[]คุณจึงสามารถกลับมา[s]แทนได้
l4m2

f=([c,...s])=>c?[for(t of f(s))for(d of new Set(c.toUpperCase()+c.toLowerCase()))d+t]:[s]
l4m2

3

Perl 6 , 37 ไบต์

{[X~] '',|.comb.map:{unique .lc,.uc}}

ลองมัน

คำอธิบาย:

{
  [X[~]]                     # cross combine using &infix:<~> operator
    '',                      # empty string so that 1 character strings work
    |                        # flatten the following into outer list
      .comb                  # get every character from input string
      .map:                  # and map it with:
        { unique .lc, .uc }
}

ทดสอบ:

#! /usr/bin/env perl6

use v6.c;
use Test;

my &case-permutation = {[X~] '',|.comb.map: {unique .lc,.uc}}

my @tests = (
  'a1a' => <a1a a1A A1a A1A>,
  'abc' => <abc abC aBc aBC Abc AbC ABc ABC>,
  'Hi!' => <hi! hI! Hi! HI!>,
  'ž1a' => 1a ž1A Ž1a Ž1A>,
);

plan +@tests;

for @tests -> $_ (:key($input),:value($expected)) {
  is case-permutation($input).sort, $expected.sort, .gist
}
1..4
ok 1 - a1a => (a1a a1A A1a A1A)
ok 2 - abc => (abc abC aBc aBC Abc AbC ABc ABC)
ok 3 - Hi! => (hi! hI! Hi! HI!)
ok 4 - ž1a => (ž1a ž1A Ž1a Ž1A)

คุณสามารถบันทึกไบต์ผมคิดว่า: {[X~] '',|.comb.map:{unique .lc,.uc}}(พื้นที่ลบหลังmap:)
Conor โอไบรอัน


2

Python ขนาด 69 ไบต์

import itertools as i;f=lambda s:set(i.product(*zip(s,s.swapcase())))

ที่ส่งคืน tuples ของสตริง singleton แทนที่จะเป็นสตริง ฉันไม่แน่ใจว่าได้รับอนุญาตหรือไม่
Dennis

บันทึก 1 ไบต์โดยใช้from itertools import*;และละเว้นi.
ผู้บัญชาการไบต์

OP ได้กล่าวว่าไม่อนุญาตให้ใช้สตริงเดี่ยว คุณควรอัพเดตคำตอบนี้
DJMcMayhem

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

2

ที่จริงแล้ว 28 ไบต์

;╗l2r∙`"'Ö*£"£M╜@Z"iƒ"£MΣ`M╔

ลองออนไลน์!

โปรแกรมนี้สามารถจัดการกับตัวละครที่ไม่ใช่ ASCII ด้วยความมหัศจรรย์ของ Python 3

คำอธิบาย:

;╗l2r∙`"'Ö*£"£M╜@Z"iƒ"£MΣ`M╔
;╗                            save a copy of input to reg0
  l                           length of input
   2r                         [0,1]
     ∙                        Cartesian product with self (length of input) times
      `                  `M   map:
       "'Ö*£"£M                 push `Ö` (swapcase) if 1 else `` for each value in list
               ╜@Z              zip with input
                  "iƒ"£M        swap the case of those values
                        Σ       join string
                           ╔  unique elements

2

C 229 252 ไบต์

i,n,j,k,l;f(char *s){l=strlen(s);for(i=0;i<l;i++)s[i]=tolower(s[i]);int v[l];for(i=0;i<l;i++)v[i]=0;for(i=0;i<pow(2,l);i++){n=i,k=0;for(;n;k++){v[k]=n;n/=2;}for(j=0;j<l;j++){v[j]%=2;if(v[j])s[j]=toupper(s[j]);else s[j]=tolower(s[j]);}printf("%s ",s);}}

เวอร์ชันที่ไม่ถูกปรับแต่ง:

void f(char *s)
{
  int i,num,k,l=strlen(s);
  for(i=0;i<l;i++)
     s[i]=tolower(s[i]);

   int v[l];
   for(i=0;i<l;i++) 
     v[i]=0;   

   for(i=0;i<pow(2,l);i++)
   {
      num=i,k=0;
      for(;num;k++)
      {
         v[k]=num;
         num/=2;        
      } 

      for(int j=0;j<l;j++)
      {
        v[j]%=2;

        if(v[j])
         s[j]=toupper(s[j]);
        else
         s[j]=tolower(s[j]);

      }
      printf("%s \n",s);       

   } 
}

คำอธิบาย:

  • ยอมรับสตริงอักขระแปลงสตริงเป็นตัวพิมพ์เล็ก
  • ประกาศอาร์เรย์จำนวนเต็มที่มีความยาวเท่ากับสตริง เติมด้วยเลขศูนย์
  • เก็บตัวเลขตั้งแต่ 0 ถึง2^strlen(s)ในรูปแบบไบนารีในintอาร์เรย์ (สำหรับสตริง 3 ไบต์: 000,001,010 ... 111)
  • ขึ้นอยู่กับว่าบิตที่ตำแหน่งถูกตั้งค่าหรือสลับกรณี
  • เอาต์พุตสตริงสำหรับชุดค่าผสมที่เป็นไปได้ทั้งหมด

ลองออนไลน์!


ตอนแรกที่ฉันทำสิ่งนี้ใน vb6 เช่นเมื่อ 10 ปีก่อนฉันเชื่อว่าวิธีแก้ปัญหาของฉันคล้ายกับอันนี้ คุณนำความทรงจำกลับมา;)
Poke

@ Poke ดีใจที่ฉันทำได้! :)
Abel Tom

บางสิ่งที่ต้องตีกอล์ฟ: ถอดi++ในห่วงสำหรับออกและใช้++โดยตรงรวมทั้งวางชิ้นส่วนบางส่วนใน for-loop เพื่อลบวงเล็บและคอลัมน์กึ่งที่เป็นไปได้ นอกจากนี้คุณสามารถลบช่องว่างในพารามิเตอร์และใช้การมอบหมายแบบสามส่วนถ้าสิ้นสุด รวม: i,n,j,k,l;f(char*s){l=strlen(s);for(i=0;i<l;)s[i]=tolower(s[i++]);int v[l];for(i=0;i<l;)v[i++]=0;for(i=0;i<pow(2,l);){for(n=i++,k=0;n;n/=2)v[k++]=n;for(j=0;j<l;j++){v[j]%=2;s[j]=v[j]>0?toupper(s[j]):tolower(s[j]);}printf("%s ",s);}}( -20 bytes / 232 bytes )
Kevin Cruijssen

1

ฮุน 242 ไบต์

|=
t/tape
=+
l=(reap (pow 2 (lent t)) t)
%+
roll
(gulf 0 (dec (lent l)))
|=
{a/@ b/(set tape)}
=+
%+
turn
(gulf 0 (dec (lent t)))
|=
n/@
=+
t=(snag n t)
=+
k=(trip t)
?:
=(0 (cut 0 n^1 a))
?:
=((cuss k) t)
(cass k)
(cuss k)
t
(~(put in b) -)

Ungolfed:

|=  t/tape
=+  l=(reap (pow 2 (lent t)) t)
%+  roll  (gulf 0 (dec (lent l)))
|=  {a/@ b/(set tape)}
    =+  %+  turn  (gulf 0 (dec (lent t)))
      |=  n/@
      =+  t=(snag n t)
      =+  k=(trip t)
      ?:  =(0 (cut 0 n^1 a))
        ?:  =((cuss k) t)
              (cass k)
        (cuss k)
      t
    (~(put in b) -)

ฉันไม่แน่ใจว่าจะมีขนาดเล็กลงเท่าไร

ครั้งแรกที่เราตั้งค่าlเท่ากับรายการกับ 2 ^ (ความยาว t) tซ้ำของ Hoon ไม่มีfacฟังก์ชั่นใน stdlib แต่ 2 ^ n นั้นใหญ่กว่า n! ดังนั้นเราก็แมปไปยังรายการที่ใหญ่กว่าและใช้set (hashmap) เพื่อแยกรายการที่ซ้ำกัน

จากนั้นเราจะพับรายการ [0 .. (ความยาว L)] (set tape)สะสมเป็น เราต้องทำสิ่งนี้แทนการทำแผนที่lโดยตรงเพราะเราจำเป็นต้องรู้ว่าการทำซ้ำหมายเลขนั้นคืออะไร ( a) แต่ไม่สามารถเพิ่มการสะสมได้เพียงเพราะ Hoon เป็นภาษาบริสุทธิ์

เราจับคู่กับ [0 .. (ความยาว t)] (อีกครั้งดังนั้นเราจึงมีดัชนีปัจจุบัน) ตั้งค่าtอักขระที่ n ในสตริงตรวจสอบว่าลาก่อนของ nth aและ inverting กรณี (cuss หรือ cass ขึ้นอยู่กับว่ามันเปลี่ยนแปลง หรือไม่). tapeประเภทการกลับมาของแผนที่นี้เป็น

จากนั้นเราใส่สตริงลงใน hashmap ของเราและคืนค่า hashmap ของสตริงทั้งหมด


"2 ^ n นั้นใหญ่กว่า n!" ที่จริงn! > 2^nให้ว่าเป็นอย่างน้อยn 4(พิสูจน์ด้วยการเหนี่ยวนำพร้อมตัวพิมพ์n=4ใหญ่) en.wikipedia.org/wiki/…
mathmandan

1

C, 216 ไบต์

k,i,j,p,n,m;z(char *c){n=-1;m=0;while(c[++n])if(c[n]>64&c[n]<90)c[n]+=32;else if(c[n]<'a'|c[n]>'z')m++;k=1<<(n-m);for(j=0;j<k;j++){for(i=0;i<n;i++){p=1<<i;putc((j&p)==p?toupper(c[i]):c[i],stdout);}putc(0xa,stdout);}}

นี่คือวิธีการที่แตกต่างกันที่เดียวกันวิธีการเป็นคำตอบที่ C อื่น ๆ

ฉันควรจะลบและวางไว้ใต้คำตอบอื่น ๆ เป็นความคิดเห็น?

ฉันขออธิบายด้วยรุ่น Ungolfed

k,i,j,p,n,m;
z(char * c) {
    int n=-1;       // We start at -1 because of forward incrementation
    int m=0;        // this will count the characters we don't have to manipulate
    while(c[++n])   // go until we reach '\0'
    {
        if(c[n]>='a'&c[n]<='z')c[n]-=32; // If we are lower case, then convert
        else if(c[n]<'A'|c[n]>'Z')m++;   // If we are neigther lower case
                                         // nor upper, then make a note
    }

    // get 2 ^ ("length" - "number of invonvertibles")
    k=1<<(n-m); 
    for(j=0;j<k;j++) {      // go through the combinations
        for(i=0;i<n;i++) {  // for each combination go though the characters
            p=1<<i;         // for each character get it's bit position
            putc(
                // if the bit position is set (==1) 
                (j&p)==p ?
                   tolower(c[i]) // convert
                   : c[i], // else: don't
                stdout);
        }
        putc(0xa, stdout);  // print a newline
    }
}

1

Python3, 96 ไบต์

i=input().lower()
for l in{*__import__('itertools').product(*zip(i,i.upper()))}:print(*l,sep='')

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


@DLosc ขอบคุณสำหรับเคล็ดลับ! ฉันจะเพิ่มคุณสมบัติเหล่านั้น :)
บล็อก

ขอบคุณสำหรับเคล็ดลับ มันช่วยได้จริงๆ แม้ว่าฉันจะใช้ {} แทนที่จะเป็น set () การวนซ้ำก็ต้องผ่านชุดแทนที่จะเป็นผลิตภัณฑ์ (ฉันหวังว่ามันจะสมเหตุสมผล) อย่างน้อยในการปรับใช้ของฉัน (ฉันใช้ QPython บน Android) {} ​​เพียงวางรายการไว้ในชุดแทนที่จะแปลงรายการเป็นชุด
บล็อก

ฉันได้ลองทั้งสองวิธีแล้วและการทำ {* expr} ทำให้ฉันมีไวยากรณ์
บล็อก

Ahhhh นั่นเป็นเหตุผล รุ่นล่าสุดของ QPython อยู่ที่ 3.3 หรืออะไรบางอย่าง
บล็อก

ไปเลย: ลองออนไลน์! (แก้ไขข้อผิดพลาดและเล่นกอล์ฟเป็นพื้นที่ด้วย)
DLosc



1

Tcl, 165 181ไบต์

set n -1
while {[incr n]<1<<[llength [set s [split $argv {}]]]} {puts [join [lmap c $s b [split [format %0[llength $s]b $n] {}] {string to[expr $b?{u}:{l}] $c}] ""]}

การปรับปรุงขอบคุณที่sergiol คำตอบก่อนหน้า:

set s [split $argv {}]
set n -1
while {[incr n]<1<<[llength $s]} {set r ""
foreach c $s b [split [format %0[llength $s]b $n] {}] {set r $r[string [expr $b?{tou}:{tol}] $c]}
puts $r}

ใช้เลขฐานสองเพื่อเลือกระหว่างตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็กเมื่อสร้างข้อความเอาต์พุต



@ sergiol นั้นแตกต่างจากของฉันที่คุณควรโพสต์มันเป็นคำตอบของคุณเองและได้รับเครดิตที่ดีสำหรับความยอดเยี่ยม
Dúthomhas

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


1

ทูตขนาด 39 ไบต์

&Cross[Sum@V]##Unique@V#SwapCase=>Chars

ลองออนไลน์!

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


0

JavaScript (ES6), 103

จัดการอักขระที่ไม่ใช่ ASCII

(a,r=new Set)=>a?f(a.slice(1)).map(v=>(C=o=>r.add(a[0][`to${o}erCase`]()+v),C`Upp`,C`Low`))&&[...r]:[a]

ทดสอบ

f=(a,r=new Set)=>a?f(a.slice(1)).map(v=>(C=o=>r.add(a[0][`to${o}erCase`]()+v),C`Upp`,C`Low`))&&[...r]:[a]

function test() { O.textContent = f(I.value).join('\n') }

test()
<input id=I oninput='test()' value='ž1a'>
<pre id=O></pre>

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