Hapus Spasi, Pertahankan Kapitalisasi

27

Masukan Anda akan berupa kalimat, frasa, atau kata dalam bahasa Inggris. Itu hanya akan berisi a-zA-Z' -,.!?. Tugas Anda adalah mengambil input, menghapus spasi, dan kemudian mendistribusikan kembali huruf besar sehingga huruf pada indeks yang ditulis dengan huruf kapital sebelumnya (dan hanya huruf pada indeks yang huruf besar sebelumnya) yang ditulis dengan huruf besar.

Misalnya, jika inputnya A Quick Brown Fox Jumped Over The Lazy Dog, indeks (berbasis 0) huruf kapital adalah 0, 2, 8, 14, 18, 25, 30, 34, 39. Berikutnya, menghapus spasi dari input: AQuickBrownFoxJumpedOverTheLazyDog. Berikutnya, huruf kecil semua huruf, tapi huruf besar mereka di 0, 2, 8, 14, 18, 25, 30, 34, 39: AqUickbrOwnfoxJumpEdovertHelazYdog, yang merupakan output.

Memasukkan

Masukan Anda akan berupa kalimat, frasa, atau kata dalam bahasa Inggris. Itu hanya dapat berisi huruf kecil, huruf besar, tanda hubung, apostrof, koma, titik, tanda tanya, tanda seru, dan spasi.

Keluaran

Input dengan spasi dihapus, huruf kecil-d, dengan huruf pada indeks huruf kapital di input huruf besar-d.

CATATAN: Program Anda tidak dapat crash (kesalahan eksekusi berakhir seperti itu) dengan IndexOutOfRange atau kesalahan serupa.

Uji Kasus

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
Stephen
sumber
Sandbox
Stephen
'Misalnya, jika inputnya adalah "Rubah Brown Cepat Melompati Anjing yang Malas", indeks (berdasarkan-0) dari huruf kapital adalah 0, 2, 8, 14, 18, 23, 27, 32' Mereka0, 2, 8, 14, 18, 25, 30, 34, 39
Luke Sawczak
@LukeSawczak terima kasih, salahku
Stephen
Tracing spasi tidak diizinkan, saya kira?
Luis Mendo
@LuisMendo anggapan Anda benar. Ini golf kode, kan? : P
Stephen

Jawaban:

7

Jelly , 14 13 byte

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

Cobalah online!

Bagaimana itu bekerja

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.
Dennis
sumber
14

C (gcc) , 82 79 74 72 69 67 66 byte

f(c){for(char*s=c,*p=c;c=*s++;c&&putchar(c^(*p++|~c/2)&32))c&=95;}

Cobalah online!

Dennis
sumber
7

Python 2 , 114 byte

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

Cobalah online!

Setara:

Python 2 , 114 byte

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

Cobalah online!

HyperNeutrino
sumber
''.join([(X[i].lower,X[i].upper)[x[i].isupper()]()for i in range(len(X))])untuk -5 byte.
Ov
5

Python 3 , 78 75 72 byte

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

Terima kasih kepada @xnor karena bermain golf 6 byte!

Cobalah online!

Dennis
sumber
Bisakah Anda membandingkan sbukan s[0]?
xnor
Ya tentu saja. Terima kasih!
Dennis
1
(c*2).title()Anda bisa mendapatkan keduanya, meskipun diaktifkan.
xnor
3 byte lagi. Terima kasih lagi!
Dennis
Rumit! Butuh beberapa saat untuk mencari tahu yang c>' '!=f()setara dengan (c>' ') and (' '!=f()).
Chas Brown
5

05AB1E , 15 14 byte

-1 byte terima kasih kepada Emigna

ðKuvy¹Nè.lil}?

Cobalah online!

ð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
Riley
sumber
Anda menyimpan byte jika Anda huruf besar string yang dihapus ruang dan huruf kecil dalam kondisi.
Emigna
5

Haskell , 98 95 89 88 81 byte

Terima kasih kepada @name, @nimi, @Zgarb, dan @Laikoni untuk membantu mengurangi total 14 byte

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

Tidak Disatukan:

import Data.Char
\sentence -> zipWith (\oldChar newChar ->
                        if isUpper oldChar
                        then toUpper newChar
                        else toLower newChar)
                     sentence
                     (filter (/= ' ') sentence)
Julian Wolf
sumber
Di seluler, tetapi sepertinya Anda dapat menyimpan beberapa byte dengan filter (/ = '')
Henry
Yap, tentu bisa. Merindukan bagian dari spesifikasi yang mencatat bahwa ruang adalah satu-satunya ruang putih yang perlu dihapus.
Julian Wolf
1
filter(>' ')kurang dari satu byte
nimi
2
Saya pikir tubuh lambda dapat disingkat menjadilast(toLower:[toUpper|isUpper p])c
Zgarb
Switching argumen zipWithharus menyimpan satu lagi byte: f s=zipWith(\p->last$toLower:[toUpper|isUpper p])s$filter(>' ')s.
Laikoni
4

V , 24 byte

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

Cobalah online!

Tantangan semacam inilah yang dibuat untuk V. :)

Penjelasan:

Ä           " 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
DJMcMayhem
sumber
@Dosc Pertanyaan yang bagus! Baris baru menandakan akhir dari perintah regex, seperti perintah pengganti (hapus) atau pencarian. Lebih detail ada di halaman ini: github.com/DJMcMayhem/V/wiki/Regexes
DJMcMayhem
4

Python 2, 100 byte

s=input()
print"".join([c.lower(),c.upper()][s[i].isupper()]for i,c in enumerate(s.replace(" ","")))
erik
sumber
3
Selamat datang di PPCG, dan jawaban pertama yang sangat bagus!
ETHproductions
3

Alice , 32 byte

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

Cobalah online!

Penjelasan

Ini adalah templat standar untuk program yang sepenuhnya berfungsi dalam mode ordinal. Tidak dibungkus, programnya adalah sebagai berikut:

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
Nitrodon
sumber
3

JavaScript (ES6), 94 91 85 byte

s=>s.replace(/./g,c=>c==" "?"":c[`to${"@"<s[x]&s[x++]<"["?"Upp":"Low"}erCase`](),x=0)
  • 6 byte disimpan dengan bantuan dari ETHproduksi & Arnauld.

Cobalah

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>

Shaggy
sumber
Bisakah kamu melakukannya '@'<s[i]&s[i]<'['??
ETHproduksi
@ LangkahHen: Ah, teman, tidak melihat itu tadi malam ketika saya sedang mengerjakan ini.
Shaggy
@ ETHproductions: Saya bertanya-tanya apakah itu mungkin lebih pendek tapi saya terlalu malas untuk mencari karakter yang perlu saya gunakan: D Ternyata itu doea menghemat satu byte; Terima kasih.
Shaggy
3

Retina , 77 71 byte

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

T`l `L_` .?

Cobalah online! Tautan termasuk test suite. Penjelasan: Tahap pertama menduplikasi baris sedangkan tahap kedua menurunkan duplikat dan menghapus spasinya. Tahap ketiga kemudian loop melalui setiap huruf besar dari kanan ke kiri dan mencoba untuk menempatkan spasi sebelum karakter yang sesuai pada baris kedua. Baris pertama dihapus dan spasi digunakan untuk huruf besar karakter yang relevan dari hasilnya. Sunting: Disimpan 6 byte berkat @Kobi.

Neil
sumber
Pertanyaan kecil: Apakah (.?)dan $4bagian - bagiannya diperlukan? Sepertinya memiliki grup opsional pada akhirnya tidak melakukan apa-apa.
Kobi
@Kobi Tidak ada yang kecil tentang pertanyaan itu! Ini awalnya merupakan bagian dari upaya menggunakan lookarounds untuk mencocokkan karakter yang akan ditulis secara langsung daripada harus menerjemahkannya sebagai langkah terpisah.
Neil
3

Perl, 95 94 + 1 = 95 byte

Denda +1 byte untuk -n

Simpan satu byte dengan ganti dari s/\s//gkes/ //g

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

Cobalah online!

Penjelasan:

  1. Buat salinan string input.

  2. Hapus semua spasi dan ubah string menjadi huruf kecil.

  3. Kemudian mulailah mengulangi setiap huruf. Surat uji di posisi yang sama dalam string yang disimpan untuk huruf besar. Jika di atas - buat huruf saat ini ditangkap. Cetak surat

Perhatikan bahwa perl perlu dijalankan dengan saklar baris perintah "-n"

Veitcel
sumber
Selamat datang di PPCG! Jika Anda mau, Anda dapat menambahkan tautan ke Try It Online: tio.run/# (saya ingin menambahkannya, tetapi saya tidak tahu apakah ini Perl 5 atau Perl 6)
Stephen
1
Saya pikir Anda perlu menghitung +1byte untuk -nbendera. Selain itu, ini terlihat bagus! Selamat datang di situs ini! :)
DJMcMayhem
@Langkah. Apakah ini Perl 5, apakah Anda menambahkan tautan? Saya gagal menjalankan kode saya di sana dengan cara yang benar.
Veitcel
Senang melihat pegolf Perl baru! Saya telah menambahkan tautan TIO ke jawaban Anda dan meningkatkan format.
Dada
2

Python 3 , 117 byte

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

Cobalah secara Online!

Ini cukup banyak kode golf pertama saya, jadi kemungkinan buruk, minus bantuan dari komentar di bawah ini!

PS Ya, bodoh bahwa mendefinisikan dan menambah imenyimpan byte lebih dari jangkauan (len (y)). Baiklah.

Luke Sawczak
sumber
1
Selamat datang di PPCG! Pengiriman pertama yang bagus! Namun, sesuai dengan standar I / O situs kami, kiriman Anda harus berupa fungsi string atau mengambil input; Anda tidak dapat menganggap input dalam variabel. Semoga Anda menikmati masa tinggal Anda! :)
HyperNeutrino
Terima kasih; mengedit fungsi dalam, tetapi juga menyimpan 5 byte dalam tubuh: D
Luke Sawczak
1
@LukeSawczak menghemat satu ton byte dengan mengubah satu ruang untuk lekukan, dan mungkin menambahkan Try It Online! tautan jika Anda ingin
Stephen
1
Anda dapat menghapus ruang setelah return.
CalculatorFeline
@LukeSawczak bagaimana ini? tio.run/...
Stephen
2

C # (.NET Core) , 108 101 byte

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

Cobalah online!

  • 7 byte disimpan setelah menyadari bahwa charkelas memiliki metode ToUpper()dan statis ToLower().
Charlie
sumber
2

Arang , 33 byte

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

Cobalah online!

Karena saya masih tidak tahu bagaimana cara mengirimkan string dengan spasi putih sebagai parameter input tunggal ke dalam kode Charcoal, saya hanya menetapkan di header string tes ke variabel Charcoal yang mewakili apa yang akan menjadi input pertama ( θ):

AA Quick Brown Fox Jumped Over The Lazy Dogθ

Jadi kode memiliki jumlah byte yang sama seolah-olah string dilewatkan sebagai input pertama.

Anda dapat melihat di sini versi verbose kode.

Charlie
sumber
1
Saya mengatakan dalam jawaban lain tapi kalau-kalau Anda lupa, hanya masukan sebagai array python dengan satu elemen
ASCII-satunya
Saya hanya memerlukan input untuk memiliki baris baru.
Neil
2

PHP, 181 byte

Saya mencoba mendapatkan sejumlah kecil byte, ini adalah kode saya:

<?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;

Cobalah online!

tidur
sumber
Alih-alih Konstan PREG_OFFSET_CAPTUREAnda dapat menggunakan nilai 256, $argnadalah variabel yang lebih pendek readline()untuk input dan saya pikir ctype_upperdan penggunaan lcfirstdan ucfirstakan menghemat banyak byte dengan satu loop dan penggunaan $$idan operator ternary
Jörg Hülsermann
2

Java 8, 184 177 161 byte

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;}

Pasti bisa bermain golf lagi ..
- 16 byte berkat @ OlivierGrégoire dengan mengambil input sebagai char[]gantinya String.

Penjelasan:

Coba di sini.

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
Kevin Cruijssen
sumber
1
Ambil char[]alih - alih String untuk yang ini, Anda akan menghemat banyak byte!
Olivier Grégoire
Di sisi lain, saya juga menjawab dengan algoritma lain. Dan di sini, saya mengambil argumen yang berlawanan: in = String, out = char[]:-)
Olivier Grégoire
2

Common Lisp, 104 byte

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

Cobalah online!

Singkat biasa untuk Common Lisp yang bertele-tele!

Kode sederhana:

(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)))
Renzo
sumber
2

Java (OpenJDK 8) , 150 117 113 97 byte

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

Cobalah online!

Sambil bermain golf lebih banyak, saya mencapai 102 byte:

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++);}

Cobalah online!

Tapi aku ingat ini mulai terlihat seperti jawaban Dennis C, jadi aku hanya mem-porting-kan dan ... sihirnya terjadi. Keuntungan besar dari port adalah menghapus cabang dan pengulangan di dalamnya.

Olivier Grégoire
sumber
@ceilingcat yang tidak berfungsi: Hi! Test!seharusnya menjadi Hi!tEst!, tetapi dengan solusi Anda, itu menjadi Hi!Test.
Olivier Grégoire
2

Google Sheets, 213 byte

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

Input ada di sel A1dan rumusnya rusak seperti ini:

  • ArrayFormula()mari kita evaluasi setiap istilah ROW()secara independen
  • JOIN() menggabungkan semua hasil independen menjadi satu string
  • IF(REGEXMATCH(),UPPER(),LOWER() adalah apa yang membuatnya bergantian menggunakan huruf besar atau kecil tergantung pada apa kasus itu pada posisi itu di input
  • ROW(OFFSET())mengembalikan array nilai 1ke A1.lengthyang dapat dimasukkan ke dalam MID()fungsi sehingga kami dapat mengevaluasi setiap karakter secara bergantian

Hasil dari kasus uji: (Lebih mudah dibaca jika Anda mengklik versi yang lebih besar.)

TestCases

Toast insinyur
sumber
2

Ruby , 80 byte

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

Cobalah online!

Alex
sumber
Anda dapat menyimpan beberapa byte dengan menggunakan n.gsub(/./){}bukan n.size.times{};n: n.gsub(/./){(?A..?Z)===a[i]?$&.upcase: $&}.
Jordan
2

Perl, 92 byte

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

Penjelasan:

$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) :)
jmatix
sumber
1
Selamat datang di PPCG! :)
Stephen
Anda perlu menambahkan -ntanda agar jawaban Anda valid. Beberapa hal bermain golf: s/ //gsudah cukup (tidak perlu \s), y/a-z/A-Z/sama dengan tr[a-z][A-Z], Anda bisa menggunakan -pflag sehingga Anda tidak perlu yang terakhir print, Anda tidak perlu tanda kurung masuk lc$&.
Dada
1

C, 103 byte

i,j,c;f(char*s){for(i=j=0;c=tolower(s[j++]);)c-32&&putchar(c-32*(s[i]>64&&s[i]<91&&c>96&&c<123))&&++i;}

Cobalah online!

Steadybox
sumber
1

Python 3 , 125 , 124 byte

lambda s:''.join(c.upper()if i in(s.find(q)for q in s if q.isupper())else c for i,c in enumerate(s.replace(' ','').lower()))

Cobalah online!

Christian Dean
sumber
1

Python 2, 106 105 byte

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

Sunting: simpan satu byte melalui print ''.join=>print''.join .

Formulir Lambda, 99 byte

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

SCALA, 128 karakter, 128 byte

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

Terima kasih atas tantangan ini. Cobalah online!

V. Courtois
sumber
1

q / kdb +, 49 byte

Larutan:

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

Contoh:

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"

Penjelasan:

Temukan indeks di mana input huruf besar dan kemudian terapkan fungsi upperpada indeks itu pada versi kecil dari string input. Perhatikan bahwa kami tidak dapat menerapkan fungsi di luar panjang string, jadi gunakan take ( #) untuk memotong string input hingga panjang huruf kecil, versi yang dihapus dengan spasi.

{@[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:

Setelah membaca jawaban, saya pikir saya akan mencoba solusi di mana saya mengulangi input, sejauh ini saya hanya mengelola solusi 53 byte:

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

Swift 3.0, 199 byte

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

Cobalah secara Online!

A. Pooja
sumber
1

Perl 5 , 40 byte

37 byte kode + -Fbendera. (perhatikan bahwa pada versi Perl yang lama, Anda mungkin perlu menambahkan -anflag)

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

Cobalah online!

Penjelasan:
Terima kasih -F, @Fberisi daftar setiap karakter input.
for/\S/giterates atas setiap karakter non-spasi input. Kami menggunakan $iuntuk menghitung di mana iterasi kami. Jika $F[$i++]karakter huruf besar ( /[A-Z]/), maka kami mencetak karakter huruf besar saat ini ( uc), jika tidak, kami mencetak huruf kecil ( lc). Catat itu ucdan lckembalikan argumennya tidak berubah jika itu bukan surat.


Versi sebelumnya (kurang golf: 47 byte):

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

Cobalah online!

Dada
sumber