スペースの削除、大文字の使用の維持


27

入力は、英語の文、フレーズ、または単語になります。のみが含まれますa-zA-Z' -,.!?。タスクは、入力を取得し、スペースを削除してから、大文字を再配分して、前に大文字にされたインデックスの文字(および前に大文字にされたインデックスの文字のみ)が大文字になるようにします。

たとえば、入力がの場合、A Quick Brown Fox Jumped Over The Lazy Dog大文字の(0から始まる)インデックスは0, 2, 8, 14, 18, 25, 30, 34, 39です。次に、入力からスペースを削除しますAQuickBrownFoxJumpedOverTheLazyDog。次に、すべての文字を小文字にしますが、0, 2, 8, 14, 18, 25, 30, 34, 39:の大文字AqUickbrOwnfoxJumpEdovertHelazYdogは出力です。

入力

入力は、英語の文、フレーズ、または単語になります。小文字、大文字、ハイフン、アポストロフィ、コンマ、ピリオド、疑問符、感嘆符、スペースのみを含めることができます。

出力

入力が大文字のdの大文字のインデックスにある文字で、スペースが削除された小文字のdの入力。

注:IndexOutOfRangeまたは同様のエラーでプログラムをクラッシュ(実行が終了するエラー)することはできません。

テストケース

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


'たとえば、入力が「0, 2, 8, 14, 18, 23, 27, 320, 2, 8, 14, 18, 25, 30, 34, 39

@LukeSawczakありがとう、私の悪い
スティーブン

トレーリングスペースは許可されていません。
ルイスメンドー

@LuisMendoあなたの仮定は正しいです。これはコードゴルフですよね?:P
スティーブン

回答:


7

ゼリー14 13バイト

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

オンラインでお試しください!

使い方

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バイト

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

オンラインでお試しください!

同等:

Python 2、114バイト

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

オンラインでお試しください!


''.join([(X[i].lower,X[i].upper)[x[i].isupper()]()for i in range(len(X))])-5バイトの場合。
-ovs

5

Pythonの378 75 72バイト

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

6バイトのゴルフをしてくれた@xnorに感謝します!

オンラインでお試しください!


s代わりに比較できますs[0]か?
xnor

はい、もちろん。ありがとう!
デニス

1
(c*2).title()切り替えられますが、両方のケースを取得できます。
-xnor

さらに3バイト。再度、感謝します!
デニス

トリッキー!にc>' '!=f()相当することを理解するためにしばらく時間がかかった(c>' ') and (' '!=f())
チャスブラウン

5

05AB1E15 14バイト

エミグナのおかげで-1バイト

ðKuvy¹Nè.lil}?

オンラインでお試しください!

ð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

スペースを削除した文字列を大文字にし、条件で小文字にすると、バイトを保存します。
エミグナ

5

ハスケル98 95 89 88 81バイト

@ name、@ nimi、@ Zgarb、および@Laikoniに感謝します。

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

ゴルフをしていない:

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

モバイル、しかし外見上では、フィルタを用いて、いくつかのバイトを保存することができますように(/ =」「)
ヘンリー

うん、確かにできます。スペースを削除する必要がある唯一の空白であることに注意して、仕様の一部を見落としました。
ジュリアン・ウルフ

1
filter(>' ')1バイト未満
nimi

2
ラムダの本体を短縮できると思うlast(toLower:[toUpper|isUpper p])c
-Zgarb

の引数を切り替えると、zipWithもう1バイト節約できますf s=zipWith(\p->last$toLower:[toUpper|isUpper p])s$filter(>' ')s
ライコニ

4

V、24バイト

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

オンラインでお試しください!

この種の課題は、まさにVの目的です。:)

説明:

Ä           " 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良い質問です!改行は、置換(削除)または検索コマンドなどの正規表現コマンドの終了を示します。詳細はこのページにあります:github.com/DJMcMayhem/V/wiki/Regexes
DJMcMayhem

4

Python 2、100バイト

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

3
PPCGへようこそ。最初の回答は非常に良いです。
-ETHproductions

3

アリス、32バイト

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

オンラインでお試しください!

説明

これは、完全に順序モードで動作するプログラムの標準テンプレートです。ラップされていないプログラムは次のとおりです。

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バイト

s=>s.replace(/./g,c=>c==" "?"":c[`to${"@"<s[x]&s[x++]<"["?"Upp":"Low"}erCase`](),x=0)
  • ETHproductions&Arnauldの支援により6バイトが節約されました。

それを試してみてください

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>



できますか'@'<s[i]&s[i]<'['?
-ETHproductions

@StepHen:ああ、昨夜、私がこれに取り組んでいる間、あの人は見なかった。
シャギー

@ETHproductions:それはもっと短いかもしれないと思っていましたが、私は使用する必要がある文字を検索するのが面倒でした:D ありがとう。
シャギー

3

網膜77 71バイト

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

T`l `L_` .?

オンラインでお試しください!リンクにはテストスイートが含まれます。説明:最初のステージは行を複製し、2番目のステージは複製を小文字にしてスペースを削除します。次に、3番目のステージは、各大文字を右から左にループし、2行目の対応する文字の前にスペースを配置しようとします。最初の行は削除され、スペースは結果の関連文字を大文字にするために使用されます。編集:@Kobiのおかげで6バイト保存されました。


小さな質問:されています(.?)し、$4部品必要?末尾にオプションのグループが存在しても、何も実行されないようです。
コビ

@Kobiその質問について小さなことは何もありません!もともとは、ルックアラウンドを使用して、大文字に変換する文字を個別のステップとして翻訳する代わりに、一致させる試みの一部でした。
ニール

3

Perl、95 94 + 1 = 95バイト

-nに対する+1バイトのペナルティ

からs/\s//gに置き換えて1バイト節約s/ //g

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

オンラインでお試しください!

説明:

  1. 入力文字列のコピーを作成します。

  2. すべてのスペースを削除し、文字列を小文字に変換します。

  3. 次に、各文字のループを開始します。大文字の保存文字列の同じ位置にある文字をテストします。それが上部の場合-現在の文字を大文字にします。手紙を印刷します。

perlは「-n」コマンドラインスイッチで実行する必要があることに注意してください。


PPCGへようこそ!:あなたが希望する場合は、オンラインそれを試してリンクを追加することができますtio.run/#は(私はそれを追加することになりますが、これはPerl 5のやPerl 6である場合、私は知らない)
スティーブン・

1
フラグの+1バイトをカウントする必要があると思います-n。それ以外は、これはよさそうです!サイトへようこそ!:)
DJMcMayhem

@StepHenそれはPerl 5で、リンクを追加しますか?適切な方法でコードを実行できませんでした。
ファイトセル

新しいPerlゴルファーに会えてうれしい!TIOリンクを回答に追加し、フォーマットを改善しました。
ダダ


2

Python 3、117バイト

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

オンラインでお試しください!

これはほとんど私の最初のコードゴルフであるため、以下のコメントからの助けを除いて、悪い可能性があります!

PSはい、それは定義とインクリメントiがrange(len(y))を超えるバイトを節約するのは馬鹿げています。しかたがない。


1
PPCGへようこそ!素敵な最初の提出!ただし、当社のサイトのI / O規格に準拠するには、送信は文字列の関数であるか入力を行う必要があります。入力が変数にあると想定することはできません。ご滞在をお楽しみください!:)
HyperNeutrino

ありがとう。で関数を編集した、だけでなく、体内の5バイトの保存:D
ルークSawczak

1
@LukeSawczakは、インデントのために1つのスペースに変更することで、大量のバイトを節約し、Try It Onlineを追加するかもしれません!必要に応じてリンク
スティーブン

1
後にスペースを削除できreturnます。
電卓

@LukeSawczakどうですか?tio.run/...
スティーブン


2

、33バイト

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

オンラインでお試しください!

空白を含む文字列を1つの入力パラメーターとしてCharcoalコードに渡す方法がまだわからないので、ヘッダーで最初の入力(θ)を表すCharcoal変数にテスト文字列を割り当てます。

AA Quick Brown Fox Jumped Over The Lazy Dogθ

したがって、コードは、文字列が最初の入力として渡された場合と同じバイト数を持ちます。

ここでは、コードの詳細バージョンを見ることができます。


1
私は別の回答で述べたが、念のために、あなたは一つの要素で、Pythonの配列としてだけで入力を忘れて
ASCIIのみ

I just require the input to have a trailing newline.
Neil

2

PHP, 181 bytes

私はマイナーバイト数を取得しようとします、これは私のコードです:

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

オンラインでお試しください!


定数の代わりにPREG_OFFSET_CAPTUREこの値を使用することができ256$argnなど短い変数であるreadline()入力のためには、と私は思うctype_upperの使用lcfirstucfirst1つのループとを使用してバイトの多くが保存されます$$iし、三項演算子
イェルクHülsermann

2

Javaの8、184の 177 161バイト

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

間違いなく、いくつかのより多くのgolfedすることができます...
- 16のおかげでバイト@OlivierGrégoireを、入力を取ることによってchar[]代わりにString

説明:

ここで試してみてください。

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
Take a char[] instead of a String for this one, you'll save up plenty of bytes!
Olivier Grégoire

On the other hand, I answered too with another algorithm. And here, I take the opposite arguments: in = String, out = char[] :-)
Olivier Grégoire

2

Common Lisp, 104 bytes

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

Try it online!

Unusually short for the wordy Common Lisp!

Straightforward code:

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

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

Try it online!

While golfing more, I came to 102 bytes:

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

Try it online!

But I remembered this was starting to look like Dennis' C answer so I simply ported his bit-twiddling and... magic happened. The big gain from the port is removing the branches and the repetitions inside them.


@ceilingcat that doesn't work: Hi! Test! should become Hi!tEst!, but with your solution it becomes Hi!Test.
Olivier Grégoire

2

Google Sheets, 213 bytes

=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 is in cell A1 and the formula breaks down like this:

  • ArrayFormula() lets us evaluate each term of ROW() independently
  • JOIN() concatenates all those independent results into a single string
  • IF(REGEXMATCH(),UPPER(),LOWER() is what makes it alternate using upper or lower case depending on what the case was at that position in the input
  • ROW(OFFSET()) returns an array of values 1 to A1.length that can be fed into the MID() function so we can evaluate each character in turn

Results of test cases: (It's easier to read if you click though to the larger version.)

TestCases


2

Ruby, 80 bytes

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

Try it online!


You can save a couple bytes by using n.gsub(/./){} instead of n.size.times{};n: n.gsub(/./){(?A..?Z)===a[i]?$&.upcase: $&}.
Jordan

2

Perl, 92 bytes

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

Explanation:

$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
Welcome to PPCG! :)
Stephen

You need to add -n flag to make your answer valid. A few golfing things: s/ //g is enough (no need \s), y/a-z/A-Z/ is the same as tr[a-z][A-Z], you can use -p flag so you don't need the last print, you don't need the parenthesis in lc$&.
Dada



1

Python 2, 106 105 bytes

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

Edit: save one byte via print ''.join => print''.join.

Lambda form, 99 bytes

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

1

SCALA, 128 chars, 128 bytes

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

Thanks for this challenge. Try it online!


1

q/kdb+, 49 bytes

Solution:

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

Examples:

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"

Explanation:

Find indices where input is uppercase and then apply function upper to those indices on a lowercase, space-removed version of the input string. Note that we cannot apply the function beyond the length of the string, so use take (#) to truncate the input string to length of the lowercase, space-removed version.

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

After reading the answers, thought I'd try a solution where I iterate over the input, so far I've only managed a 53 byte solution:

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

1

Swift 3.0, 199 bytes

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

Try it Online!


1

Perl 5, 40 bytes

37 bytes of code + -F flag. (note that on old versions of Perl, you might need to add -an flags)

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

Try it online!

Explanations:
Thanks to -F, @F contains a list of every characters of the input.
for/\S/g iterates over every non-space character of the input. We use $i to count at which iteration we are. If $F[$i++] is an uppercase character (/[A-Z]/), then we print the uppercase current character (uc), otherwise, we print it lowercase (lc). Note that uc and lc return their argument unchanged if it isn't a letter.


Previous version (less golfed: 47 bytes):

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

Try it online!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.