Boşlukları Kaldır, Büyük Harfleri Korumak


27

Girişiniz İngilizce bir cümle, cümle veya kelime olacaktır. Sadece içerecektir a-zA-Z' -,.!?. Göreviniz girdi almak, boşlukları kaldırmak ve sonra büyük harfleri, daha önce büyük harfle indekslenen harflerin (ve sadece daha önce büyük harfle indekslenen harflerin büyük harflerle yazılması) yeniden dağıtmaktır.

Örneğin, girdi ise A Quick Brown Fox Jumped Over The Lazy Dog, büyük harflerin (0 tabanlı) dizinleridir 0, 2, 8, 14, 18, 25, 30, 34, 39. Daha sonra, giriş boşlukları kaldırma: AQuickBrownFoxJumpedOverTheLazyDog. Ardından, tüm harfleri küçük harf, ancak şu harfleri büyük harf yapın 0, 2, 8, 14, 18, 25, 30, 34, 39:, AqUickbrOwnfoxJumpEdovertHelazYdogçıktınız.

Giriş

Girişiniz İngilizce bir cümle, cümle veya kelime olacaktır. Yalnızca küçük harf, büyük harf, tire, kesme işareti, virgül, nokta, soru işareti, ünlem işareti ve boşluk içerebilir.

Çıktı

Boşluklarla giriş kaldırıldı, küçük harf-d, büyük harf dizinde harflerle giriş büyük harf-d'de.

NOT: Programınız bir IndexOutOfRange veya benzeri bir hatayla çökemez (bu tür bir yürütme sonlandırılır).

Test Kılıfları

Hi! Test!
Hi!tEst!

A Quick Brown Fox Jumped Over The Lazy Dog
AqUickbrOwnfoxJumpEdovertHelazYdog

testing TESTing TeStING testing testing TESTING
testingtESTIngteStInGTEstingtestingtestiNG

TESTING... ... ... success! EUREKA???!!! maybe, don't, NOOOOO
TESTING.........success!eureKA???!!!maybe,don't,nooooo

Enter        PASSWORD ---------
Enterpassword---------

A a B b C c D d E e F f G g H h I i J j K k L l M m N n O o P p Q q R r S s T t U u V v W w X x Z z
AabbCcddEeffGghhIijjKkllMmnnOoppQqrrSsttUuvvWwxxZz

  TEST
teST


'Örneğin, girdi "Tembel Köpeğin Üzerine Atlanan Hızlı Kahverengi Bir Tilki" ise, büyük harflerin (0 tabanlı) dizinleri 0, 2, 8, 14, 18, 23, 27, 32' 0, 2, 8, 14, 18, 25, 30, 34, 39
Onlardır

@LukeSawczak, teşekkür ederim kötüm
Stephen,

Tuzak alanlarına izin verilmiyor, sanırım?
Luis Mendo

@LuisMendo sizin varsayımınız doğru. Bu kod golf değil mi? : P
Stephen

Yanıtlar:


7

Jöle , 14 13 bayt

nŒlTɓḲFŒlŒuṛ¦

Çevrimiçi deneyin!

Nasıl çalışır

nŒlTɓḲFŒlŒuṛ¦  Main link. Argument: s (string)

 Œl            Convert s to lowercase.
n              Perform character-wise "not equal" comparison.
   T           Get the indices of all truthy elements, i.e., the indices of all
               uppercase letters in s. Let's call the resulting array J.
    ɓ          Begin a dyadic chain with left argument s and right argument J.
     ḲF        Split s at spaces and flatten, removing the spaces.
       Œl      Convert s to lowercase.
            ¦  Sparse application:
         Œu        Convert s to uppercase.
           ṛ       Take the resulting items of the uppercased string at all indices
                   in J, the items of the lowercased string at all others.


7

Python 2 , 114 bayt

x=input()
X=x.replace(' ','')
print''.join([X[i].upper()if x[i].isupper()else X[i].lower()for i in range(len(X))])

Çevrimiçi deneyin!

eşdeğer bir:

Python 2 , 114 bayt

lambda x:''.join([[str.lower,str.upper][x[i].isupper()](x.replace(' ','')[i])for i in range(len(x)-x.count(' '))])

Çevrimiçi deneyin!


''.join([(X[i].lower,X[i].upper)[x[i].isupper()]()for i in range(len(X))])-5 bayt için
ovs

5

Python 3 , 78 75 72 bayt

s=input()
for c in s:s=s[c>' '!=print(end=(c+c).title()[s<'@'or'['<s]):]

6 baytlık golf oynamak için @xnor'a teşekkürler!

Çevrimiçi deneyin!


sBunun yerine sadece karşılaştırabilir misiniz s[0]?
xnor

Evet tabi ki. Teşekkürler!
Dennis

1
(c*2).title()açık olsa da, her iki vakayı da alabilirim.
xnor

Başka bir 3 bayt. Tekrar teşekkürler!
Dennis

Zor! Bunun c>' '!=f()eşdeğer olduğunu bulmam biraz zaman aldı (c>' ') and (' '!=f()).
Chas Brown,

5

05AB1E , 15 14 bayt

Emigna sayesinde -1 bayt

ðKuvy¹Nè.lil}?

Çevrimiçi deneyin!

ðK             # Remove spaces
  u            # Convert to uppercase
   vy          # For each character...
     ¹Nè       #   Get the character at the same index from the original input
        .lil}  #   If it was a lowercase letter change this one to lowercase
             ? # Print without a newline

Boşluk alan dizgeyi büyük ve küçük harfleri küçük harcarsanız bir bayt kaydedersiniz.
Emigna

5

Haskell , 98 95 89 88 81 bayt

Toplam 14 byte tıraş için @name, @nimi, @Zgarb ve @Laikoni sayesinde

import Data.Char
\s->zipWith(\p->last$toLower:[toUpper|isUpper p])s$filter(>' ')s

Ungolfed:

import Data.Char
\sentence -> zipWith (\oldChar newChar ->
                        if isUpper oldChar
                        then toUpper newChar
                        else toLower newChar)
                     sentence
                     (filter (/= ' ') sentence)

Cep telefonunuzda, ancak bazı baytları filtreyle kaydedebilirsiniz (/ = '')
Henry

Evet, kesinlikle yapabilir. Belirtilerin, boşlukların kaldırılması gereken tek beyaz boşluk olduğunu belirten kısmını kaçırdık.
Julian Wolf

1
filter(>' ')bir bayt daha az için
nimi

2
Bence lambdanın gövdesi kısaltılabilirlast(toLower:[toUpper|isUpper p])c
Zgarb

Argümanlarını Switching zipWithbir byte daha tasarruf olmalıdır: f s=zipWith(\p->last$toLower:[toUpper|isUpper p])s$filter(>' ')s.
Laikoni,

4

V , 24 bayt

ÄVuÓó
ejlDò/¥2lõ
vuk~òGd

Çevrimiçi deneyin!

Bu tür zorluklar tam olarak V için yapıldı. :)

Açıklama:

Ä           " Duplicate this line
 Vu         " Convert it to lowercase
   Óó       " Remove all spaces
e           " Move to the end of this line
 j          " Move down a line (to the original)
  l         " Move one char to the right
   D        " And delete the end of this line
    ò       " Recursively:
     /      "   Search for:
         õ  "     An uppercase character
      ¥2l   "     On line 2
            "     (This will break the loop when there are no uppercase characters left)
vu          "   Convert it to lowercase
  k         "   Move up a line
   ~        "   Convert this to uppercase also
    ò       " Endwhile
     G      " Move to the last line
      d     " And delete it

@DLosc İyi sorular! Newlines, bir ikame (remove) veya search komutu gibi bir regex komutunun sonunu işaret eder. Bu sayfada daha fazla ayrıntı var: github.com/DJMcMayhem/V/wiki/Regexes
DJMcMayhem

4

Python 2, 100 bayt

s=input()
print"".join([c.lower(),c.upper()][s[i].isupper()]for i,c in enumerate(s.replace(" ","")))

3
PPCG'ye hoş geldiniz ve çok iyi bir ilk cevap!
ETHproductions

3

Alice , 32 bayt

/..- ~l+u~mSloy
\ia''-y.'Qa.+a@/

Çevrimiçi deneyin!

açıklama

Bu, tamamen sıralı modda çalışan programlar için standart bir şablondur. Sarılmamış, program aşağıdaki gibidir:

i.' -l.uQm.lay.a-'~y+'~aS+o@

i       take input as string
.       duplicate
' -     remove spaces from copy
l.u     create all-lowercase and all-uppercase versions
Q       reverse stack, so original string is on top
m       truncate original string to length of spaces-removed string
.lay    convert everything except uppercase characters to \n
.a-'~y  convert everything except \n (i.e., convert uppercase characters) to ~
+       superimpose with lowercase string
        \n becomes the corresponding lowercase character, and ~ remains as is
'~aS    convert ~ to \n
+       superimpose with uppercase string
        lowercase in existing string stays as is because it has a higher code point
        \n becomes corresponding uppercase character
o       output
@       terminate

3

JavaScript (ES6), 94 91 85 bayt

s=>s.replace(/./g,c=>c==" "?"":c[`to${"@"<s[x]&s[x++]<"["?"Upp":"Low"}erCase`](),x=0)
  • ETHproductions & Arnauld'un desteğiyle 6 bayt kurtarıldı.

Dene

o.innerText=(f=

s=>s.replace(/./g,c=>c==" "?"":c[`to${"@"<s[x]&s[x++]<"["?"Upp":"Low"}erCase`](),x=0)

)(i.value="Hi! Test!");oninput=_=>o.innerText=f(i.value)
<input id=i><pre id=o>



Yapabileceğin '@'<s[i]&s[i]<'['??
ETHproductions

@StepHen: Aw, dostum, dün gece bunu üzerinde çalışırken görmedim.
Shaggy

@ETHproductions: Daha kısa olup olmadığını merak ediyordum, ama hangi karakterleri kullanmam gerektiğine bakmak için fazla tembeldim: D Bir bayt kurtardığını; Teşekkürler.
Shaggy

3

Retina , 77 71 bayt

.+
$&¶$&
T`L `l_`.+$
+`((.)*)[A-Z].*(¶(?<-2>.)*)
$1$3 
.+¶

T`l `L_` .?

Çevrimiçi deneyin! Bağlantı test paketi içerir. Açıklama: İlk aşama çizgiyi kopyalarken, ikinci aşama kopyayı küçültür ve boşluklarını siler. Üçüncü aşama daha sonra büyük harflerin her birinden sağdan sola doğru dolaşır ve ikinci satırdaki karşılık gelen karakterden önce boşluk bırakmaya çalışır. İlk satır silinir ve boşluklar sonucun ilgili karakterlerini büyük harf yapmak için kullanılır. Düzenleme: @ Koo sayesinde 6 bayt kaydedildi.


Küçük soru: (.?)ve $4parçalar gerekli mi? Sonunda isteğe bağlı bir gruba sahip olmak hiç bir şeye benzemiyor.
Kobi,

@Kobi Bu soru hakkında küçük bir şey yok! Başlangıçta, ayrı bir adım olarak tercüme etmek yerine doğrudan üst üste gelecek olan karakterleri eşleştirmek için lookroundround kullanma girişiminin bir parçası olmuştu.
Neil

3

Perl, 95 94 + 1 = 95 bayt

-N için +1 bayt ceza

Dan yerine tek bayt kaydet s/\s//giçins/ //g

$s=$_;s/ //g;$_=lc($_);while(/(.)/gs){$p=$&;$p=uc($p)if(substr($s,$-[0],1)=~/[A-Z]/);print$p;}

Çevrimiçi deneyin!

Açıklama:

  1. Giriş dizesinin kopyasını alın.

  2. Tüm boşlukları kaldırın ve dizgiyi küçük harfe dönüştürün.

  3. Ardından her harfin üzerinden döngüye başlayın. Harfleri büyük harf için kaydedilmiş dizgede aynı konumda test edin. Üst ise - geçerli harfi kapitalize edin. Mektubu yazdır.

Perl'in "-n" komut satırı anahtarıyla çalıştırılması gerektiğini unutmayın.


PPCG'ye Hoşgeldiniz! İsterseniz, Çevrimiçi Deneyin'e bir link ekleyebilirsiniz: tio.run/# (Ekleyeceğim, ancak bunun Perl 5 mi yoksa Perl 6 mı olduğunu bilmiyorum)
Stephen

1
Bayrak +1için bayt saymanız gerektiğini düşünüyorum -n. Bunun dışında, bu iyi görünüyor! Siteye Hoşgeldiniz! :)
DJMcMayhem

@StepHen Perl 5, link ekler misiniz? Kodumu orada uzman bir şekilde çalıştıramadım.
Veitcel

Yeni bir Perl golfçü gördüğüme sevindim! Yanıtınıza TIO bağlantısını ekledim ve biçimlendirmeyi geliştirdim.
Dada


2

Python 3 , 117 bayt

s=input()
y=list(s.replace(' ','').lower())
i=0
for c in y:
 if s[i].isupper():y[i]=c.upper()
 i+=1
print(''.join(y))

Çevrimiçi Deneyin!

Bu hemen hemen ilk kod golf, bu yüzden aşağıdaki yorumlardan eksi yardım, kötü olması muhtemeldir!

Not: Evet, tanımlamanın ve iartırmanın bayt aralığını (len (y)) kurtarması aptalcadır. Oh iyi.


1
PPCG'ye Hoşgeldiniz! Güzel ilk başvuru! Bununla birlikte, sitemizin G / Ç standartlarına uygun olarak, gönderiminiz bir dizgenin işlevi olmalı veya girdi almalıdır; girişin bir değişkende olduğunu varsayamazsınız. Umarım kaldınız! :)
HyperNeutrino

Teşekkürler; bir işlevi düzenledi ancak aynı zamanda vücutta 5 byte kurtardı: D
Luke Sawczak

1
@LukeSawczak girinti için bir boşluğa değiştirerek bir ton bayttan tasarruf edin ve belki Çevrimiçi Deneyin! isterseniz bağlantı
Stephen

1
Sonra boşluğu kaldırabilirsiniz return.
CalculatorFeline

@LukeSawczak bu nasıl? tio.run/…
Stephen

2

C # (.NET Çekirdeği) , 108 101 bayt

using System.Linq;s=>s.Replace(" ","").Select((c,i)=>s[i]>64&s[i]<91?char.ToUpper(c):char.ToLower(c))

Çevrimiçi deneyin!

  • charSınıfın statik ToUpper()ve ToLower()metodları olduğunu fark ettikten sonra kaydedilen 7 bayt .

2

Kömür , 33 bayt

A⁰χFLθ¿⁼§θι A⁺¹χχ¿№α§θ⁻ιχ↥§θι↧§θι

Çevrimiçi deneyin!

Beyaz boşluklu bir dizeyi tek bir giriş parametresi olarak Kömür koduna nasıl geçireceğimi bilmediğim için, test başlığında sadece ilk girişin ne olacağını gösteren Kömür değişkenine test dizesini atadım θ:

AA Quick Brown Fox Jumped Over The Lazy Dogθ

Bu nedenle, kodun ilk giriş olarak geçirilmiş gibi aynı sayıda bayt vardır.

Burada kodun ayrıntılı sürümünü görebilirsiniz .


1
Başka bir cevapta dedim ama unutursanız, sadece bir element içeren bir python dizisi olarak girin
ASCII-sadece

Sadece girişin yeni bir hattına sahip olmasını istiyorum.
Neil,

2

PHP, 181 bayt

Az sayıda bayt almaya çalışıyorum, bu benim kodum:

<?php
$s=readline();
preg_match_all('/[A-Z]/',$s,$m,PREG_OFFSET_CAPTURE);
$s=strtolower(str_replace(' ','',$s));
while($d=each($m[0]))$s[$d[1][1]]=strtoupper($s[$d[1][1]]);
echo $s;

Çevrimiçi deneyin!


Bunun yerine bir Constant PREG_OFFSET_CAPTUREsen değerini kullanabilir 256, $argnolduğu gibi daha kısa bir değişkendir readline()girdi ve bence ctype_upperve kullanımı lcfirstile ucfirstbir döngü ve kullanımı ile bayt çok yarayacaktır $$ive üçlü operatörü
Jörg Hülsermann

2

Java 8, 184 177 161 bayt

s->{String r="";for(int i=0,j=i,t,u;i<s.length;){t=s[i++];if(t>32){u=s[j++];r+=(char)(t<65|t>90&t<97|t>122?t:u>64&u<91?t&~32:u>96&u<123|u<33?t|32:t);}}return r;}

Kesinlikle biraz daha golf oynayabilir ..
- @ OlivierGrégoire sayesinde girişi char[]yerine alarak 16 bayt String.

Açıklama:

Burada dene.

s->{                           // Method with char-array parameter and String return-type
  String r="";                 //  Result-String
  for(int i=0,j=i,t,u;         //  Some temp integers and indices
      i<s.length;){            //  Loop over the String
    t=s[i++];                  //   Take the next character and save it in `t` (as integer)
                               //   and raise index `i` by 1
    if(t>32){                  //   If `t` is not a space:
     u=s[j++];                 //   Take `u` and raise index `j` by 1
     r+=                       //   Append the result-String with:
      (char)                   //    Integer to char conversion of:
       (t<65|t>90&t<97|t>122?  //     If `t` is not a letter:
        t                      //      Simply use `t` as is
       :u>64&u<91?             //     Else if `u` is uppercase:
        t&~32                  //      Take `t` as uppercase
       :u>96&u<123|u<33?       //     Else if `u` is lowercase or a space:
        t|32                   //      Take `t` as lowercase
       :                       //     Else:
        t);                    //      Take `t` as is
    }
  }                            //  End of loop
  return r;                    //  Return result-String
}                              // End of method

1
Bir al char[], bu biri için bir dize yerine sen bayt bol tasarruf edeceğiz!
Olivier Grégoire

Diğer taraftan ben de başka bir algoritma ile cevapladım . Ve burada karşıt argümanları alıyorum: in = String, out = char[]:-)
Olivier Grégoire

2

Ortak Lisp, 104 bayt

(defun f(s)(map'string(lambda(x y)(if(upper-case-p x)(char-upcase y)(char-downcase y)))s(remove #\  s)))

Çevrimiçi deneyin!

Wordy Common Lisp için alışılmadık derecede kısa!

Basit kod:

(defun f (s)                     ; receive the string as parameter
  (map 'string                   ; map the following function of two arguments
       (lambda (x y)             ; x from the original string, y from the string with removed spaces
         (if (upper-case-p x)    ; if x is uppercase
             (char-upcase y)     ; get y uppercase
             (char-downcase y))) ; else get y lowercase
       s
       (remove #\  s)))

2

Java (OpenJDK 8) , 150 117 113 97 bayt

s->{for(int i=0,j=0,c;i<s.length;)if((c=s[i++]&95)>0)System.out.printf("%c",c^(s[j++]|~c/2)&32);}

Çevrimiçi deneyin!

Daha fazla golf yaparken, 102 byte'a geldim:

s->{for(int i=0,j=0,c;i<s.length;)if((c=s[i++]&95)>0)System.out.printf("%c",c<64?c|32:c|s[j]&32,j++);}

Çevrimiçi deneyin!

Ama bunun Dennis'in C cevabı gibi görünmeye başladığını hatırladım, bu yüzden sadece biraz titrek hareketini aktardım ve ... sihir oldu. Limanın sağladığı büyük kazanç, dalları ve içlerindeki tekrarları kaldırmaktır.


Çalışmayan @ceilingcat: Hi! Test!olmalı Hi!tEst!, ama çözümünle birlikte olur Hi!Test.
Olivier Grégoire

2

Google Sayfaları, 213 bayt

=ArrayFormula(JOIN("",IF(REGEXMATCH(MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1),"[A-Z]"),MID(UPPER(SUBSTITUTE(A1," ","")),ROW(OFFSET(A1,0,0,LEN(A1))),1),MID(LOWER(SUBSTITUTE(A1," ","")),ROW(OFFSET(A1,0,0,LEN(A1))),1))))

Girdi hücre içindedir A1ve formül şu şekilde parçalanır:

  • ArrayFormula()ROW()bağımsız olarak her terimi değerlendirmemize izin veriyor
  • JOIN() tüm bu bağımsız sonuçları tek bir dizgide birleştirir
  • IF(REGEXMATCH(),UPPER(),LOWER() Girişte bu durumda ne olduğuna bağlı olarak büyük veya küçük harf kullanarak alternatif yapan şeydir.
  • ROW(OFFSET())değerlerinin bir dizi döner 1için A1.lengthbu beslenebilir MID()biz sırayla her karakter değerlendirmek, böylece fonksiyon

Test vakalarının sonuçları: (Büyük halini tıklarsanız okumak kolaydır.)

testcases


2

Ruby , 80 bayt

->a{n=a.downcase.delete' '
n.size.times{|i|(?A..?Z)===a[i]&&n[i]=n[i].upcase}
n}

Çevrimiçi deneyin!


Sen kullanarak birkaç bayt kaydedebilirsiniz n.gsub(/./){}yerine n.size.times{};n: n.gsub(/./){(?A..?Z)===a[i]?$&.upcase: $&}.
Ürdün

2

Perl, 92 bayt

$p[$i++]=$-[0]while s/[A-Z]/lc($&)/e;s/\s//g;for$c(@p){substr($_,$c,1)=~tr[a-z][A-Z]};print;

Açıklama:

$p[$i++]=$-[0]while s/[A-Z]/lc($&)/e;   #get locations of caps into an array at the same time converting letters to lowercase

s/\s//g;   #delete all spaces

for$c(@p){substr($_,$c,1)=~tr[a-z][A-Z]};   #convert lowercase letters to uppercase where uppercase letters were present

print;   # print (of course) :)

1
PPCG'ye Hoşgeldiniz! :)
Stephen

-nCevabınızı geçerli kılmak için bayrak eklemeniz gerekir . Birkaç golf oyunu : s/ //gyeter (gerek yok \s), bayrak kullanabildiğinizle y/a-z/A-Z/aynıdır tr[a-z][A-Z], -pen son printihtiyacınız olmaz, parantez içinde olmazsınız lc$&.
Dada



1

Python 2, 106 105 bayt

s=input()
print''.join(map(lambda(c,u):[c.lower,c.upper][u](),zip(s.replace(' ',''),map(str.isupper,s))))

Düzenleme: aracılığıyla bir byte tasarrufu print ''.join=> print''.join.

Lambda formu, 99 bayt

lambda s:''.join(map(lambda(c,u):[c.lower,c.upper][u](),zip(s.replace(' ',''),map(str.isupper,s))))

1

SCALA, 128 karakter, 128 bayt

var l=s.toLowerCase().filter(x=>x!=32)
for(i<-0 to l.size-1){if(s(i).isUpper)l=l.substring(0,i)+l(i).toUpper+l.substring(i+1)}
l

Bu meydan okuma için teşekkürler. Çevrimiçi deneyin!


1

q / kdb +, 49 bayt

Çözüm:

{@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}

Örnekler:

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"Hi! Test!"
"Hi!tEst!"

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"A Quick Brown Fox Jumped Over The Lazy Dog"
"AqUickbrOwnfoxJumpEdovertHelazYdog"

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"testing TESTing TeStING testing testing TESTING"
"testingtESTIngteStInGTEstingtestingtestiNG"

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"TESTING... ... ... success! EUREKA???!!! maybe, don't, NOOOOO"
"TESTING.........success!eureKA???!!!maybe,don't,nooooo"

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"Enter        PASSWORD ---------"
"Enterpassword---------"

q){@[a;(&)(#:[a:lower x except" "]#x)in .Q.A;upper]}"A a B b C c D d E e F f G g H h I i J j K k L l M m N n O o P p Q q R r S s T t U u V v W w X x Z z"
"AabbCcddEeffGghhIijjKkllMmnnOoppQqrrSsttUuvvWwxxZz"

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"  TEST"
"teST"

Açıklama:

Girişin büyük olduğu endeksleri bulun ve sonra işlevi uygulayın upper giriş dizesinin küçük harfli, boşluk kaldırılmış bir sürümündeki bu . İşlevi dizenin uzunluğunun ötesine uygulayamayacağımıza dikkat edin, bu nedenle #giriş dizesini küçük harf, boşluk kaldırılmış sürümün uzunluğuna kesmek için take ( ) kullanın.

{@[a;where count[a:lower x except " "]#x in .Q.A;upper]} / ungolfed
{                                                      } / lambda function
 @[ ;                                           ;     ]  / apply FUNC to VAR at INDICES: @[VAR;INDICES;FUNC]
                                                 upper   / uppercase, upper["abc"] -> "ABC"
                                       x in .Q.A         / boolean list where input is in uppercase alphabet ABC..XYZ
                                      #                  / take this many elements from list on the right (ie truncate)
           count[                    ]                   / returns length of the stuff inside the brackets, count["ABC"] -> 3                                        
                         x except " "                    / remove " " from string
                   lower                                 / lowercase, lower["ABC"] -> "abc"
                 a:                                      / save in variable a
     where                                               / returns indices where true where[101b] -> 0 2
   a                                                     / our lowercased, space-stripped input

Bonus:

Cevapları okuduktan sonra, girdi üzerinde yinelendiğim bir çözüm deneyeceğimi düşündüm, şimdiye kadar sadece 53 baytlık bir çözümü başardım:

{a{$[y in .Q.A;upper x;x]}'#:[a:lower x except" "]#x}

1

Swift 3.0, 199 bayt

var s="AS Ff",i=[String](),p=[Int](),j=0;for c in s.characters{if c>="A"&&c<="Z"{p.append(j)};if c != " "{i.append(String(c).lowercased())};j=j+1};for c in p{i[c]=i[c].uppercased()};print(i.joined())

Çevrimiçi Deneyin!


1

Perl 5 , 40 bayt

37 bayt kodu + -Fbayrak. (Perl’in eski sürümlerinde -anbayrak eklemeniz gerekebilir. )

print$F[$i++]=~/[A-Z]/?uc:lc for/\S/g

Çevrimiçi deneyin!

Açıklamalar:
sayesinde -F, @Fgirişin her karakterlerin bir listesini içerir.
for/\S/gGirişin her boşluk olmayan karakterini yineler. $iHangi yinelemede olduğumuzu saymak için kullanıyoruz . Eğer $F[$i++]bir büyük harf ise ( /[A-Z]/), o zaman büyük harfli mevcut karakteri ( uc) basarız , aksi takdirde küçük harfle basarız ( lc). Bunu not edin ucve lcbir harf değilse argümanlarını değiştirmeden geri döndür.


Önceki sürüm (daha az golf: 47 byte):

 s/ //g;s%.%$_=$&;$F[$i++]=~/[A-Z]/?uc:lc%ge

Ç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.