Case- (çok) hassas dizelerle daha eğlenceli


28

Bu zorluktan ilham alarak (ya da daha spesifik olarak yanlış okuma yoluyla), şu zorluklarla karşılaştım:

Bir giriş dizesi S verildiğinde, tüm büyük harfli karakterlerin ve tüm küçük harfli karakterlerin sırasını ters çevirin. Harf olmayan tüm karakterleri yerinde bırakın. Örneğin:

Selam Dünya!

Büyük harf o Not W(ilk büyük harf) ile değiştirildi H(son). Aynı küçük harfler için de geçerlidir: 'd' (ilk) e(son) ile değiştirilir , l(ikinci) ile değiştirilir l(pen-ultimate) ... Harf olmayan tüm karakterler yerinde kalır .

Giriş

  • Giriş, 32-126 aralığında yalnızca ASCII karakterleri olan bir dizedir.
  • Girişin en az 1 karakter uzunluğunda olması garanti edilir ve dilinizin sınırını aşmaz.

Çıktı

  • Aynı dize, karakterlerle açıklandığı gibi değiştirildi.

Ek kurallar

  • Standart boşluklar yasaktır
  • Cevap, snippet veya REPL girişi değil, tam program veya işlev olmalıdır.
  • , bayt cinsinden en kısa cevap kazanır.

Test durumları

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!

2 karakterlik bir test çantası eklemek isteyebilirsiniz, orijinal çözümüm ilk başta bu konuda başarısız oldu. (Değiştirme tarafından ücretsiz olarak sabit .+üzere .*)
ETHproductions

"tembel doge" bana şunu hatırlattı: youtube.com/watch?v=W-d6uUSY9hk
FinW

Yanıtlar:


5

MATL , 14 bayt

2:"t@Y2myy)Pw(

MATL Online'da deneyin

açıklama

        % 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
İyi iş! 2:"tttXk>f)5MP(Yo17 bayt vardı
Luis Mendo

11

Retina , 19 bayt

Retina'nın bir dizgeyi ters çevirmenin doğrudan bir yolu yoktur, ancak sıralama aşamasını kullanarak bunu yapabiliriz:

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

Sırala ( O), onları sayı olarak okuyarak ( #) ve verilen sırayla ^eşleşen tüm dizelerin sıralamasını ( ) ters çevirin ( ilk satır için küçük harfler ve ikinci için büyük harfler).

Bu işe yarıyor, çünkü karakterleri sayısal karakterleri olmayan sayılarla ele almayı denediğimizde 0, böylece tüm karakterleri sıralama için aynı değere sahipler. Sıralama sabit olduğundan, aynı sırada bırakılır ve ters çevrildiğinde orijinal dizgiyi tersine döndürür.

Çevrimiçi deneyin!


10

Perl , 45 bayt

44 bayt kodu + -pbayrak.

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

Çevrimiçi deneyin!

Unicode karakterler, sırasıyla büyük ve küçük harfleri sınıflar \p{Lu}ve \p{Ll}eşleştirir.
Böylece /\p{L$c}/tüm büyük (veya küçük) büyük harflerin listesini döndürür (ve içinde saklar @T).
Ve daha sonra, regex s/\p{$c}/pop@T/ge, her bir (büyük harf, sonra küçük harf) harfini @Tçıkarırken son harfiyle değiştirir @T.


7

JavaScript (ES6), 74 73 71 70 bayt

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>

Düzenleme: @Arnauld sayesinde 1 bayt kaydedildi.


4
Daha iyi bir yol olduğunu biliyordum ...
ETHproductions

5

JavaScript (ES6), 92 bayt

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

Orada olan var regexes arasındaki benzerlik yararlanmak için bir yol olması ...

Test pasajı


Bu, işlevin bir değişkene atandığını varsayar mı f? Bu bayt sayısında olmamalı mıydı?
steenbergh

@steenbergh İşlev anonimdir, ne istersen onu
çağırırsın

1
@steenbergh Hayır, başka bir işlev yaratan F, onu tekrar tekrar iki kez çağıran isimsiz bir işlevdir . Dış fonksiyon aslında herhangi bir noktada kendisini çağırmaz.
ETHProductions

Neden .*regex'lerde parantez kullanıyorsunuz ?
Luke,

(Bu karakterleri yakalamak için @Luke aiçinde ([x],a,y)=>)
ETHproductions

4

Perl 6 , 75 69 bayt

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

Nasıl çalışır

  1. my @a=.comb;
    Dizeyi karakterlere bölün ve dizide saklayın.

  2. for /<:Lu>/,/<:Ll>/
    Sırasıyla büyük ve küçük harflerle eşleşen iki regex ...

    • @(grep $_,@a)
      Regex ile eşleşen tüm dizi girişlerinden bir dilim alın.

    • .&{@$_=[R,] $_}
      Dilimin tersini kendisine atayın.

  3. [~] @a
    Değiştirilen diziyi tekrar bir dize oluşturacak şekilde birleştirmek ve geri döndürmek.


-6 bayt, @ Dada'nın çözümünden karakter aralıkları yerine Unicode sınıflarını kullanma fikrini çaldırarak.


3

Jöle , 14 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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 olmak değil ama .. 14 karakter! = 23 bytes :) mothereff.in/byte-counter
Gizmo

@Gizmo Jelly bir kod sayfası kullanıyor . Daha fazla bilgi için bu meta yayına bakın .
17:17

@Suever Oh bu çok temiz, bugün bir şeyler öğrendim ^. ^
Gizmo

3

Bash + Unix yardımcı programları, 122 121 bayt

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]

Çevrimiçi deneyin!

Çok kısa değil; belki birileri daha fazla golf oynayabilir.

Stdin'de giriş, stdout'ta çıkış.

Bu, 200 karakterden kısa girişlerde düzgün çalışacaktır.

(Aslında, 200'den küçük küçük harflerden ve 200'den küçük büyük harflerden oluşan herhangi bir dizeyi doğru şekilde işler.)

Koddaki 99'u 102'ye (ek bir bayt pahasına) yükseltirseniz, karakterleri 205 karaktere kadar tutacaktır.

Bununla birlikte, koddaki 99'u 102'nin ötesine yükseltemezsiniz, çünkü daha sonra sed'in maksimum argüman uzunluğunu geçersiniz.

Burada belirli bir giriş boyutu sınırlaması olmayan bir sürüm var, ancak sayı biraz daha uzun, 137 bayt. (Bu daha uzun sürüm, t adında bir yardımcı dosyaya yazar.)

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

Test çalıştırması:

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'da başarısız olması ilginç. sedYour Sisteminizde kurulu olan uygulamaya bağlı sedolabilir , ancak GNU'ya -rseçenek ekleyebilir ve \tüm parantezlerden kaçmayı kaldırabilirsiniz .
Manat çalışması

2

Python 2 , 115 bayt

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

Çevrimiçi deneyin!


İle değiştirebilir misiniz?
Tim

Ne yazık ki hayır. Argümanı execher zamanki Python kodu olarak ayrıştırılır, bu nedenle for döngüsü kendi satırında olmalıdır.
Dennis,

2

Java (OpenJDK 8) , 271 bayt

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)

Çevrimiçi deneyin!


Bunu bir lambda yaparak bazı baytları kurtarabilirsin. s->new String...
NonlinearFruit

1
@NonlinearFruit teşekkür ederim! 294 -> 272, ayrıca başlatılmadan yeniden kullanıldığında da hatayı düzeltti.
DmitrySamoylenko

PPCG'ye Hoşgeldiniz! Hala golf oynayabileceğiniz bazı şeyler: char[]o=s.toCharArray();char c;int b;için char o[]=s.toCharArray(),c,b;; ve her ikisi &&için &'; ve c=o[i];return b>1?!Character.isUpperCase(c):!Character.isLowerCase(c);için c=o[i];Character x=c;return b>1?!x.isUpperCase(c):!x.isLowerCase(c);( toplam 259 bayt ). Muhtemelen daha çok golf oynamak için bazı şeyleri özlemiştim. Ayrıca, henüz görmediyseniz , Java'da golf oynamak için ipuçları okumak ilginç olabilir.
Kevin Cruijssen

1

R , 107 bayt

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="")

Bağlantılı mücadeleye verdiğim yanıttan uyarlandı. Bu, sadece çiftleri değiştirmekten çok daha kolaydır. Acaba 100'le biraz golf oynayabilir miyim?

Çevrimiçi deneyin!

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.