独自の赤と黒を作成する


9

レミゼラブルの音楽的な演奏では、「赤と黒」と呼ばれる曲が登場します。ここにその曲の一部があります:

赤-怒れる男の血!

ブラック-昔の暗闇!

赤-明け方の世界!

ブラック-ついに終わる夜!

ソース。

あなたの仕事は、入力を鳴り響く「赤と黒」の国歌にすることです。

入力

改行で区切られたテキスト、または同様の適切なテキスト入力。例えば、

The blood of angry men!
The dark of ages past!
A world about to dawn!
The night that ends at last!

空の入力は未定義です(範囲外)。

出力

入力の長さ(行数、入力配列の長さなど)が奇数の場合、何も出力しないか、誤って出力します。あなたの提出物はエラーを出力しないか、正しい出力を出力しようとしないかもしれません。

それ以外の場合は、入力をRed / Black歌詞に変更します。行頭の大文字を小文字に変換します。Red奇数行の前にプラス区切り文字を追加し、偶数行の前にBlack(可視)区切り文字を追加します。区切り文字もスペースで囲む必要があるため、出力は混雑していないように見えます(そしてゴルフされていません;))。

これで出力が得られました。

テストケース

出力区切り文字は-です。

In:
The blood of angry men!
The dark of ages past!
A world about to dawn!
The night that ends at last!

Out:
Red - the blood of angry men!
Black - the dark of ages past!
Red - a world about to dawn!
Black - the night that ends at last!

In:
test test
1
[][][]
BBB

Out:
Red - test test
Black - 1
Red - [][][]
Black - bBB

In:
I feel my soul on fire!
The color of desire!
The color of despair!
Out:
falsey OR nothing

In:
Red - I feel my soul on fire!
Black - My world if she's not there!

Out:
Red - red - I feel my soul on fire!
Black - black - My world if she's not there!


「または入力の長さが奇妙です」ということで、あなたは線や文字について話しているのですか?
Tutleman、

@Tutlemanの行数、明確にします
Stephen

3
このチャレンジはそのままでも大丈夫だと思いますが、一般的には、送信で無効な入力を処理しても、それほど効果はありません。将来の参考のために。
ジェームズ

@DJMcMayhem回答がなかったので、空の入力を未定義にします-理にかなっています、ありがとう(奇数長の入力をそのままにしておきたい)
Stephen

回答:


4

05AB1E、26バイト

コード:

|©v”†¾ƒÏ”#Nè… - yćlìJ®gÈ×,

05AB1Eエンコーディングを使用します。オンラインでお試しください!

説明:

|                               # Take the input as an array of inputs
 ©                              # Keep a copy of this in the register
  v                             # Map over the array
   ”†¾ƒÏ”#                      #   Push the array ["Red", "Black"]
          Nè                    #   Get the Nth element (where N is the iteration index)
            … -                 #   Push the string " - "
                yć              #   Push the current element and extract the first element
                  lì            #   Convert to lowercase and prepend back to it's
                                    original place
                    J           #   Join the entire stack into a single string
                     ®g         #   Get the length of the input
                       È        #   Check if it is even (results in 1 or 0)
                        ×       #   String multiply the result by the string
                         ,      #   Pop and print with a newline

5

V31、30のバイト

êuòIRed - 
IBlack - 
òñFRdH

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

Hexdump:

00000000: 16ea 75f2 4952 6564 202d 201b 0a49 426c  ..u.IRed - ..IBl
00000010: 6163 6b20 2d20 1b0a f2f1 4652 6448       ack - ....FRdH

これはVでは取るに足らないことですが、奇数の入力のエッジケースは、Vが実際に条件を持たないため、トリッキーになります。ありがたいことに、比較的少ない+6バイト数でこれを処理できます。


5

ハスケル104の 120 113 112 111 110バイト

import Data.Char
f x|odd$length$x=mempty|1<2=Just$zipWith(\(h:t)x->x++toLower h:t)x$cycle["Red - ","Black - "]

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

説明なしのゴルフ

import Data.Char

f :: [String] -> Maybe [String]
f x
  | even $ length $ x = Just $ zipWith (\(h : t) x -> x ++ toLower h : t) x $ cycle ["Red - ","Black - "]
  | otherwise         = Nothing

f文字列のリスト(別名Charsのリストのリスト)を取り、それを返す関数ですMaybe。Haskellの関数は非常に「純粋」であるため、この関数が何も返さない可能性があることを明確にする必要があります。(タイプの関数はまたMaybe aはのいずれNothingかを返しますJust a)。

|条件の種類-演算子は、ガードです。even $ length $ x(これは別の書き方ですeven (length x))の場合、最初のブランチが続きTrueます。それ以外の場合は、2番目(1<2ゴルフの例では、もちろん常にtrueです)に従い、に戻りNothingます。

zipWith2つの引数を持つ関数を取り、2つのリストの各要素に適用します。ここで使用している関数はです\(h : t) x -> x ++ toLower h : th : t最初の引数から暗黙的に最初の文字を分割します。これは、Haskellで実行できる一種の素晴らしいことです。最初のリストは入力です(すでにわかっているように、行数は偶数です)。2番目のリストは、「Red-」と「Black-」が無限に交互に入れ替わっています(無限リストも可能です。今回はHaskellがレイジー-それはあなたが使うのと同じくらい多くのものだけを気にします)。


(h:t)!x=x++toLower h:tいくつかのバイトを節約します。
ライコニ2017年

2例の切り替えは別のバイトを保存しますf x|odd$length$x=Nothing|1<2=Just ...
Laikoni

@Laikoniこれらに感謝!私はHaskellにかなり慣れていません。初めてゴルフをするのはこれが初めてです。本当に気に入っています。
felixphew

memptyと比較して1バイト節約しNothingます!
bartavelle 2017年

あなたは定義することによって、別のバイトを保存することができますc="Red - ":"Black - ":cし、使用してcの代わりcycle["Red - ","Black - "]オンラインそれをお試しください!
Laikoni

3

ゼリー、29 バイト

0
“ZœĠk»ḲṁJżj€“ - ”Y
ỴŒl1¦€LĿ

完全なプログラム。
奇数の行を持つ入力に対して「false」出力オプションを使用します。

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

どうやって?

0 - Link 1, return a falsey value: no arguments
0 - well, yeah, zero - that's falsey.

“ZœĠk»ḲṁJżj€“ - ”Y - Link 2, format the lines: list of lists of characters, the lines
“ZœĠk»             - "Red Black"
      Ḳ            - split at spaces -> ["Red","Black"]
        J          - range(length(lines)) -> [1,2,3,...,nLines]
       ṁ           - mould -> ["Red","Black","Red","Black",...,"Red","Black"]
         ż         - zip with lines -> [["Red",l1],["Black",l2],...]
            “ - ”  - " - " (really I cant find any save :/)
          j€       - join for each -> ["Red - l1","Black - l2",...]
                 Y - join with newlines

ỴŒl1¦€LĿ - Main link: string
Ỵ        - split at newlines
   1¦€   - apply to index 1:
 Œl      -   convert to lower case
       Ŀ - call link at index:
      L  -   length - Note: this is modular, so:
         -                  link 2 is called for even, and
         -                  link 1 is called for odd.


3

C、112の 107 105 103 99バイト

-4 ASCIIのみのおかげ
-2 Megoのおかげで

i;main(a,s)char**s;{for(;a%2&++i<a;)printf("%s - %c%s\n",i%2?"Red":"Black",tolower(*s[i]),s[i]+1);}

「配列」を入力として受け取ります。例:

bash$ ./a.out "The blood of angry men!" "The dark of ages past!" "A world about to dawn!"
bash$ ./a.out "The blood of angry men!" "The dark of ages past!" "A world about to dawn!" "The night that ends at last!"                                                 
Red - the blood of angry men!
Black - the dark of ages past!
Red - a world about to dawn!
Black - the night that ends at last!

使い方

  • iiすべての関数の外側に変数を作成します。つまり、変数は自動的に0に初期化されます。
  • main(a,s)char**s;{2つの引数を取るメイン関数を宣言します- int a(コマンドライン引数の数)とchar ** s(コマンドライン引数の配列)。
  • for(;a%2&++i<a;)a偶数かどうか(a%2)、渡されたコマンドライン引数の数()より小さいかどうかを確認するループですi<a
  • printf("%s - %c%s\n",i%2"Red":"Black",tolower(*s[i]),s[i]+1 プリント:
    • i奇数の場合は「赤」、偶数の場合は「黒」ii%2?"Red":"Black"
    • 現在のコマンドライン引数の最初の文字(小文字tolower(*s[i])
    • 文字列、最初の文字なし(s[i]+1

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


グローバル変数はデフォルトで初期化さ=0れるため、パートを省略してさらに2バイトを節約できます。
コーディグレイ

@CodyGrayそうそう、ありがとう!
MD XF





1

JavaScript(ES6)、93バイト

曲を行の配列として受け取ります。

S=>S.length%2?0:S.map((L,i)=>(i%2?'Black':'Red')+' - '+L[0].toLowerCase()+L.slice(1)).join`
`


@ Stephen-Sこの入力は有効と見なされますか?
Vitim.us 2017年

1

Python 2、215-> 184-> 165バイト

Stephen Sのコメントによると31バイトを節約

チャレンジャー5はそれを165バイトに減らしました

l=[]
b=["Red","Black"]
d=" - "
while 1:
 a=raw_input()
 if a:l.append(a)
 else:break
q=len(l)
if q%2<1:
 for i in range(q):n=l[i];print b[i%2]+d+n[0].lower()+n[1:]

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


インデントに単一のスペースを使用していくつかのバイトを節約できますか?私はPythonをよく知りませんが、うまくいくと思います
Stephen

@Stephen S:はい、あなたは正しいと思います。
LMD


1

JavaScript、118バイト

v=s=>(s=s.split`\n`).length%2==0?s.map((l,i)=>(i%2==0?'Red':'Black')+' - '+l[0].toLowerCase()+l.substr`1`).join`\n`:!1

テスト

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