Yinelenen ve durum değiştir


34

Amaç, girdi olarak bir dize almış olmak, her latin harfini çoğaltmak ve "büyük harf küçük harf olur ya da tam tersi olur".

Örnek girişler ve çıkışlar:

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|@!

Giriş, yazdırılabilir ASCII sembollerinden oluşur.

Latince olmayan harfleri, sayıları, özel karakterleri çoğaltmamalısınız.


17
Bu çok hoş, basit ama önemsiz bir meydan okumadır.
Mego

Yanıtlar:


10

Jöle, 5 bayt

żŒsQ€

Çevrimiçi deneyin!

Nasıl çalışır

żŒsQ€  Main link. Argument: s (string)

 Œs    Yield s with swapped case.
ż      Zip s with the result.
   Q€  Unique each; deduplicate each pair of characters.

17

Python, 56 54 bayt

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

İdeone üzerinde test et .


Dang! Out beni 4 byte golf attı ...
R. Kap 20

Bu harf olmayan karakterleri nasıl korur? Boş dizeler olarak ortaya çıkacaklarını düşünüyorum.
atlasolog

@atlasolog Ideone'da gördüğünüz gibi, yoklar. *daha yüksek önceliğe sahip +, bu yüzden sadece cdeğiştirilmiş durumda ile etkiler .
Dennis,

Ohh, tamam, öyle düşünmedim. Güzel.
atlasolog

16

JavaScript ES6, 70 68 66 64 bayt

@Kevin Lau sayesinde 2 bayt kaydedildi - Kenny değil

@ Cᴏɴᴏʀ O'Bʀɪᴇɴ sayesinde 2 bayt kaydedildi

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

açıklama

Bu gerçekten bir hack kullanır:

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

hangi ungolfed olduğunu:

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

Temel l < "a"olarak, harfin kod noktasının kod noktasından küçük olup olmadığını kontrol eder a(bu nedenle büyük harf olur). Eğer öyleyse, to + Low + erCasekazanılan l['toLowerCase']()ve karakteri küçük harfe çevirir . `tırnak, dize biçimlendirmesine izin verir;

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

as: "to" + (l<"a" ? "Low" : "Upp") + "erCase"çağrılacak işlevi oluşturan (dizgeyi büyük veya küçük harf yapar). Bunu köşeli parantez içine koyarız ki bu [ ... ]ismini bir dize olarak verilen bir özelliğe erişmemize izin verir. Bu uygun işlevi döndürür ve biz sadece onu çağırırız.


3
/[A-Z]/gidaha kısa bir regex: 3
Value Ink

@ KevinLau-notKenny oh güzel yakalamak, teşekkürler!
Downgoat

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

@ CᴏɴᴏʀO'Bʀɪᴇɴ oh güzel, teşekkürler!
Downgoat

4
l[`to${l<"a"?"Low":"Upp"}erCase`]()Sanırım yeni bir kötülük tanımımız var.
gcampbell

10

Ruby, 37 33 (30 + -pflag) bayt

swapcasekurtarmak için! Sırala. @Lynn'den -4 bayt.

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

gsub(/[a-z]/i){$&+$&.swapcase}ayrıca pbayrak 31 bayttır.
Lynn,

1
@Lynn Konsensüsün varsayılan komut dosyasından gerekli olan farkı değiştirdiğine inanıyorum, bu nedenle pbayrak (space)-paka 3 bayt.
Value Ink,

8

C, 6360 bayt

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

Bu gerçeği kullanır 'a' XOR 32 == 'A', vb.

FryAmTheEggman sayesinde üç bayt kaydedildi.


s++Sonunda putchar( &&putchar(32^*s++)) bir bayt
Giacomo Garabello

Sana yerini alabilir mi &&ile* bunu yapamazsınız?
aloisdg diyor Reinstate Monica

1
Her ikisinin de işe yaramadığından eminim, &&kısa devre davranışının nasıl çalıştığını düşünürsem .
Lynn,

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

1
f(char*s){*s&&f(1+s,isalpha(putchar(*s))&&putchar(32^*s));}özyinelemeli?
24m2

6

CJam, 11 bayt

l_el_eu.+.|

Burada test et.

açıklama

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

Pyth , 7 bayt

sm{+dr2

Test paketi .

sm{+dr2    input: Q
sm{+dr2dQ  implicit arguments

        Q  input
 m         for each character as d:
     r2d       swapcase
   +d          prepend d
  {            deduplicate
s          join as string

Haha, bu gerçekten hızlı: D
nicael


5

Haskell, 73 bayt

l=['a'..'z']
u=['A'..]
(>>= \c->c:maybe""pure(lookup c$zip l u++zip u l))

5

Cheddar , 118 104 bayt

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

İlk gerçek Cheddar cevabı !!! Bu, düşündüğümden çok daha az iklimseldir ...; _;

Rekabetçi olmayan sürüm 1.0.0-beta.9 ile çalışır .


Söyleyebileceğiniz gibi kaşar golf oynamak için tasarlamadım:

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()

Kullanımı:

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

Güncelleme: 7/14/16 Bu sayıyı 84 bayta indiren son sınıflandırmaları bitirdim

Çedar, 84 bayt

(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 sürümünden itibaren çalışır


4
Yuppi! Bu anı uzun zamandır bekliyoruz!
DJMcMayhem

Bir veya iki yöntem ismi değişikliğiyle geçerli olan Sidef
cat

@ cat o_o benzerlik rahatsız
edicidir

İkisi de Perl, Perl 6, Ruby, Python, vb. Tarafından etkilendiler, bu yüzden şaşırtıcı değil: P
cat

1
hayır hayır hayır hayır hayır oh @cat, kaşar oldu değil piton etkilenmiştir
Downgoat

4

Retina, 28 27 21 bayt

Bunlar sekmedir, boşluk değil.

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

Çevrimiçi deneyin

Önerileriniz için teşekkürler.


Boşluklar SE tarafından yenir.
Conor O'Brien,

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

Martin ve ben sohbette konuşuyorduk ve biz geldik: retina.tryitonline.net/…
FryAmTheEggman

@ FryAmTheEggman Ah, unuttum _. Yine de tüm test durumlarını aynı anda test edebilmek için sekmeler kullanacağım.
mbomb007

1
Ancak test takımının golf oynaması gerekmiyor: P Sadece "ilk satır her satırda ayrı çalışır" diyen bir not bırakmak genellikle yeterlidir. Burada, sekme karakterlerinin deliliğini koruyacaktır.
FryAmTheEggman

4

C 87 80

Giriş olarak bir dize f()geçirin ve çıkış STDOUT'a yazılır. Dize değiştirilmedi.

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

Çevrimiçi denemek için bir yol sağlayabilir misiniz?
aloisdg diyor Reinstate Monica,

Deneyin @aloisdg ideone.com
kedi

4

sed, 30 bayt

29 bayt kodu + 1 bayt parametresi -r

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

Kullanımı:

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 bayt

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

açıklama

[:;]<@~."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
İf-then-else'i korumalarla değiştirerek, 15 byte tasarruf edebilirsiniz. Ve 5 byte daha fazla isLowerolan elem, yapıdan daha kısadır .
arjanen

1
>>=bir concatMap(ya da concat.mapters çevrilmiş bağımsız değişkenler ile): f n = n >>= (\x->if isAlpha x then[x,r x]else[x]). Noktasız gidip fonksiyon ismini çıkartabilir ve file tanımını değiştirebilirsiniz (>>= \x->if isAlpha x then[x,r x]else[x]).
nimi

1
Bunun yerine , örneğin otherwisedeğerlendiren herhangi bir ifadeyi kullanabilirsiniz . Sen yerini alabilecek bir liste anlayışı ile: . Oh ve bir hata var: İkinci içinde a olmalıdır . True1<2if .. then .. else\x->[x]++[g x|isAlpha x]toUppergtoLower
nimi

1
Ah, bir daha: [x]++olduğunu x:.
nimi

4

Perl, 36 bayt (35 + -nbayrak)

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

( -petiket gerekli)

(@Dom Hasting sayesinde -2 bayt)

Kısa açıklama:
ordBir karakterin sayısal değerini döndürür. ord(any lower case) >= 97ve ord(any upper case) <= 90).

Çalıştır:

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

Yine de kullanmanız gerekir, /iaksi halde regexp, harfler arasında birkaç kod noktasıyla eşleşir.
Oleg V. Volkov

@ OlegV.Volkov oh doğru, teşekkürler, cevap düzenlendi.
Dada

Yöntemi kullanarak bir bayt daha aldım: Çevrimiçi deneyin!
Xcali

4

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

İle -pbayrak, kaçak

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

Takes advantage of the fact that swapcase! will return nil on anything but an ASCII letter, which translates to an empty string when returned out of the gsub block. @Jordan saved a byte by capturing the previous character in a look-behind.


Matching with // and then using $`[-1] is clever.
Jordan

1
I managed to shave off six bytes with lookbehind: gsub(/(?<=(.))/){$1.swapcase!}. Same basic concept, though, so feel free to use it.
Jordan

Cool! That looks one byte shorter to me.
histocrat

Er, yes, one byte. I think I had some extra code in there to test that I accidentally counted.
Jordan

There is no need to use the self-modifying version of .swapcase!. (I mean, remove the !.)
manatwork

4

R, 191 187 168 156 98 99 bytes

99 bytes due to improvements fro Giuseppe and MickyT.

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

98 bytes -- maybe sometime next year, we can find another golf of this, hahaha.
Giuseppe

1
I hate to be the bearer of bad new, but it fails on test cases with spaces. readline() can be used, but it will cost a byte
MickyT

@MickyT thanks, fixed now.
rturnbull

@MickyT scan will work with input given wrapped in quotes (as is often the case for command-line arguments in other languages)
Giuseppe

@Giuseppe Sorry I didn't realise that. I just thought it automatically split on whitespace unless you specify a non whitespace character. Sorry rturnbull
MickyT

3

05AB1E, 7 bytes

Code:

vyyš«Ù?

Explanation:

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

Uses the CP-1252 encoding. Try it online!


Maybe you could provide a link to the interpreter?
nicael

2
@nicael It IS linked... It's right there on github.
mbomb007

So no online interpreter? :(
nicael

@nicael Then download it, and run it. There doesn't have to be an online interpreter, just an interpreter.
mbomb007

1
@nicael Yeah, there is no online interpreter available yet :(. The offline version should work though.
Adnan



3

Actually, 8 bytes

`;Öo╔`MΣ

Try it online!

Explanation:

`;Öo╔`MΣ
`;Öo╔`M   for each character in input:
 ;          duplicate the character
  Ö         swap case
   o        append to original character
    ╔       remove duplicated characters
       Σ  concatenate

3

MATL, 11 9 bytes

tYov"@uv!

Try it Online

Explanation

        % 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 bytes (20 + -p flag)

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

I imagine you can save a byte by using $" instead of ' ', but I haven't tested.
msh210

@msh210, nice! How could I forget to check perlvar for default strings? Thanks!
Oleg V. Volkov

3

Stax, 7 6 bytes

Thanks to @recursive for a byte saved!

┤§ÆP♦■

Run and debug it at staxlang.xyz! (link is to unpacked version)

Unpacked (7 bytes):

c:~\{um

Explanation:

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.

Thanks for giving stax a try. One easy improvement you can make is to use u instead of :g. It will get all the unique elements in an array, which is exactly what you want in this case. Other than that, this looks well golfed.
recursive

@recursive Thanks! Forgot about that one :/ Will edit in soon.
Khuldraeseth na'Barya

Doesn't work for 123. You may need to change the format for all inputs (i.e. quote them). The link is also broken. You need to replace m=11 with m=2. There is a PPCG post generating button on staxlang.xyz so you may want to use that one.
Weijun Zhou

@WeijunZhou Thanks, fixed!
Khuldraeseth na'Barya

2

Python, 59 bytes

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

Edited to fix repeating non-alphabetic characters



2

PHP 4.1, 57 bytes

This code assumes access through a web server (Apache, for example), using the default configuration.

You can pass the string by sending the key S by any means (POST, GET, COOKIE, SESSION...).

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


2

Common Lisp (Lispworks), 262 bytes

(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))

Usage:

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

CL-USER 2 > (f "bad")
"bBaAdD"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.