このように印刷


17

STDINへの入力を受け取り、2k-1thワードのすべての小文字(アクセント付き文字を含む)を大文字にし、2kthワードの小文字(アクセント付き文字も含む)をすべて小文字(k正の整数)にするプログラムを作成します。プログラムは、どの単語の他の文字にも影響を与えません。たとえば、文字列がの場合Ook! O0k!、出力はになりますOOK! o0k!

空白以外の文字の後に空白がゼロ以外の量があると、新しい単語が形成されます。入力の先頭の空白は無視する必要があります。単語に変更された文字が含まれていない場合、プログラムはそれを単語とみなして続行します。

サンプル入力(異なる入力は空白の改行で区切られます)

Nineteen Eighty-Four (1984)

Programming Puzzles & Code Golf   - 
Hooray for Code Golf Stack Exchange!

     2be or not 2be, that is the ~~~QuEsTiOn~~~

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

サンプル出力

NINETEEN eighty-four (1984)

PROGRAMMING puzzles & code GOLF   - 
HOORAY for CODE golf STACK exchange!

     2BE or NOT 2be, THAT is THE ~~~question~~~

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

これはコードゴルフです。標準のCGルールが適用されます。バイト単位の最短プログラムが優先されます。


空白と文字以外の文字に関する抜け穴をすべてカバーしたと確信していますが、もし見逃した場合は教えてください。


次のコードスニペットを作成してくれた@Optimizerに感謝します。使用するには、[コードスニペットを表示]をクリックし、一番下までスクロールして[►コードスニペットを実行]をクリックします。


5
アクセント文字はどうですか?それらを無視する必要がありますか?機能は許可されていますか?
ダウンゴート

質問を書いたとき、アクセント文字を念頭に置いていませんでしたが、数えると思います。機能が許可されています。
アークトゥルス

どの空白文字を考慮する必要がありますか?非空白文字が印刷可能になると想定できますか?
デニス

すべての空白文字、およびはい。
アークトゥルス

回答:


4

Vimスクリプト、22 21バイト

nm Q vEUWvEuWQ|norm Q

説明:

最初のコマンドは次のものにマッピングさQれます。

vEU単語を大文字
Wにして次の単語に移動
vEuする単語を小文字
Wにして次の単語に移動する
Q再帰的マッピングを繰り返す

|norm Qマッピングを実行します

プログラムの使用法

これは、Vimがstdinから読み取る方法です。

$ vim - -c 'nm Q vEUWvEuWQ|norm Q'
Vim: Reading from stdin
This is the first line!
This is the second line!
This is the third and last line I type to check if this works!
^D

これにより、Vimが開き、次が表示されます。

THIS is THE first LINE.
this IS the SECOND line.
THIS is THE third AND last LINE i TYPE to CHECK if THIS works!
~
~
~

6

GNU sed、28

スコアには-rz、GNU sedに渡される+2が含まれます。

s/(\S+\s*)(\S*)/\U\1\L\2/g

テスト出力

$ for t in 'Nineteen Eighty-Four (1984)' \
> 'Programming Puzzles & Code Golf   - 
> Hooray for Code Golf Stack Exchange!' \
> '     2be or not 2be, that is the ~~~QuEsTiOn~~~' \
> '++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.'; do
> echo "$t" | sed -zrf PRINTlikeTHIS.sed
> done
NINETEEN eighty-four (1984)
PROGRAMMING puzzles & code GOLF   - 
HOORAY for CODE golf STACK exchange!
     2BE or NOT 2be, THAT is THE ~~~question~~~
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
$ 

5

Perl、26バイト

25バイトのコード+ 1バイトのコマンドライン

s/\S+/++$i%2?uc$&:lc$&/eg

いくつかのバグを修正してくれたThisSuitIsBlackNotに感謝します!

使用法:

perl -p entry.pl

3

Pyth、23

jdmjbmrk=xZ!!kcdbcjb.zd

オンラインで試すか、テストスイートを実行する

pythの機能lowerupper機能の代替、r...0またはr...1です。これはおそらくユニコード文字に影響し、OPの説明が変更されるのを待っています。

私は何かがゴルフに耐えなければならないように感じます。特に、upper/ lowerを使用するスイッチを変更するXOR 。


質問を正しく解釈した場合、入力A\nBは印刷されますA\nb
デニス

それは質問の正しい解釈ではありません。A new word is formed when there is a nonzero amount of whitespace after a non-whitespace character.の出力はA\nBですA\NB。しかし、CJAMの答えは正しかったようです。
アークトゥルス

@Dennisに感謝、今すぐ修正する必要があります。
FryAmTheEggman

2

Perl、87バイト

正規表現と map、私はエレガントなソリューションを思い付くことができなかったので、これが結果です:

@a=split(" ",lc(<>));while($i<=$#a/2){@a[$i*2]=uc(@a[$i*2]);$i++;}print(join(" ", @a));

1
いい解決策。数バイトを節約するために、<STDIN>を<>に置き換えることができますか?また、$ i = 0をスキップできますか?
スティーブ

@steveありがとう。そして、はい、マイナーな修正(異なる入力でテストし、小さなエラーがありました)とともに含まれるようになりました。アイデアをありがとう!冗長で明示的なコーディングに非常に慣れています:P
Codefun64

1
@ Codefun64 PPCGへようこそ!Perlではオプションであるため、より多くのバイトを節約するために、ほとんどの括弧をスキップできます。lc(<>)lc<>ステートメント修飾子を使用してwhile、括弧をスキップすることもできます。print$i++while$i<10while($i<10){print$i++}。私をたくさん助けた便利なページがありますPerlでゴルフのためのヒント
ドムヘイスティングス


2

JavaScript ES6、 74の 71バイト

.toUpperCase()そして.toLowerCase()、バイトカウントを完全に虐殺します(32バイト0.oを追加します)。ほとんどの回避策はより多くのバイトになります

s=>s.replace(/(\S+\s*)(\S*)/g,(_,a,b)=>a.toUpperCase()+b.toLowerCase())

1

グルービー、108 125 120

System.in.eachLine{def b;it.split(" ").any{if(!it.empty)b=!b;print "${b?it.toUpperCase():it.toLowerCase()} "};println()}

期待していたほどきれいではありません。これは、Groovyの回答のテーマのようです。

  • +17は、先頭の空白の動作を修正します
  • -5末尾の改行を削除し、.isEmpty()から.emptyに切り替える

 

$ cat tests.txt 
Nineteen Eighty-Four (1984)

Programming Puzzles & Code Golf   - 
Hooray for Code Golf Stack Exchange!

     2be or not 2be, that is the ~~~QuEsTiOn~~~

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
$ groovy PRINTlikeTHIS.groovy < tests.txt 
NINETEEN eighty-four (1984) 

PROGRAMMING puzzles & code GOLF   - 
HOORAY for CODE golf STACK exchange! 

     2BE or NOT 2be, THAT is THE ~~~question~~~ 

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++. 

1

Lua、96バイト

i=0 print(io.read'*l':gsub('%S+',function(x)i=i+1 return i%2==1 and x:upper() or x:lower()end))

これにより、出力後に数値が出力されます。
トレブシェット

1

Python 3、103 95バイト

print(' '.join(b.lower()if a%2 else b.upper()for a,b in enumerate(input().strip().split(' '))))

[b.upper(),b.lower()][a%2]4バイトを節約するために条件付きを置き換えることができます(モバイルで正しくカウントしたと仮定)。
-PurkkaKoodari

1

STATA、252バイト

insheet using a.b
g b=word(v,1)
gl c=0
forv x=1/`=_N'{
loc d=1
while b[`x']!=""{
if !$c replace v=subinword(v,b,upper(b),1) if `x'==_n
if $c replace v=subinword(v,b,lower(b),1) if `x'==_n
loc ++d
replace b=word(v,`d') if `x'==_n
gl c=1-$c
}
di v[`x']
}

abと呼ばれるcsvファイル(1列)として入力を期待します

説明:

データを読み込みます(デフォルトの変数名はv1、vに短縮可能)。各行のvの最初の単語(スペースで区切られたトークン)と等しい新しい変数bを作成します。各行について、次の単語は空ではありませんが(その行に文字がもうない場合にのみ発生します)、vの単語を、現在の行の単語の大文字または小文字のバージョンに置き換えます(mod 2 )単語はすでに見つかっています。次に、次の単語を取得して繰り返します。終了したら、行全体を印刷します。


1

Delphi、290バイト

program P;uses SysUtils;var s:string;i:word;w:byte;f:boolean;begin repeat readln(s);w:=0;f:=false; for I:=1 to length(s) do begin if s[i]>' ' then begin if w=0 then f:=not f;w:=1;if f then s[i]:=uppercase(s[i])[1] else s[i]:=lowercase(s[i])[1] end else w:=0 end;writeln(s)until false;end.

ゴルフをするのに本当に良い言語ではありません...


プログラミングパズルとコードゴルフへようこそ!
デニス


1

CJam、28バイト

q{C' >Sc'!<*X^:XCelCeu?:S}fC

現在、最初の33個のASCII / Unicode文字(およびこれらの文字のみ)の空白を検討しています。これが有効かどうかを知るための明確化を待っています。

CJamインタープリターでオンラインで試してください。



0

C位、104の 100 99バイト

static void Main(){string.Join(" ","".Split(' ').Select((o,i)=>i++%2==0?o.ToUpper():o.ToLower()));}

79バイトです。

string.Join(" ","".Split(' ').Select((o,i)=>i++%2==0?o.ToUpper():o.ToLower()));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.