Buat Merah dan Hitam Anda sendiri

9

Dalam membawakan musik Les Miserables, sebuah lagu muncul berjudul "Red and Black." Ini bagian dari lagu itu:

Merah - darah orang-orang yang marah!

Hitam - kegelapan zaman lampau!

Merah - dunia yang akan terbit!

Hitam - malam yang akhirnya berakhir!

Sumber.

Tugas Anda adalah mengubah input menjadi lagu "Merah dan Hitam" yang mantap.

Memasukkan

Teks dibatasi oleh baris baru, atau input teks yang cocok serupa. Sebagai contoh,

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

Input kosong tidak terdefinisi (di luar ruang lingkup).

Keluaran

Jika panjang (jumlah baris, atau panjang array input, atau serupa) dari input tersebut ganjil, baik output nothing atau output falsey. Kiriman Anda mungkin tidak menghasilkan kesalahan atau mencoba untuk menghasilkan output yang benar.

Jika tidak, ubah input menjadi lirik Merah / Hitam. Ubah huruf besar apa pun di awal baris menjadi huruf kecil. Tambahkan Redplus pembatas di depan garis ganjil, dan Blackditambah pembatas (terlihat) ke depan garis genap. Pembatas juga harus dikelilingi dalam ruang-ruang, sehingga keluarannya terlihat tidak berbingkai (dan tidak ditandai;)).

Anda sekarang memiliki hasil Anda.

Uji Kasus

Pembatas keluaran adalah -.

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!
Stephen
sumber
Dengan "atau panjang inputnya ganjil", apakah Anda berbicara tentang garis atau karakter?
Tutleman
@Tutleman jumlah baris, saya akan mengklarifikasi
Stephen
3
Saya pikir tantangan ini tidak apa-apa, tetapi secara umum, membuat pengiriman menangani input yang tidak benar tidak benar-benar menambah banyak . Hanya untuk referensi di masa mendatang.
James
@DJMcMayhem karena tidak ada jawaban, saya akan membuat input kosong tidak terdefinisi - lebih masuk akal, terima kasih (saya ingin menyimpan input panjang yang aneh seperti ini)
Stephen

Jawaban:

4

05AB1E , 26 byte

Kode:

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

Menggunakan penyandian 05AB1E . Cobalah online!

Penjelasan:

|                               # 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
Adnan
sumber
5

V , 31 , 30 byte

êuòIRed - 
IBlack - 
òñFRdH

Cobalah online!

Hexdump:

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

Ini sepele dalam V, tetapi kasus tepi input ganjil membuatnya rumit karena V tidak benar-benar memiliki persyaratan. Untungnya, kami dapat menangani ini dengan biaya +6byte yang relatif kecil .

James
sumber
5

Haskell , 104 120 113 112 112 110 byte

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

Cobalah online!

Tidak diganggu dengan penjelasan

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

fadalah fungsi yang mengambil daftar string (alias daftar daftar Chars), dan mengembalikan Maybeyang sama. Fungsi Haskell cukup "murni", jadi kami harus menjelaskan bahwa fungsi ini mungkin tidak mengembalikan apa pun. (Fungsi tipe Maybe amengembalikan salah satu Nothingatau Just a).

The |operator adalah penjaga - semacam bersyarat. Cabang pertama diikuti jika even $ length $ x(yang merupakan cara penulisan lain even (length x)) True. Kalau tidak, yang kedua ( 1<2dalam contoh golf, yang tentu saja selalu benar) diikuti dan kami kembali Nothing.

zipWithmengambil fungsi dua argumen dan menerapkannya ke setiap elemen dari dua daftar. Fungsi yang kami gunakan di sini adalah \(h : t) x -> x ++ toLower h : t. h : tsecara implisit memisahkan karakter pertama dari argumen pertama kami, yang merupakan jenis hal baik yang dapat Anda lakukan di Haskell. Daftar pertama adalah input (yang sudah kita ketahui mengandung jumlah garis genap), dan yang kedua hanya secara bergantian bolak-balik "Merah -" dan "Hitam -" (daftar tak terbatas adalah hal baik lain yang mungkin, kali ini karena Haskell adalah lazy - hanya peduli sebanyak yang Anda gunakan).

obat mujarab
sumber
(h:t)!x=x++toLower h:tmenghemat beberapa byte.
Laikoni
Mengganti kedua case menghemat byte lain:f x|odd$length$x=Nothing|1<2=Just ...
Laikoni
@Laikoni terima kasih untuk ini! Saya cukup baru di Haskell dan ini adalah pertama kalinya saya bermain golf di dalamnya - dan saya sangat menyukainya!
felixphew
memptymenghemat 1 byte dibandingkan dengan Nothing!
bartavelle
Anda dapat menyimpan byte lain dengan mendefinisikan c="Red - ":"Black - ":cdan menggunakan calih-alih cycle["Red - ","Black - "]: Coba online!
Laikoni
3

Jelly , 29 byte

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

Program lengkap.
Menggunakan opsi keluaran "falsey" untuk input dengan jumlah garis ganjil.

Cobalah online!

Bagaimana?

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.
Jonathan Allan
sumber
3

Japt , 36 35 34 byte

Output 0untuk false. Termasuk yang tidak diinginkan setelah yang kedua R.

èR u ©¡[`R Black`¸gY '-XhXg v]¸}R

Cobalah online

Shaggy
sumber
3

C, 112 107 105 103 99 byte

-4 Terima kasih untuk ASCII-hanya
-2 terima kasih kepada 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);}

Mengambil "array" sebagai input. Contoh:

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!

Bagaimana itu bekerja

  • i menciptakan variabel i luar semua fungsi, yang berarti secara otomatis diinisialisasi ke 0.
  • main(a,s)char**s;{ mendeklarasikan fungsi utama, yang membutuhkan dua argumen - an int a (# argumen baris perintah), dan char ** s(array argumen baris perintah).
  • for(;a%2&++i<a;)adalah loop yang memeriksa apakah agenap (a%2 ) dan jika kurang dari jumlah argumen baris perintah yang dilewati ( i<a).
  • printf("%s - %c%s\n",i%2"Red":"Black",tolower(*s[i]),s[i]+1 cetakan:
    • "Merah" jika ianeh, "Hitam" jikai genap ( i%2?"Red":"Black")
    • Huruf pertama argumen baris perintah saat ini dalam huruf kecil (tolower(*s[i]) )
    • String, tanpa huruf pertama ( s[i]+1)

Cobalah online!

MD XF
sumber
Variabel global diinisialisasi default, sehingga Anda dapat menghilangkan =0bagian untuk menyimpan 2 byte lebih.
Cody Gray
@CodyGray Oh ya, terima kasih!
MD XF
2

Röda , 97 byte

f a{seq 0,#a-1|[_,a[_1]/""]|[["Red","Black"][_%2],` - `,lowerCase(_[0]),_2[1:]&"",`
`]if[#a%2<1]}

Cobalah online!

pengguna41805
sumber
1

Jelly , 30 byte

LḂṆẋ@Ỵµ“ZœĠk»ḲṁL;€“ - ”żŒl1¦€Y

Cobalah online!

Erik the Outgolfer
sumber
1

CJam, 41 byte

qN/{(el\+}%2/"Red - 
Black - "N/f.\:~2/N*
Buah Esolanging
sumber
1

JavaScript (ES6), 93 byte

Mengambil lagu sebagai array garis.

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

Darrylyeo
sumber
@ Stephen-S apakah input ini dianggap valid?
Vitim.us
1

Python 2 , 215-> 184-> 165 byte

Disimpan 31 byte sesuai dengan komentar Stephen S.

Challenger5 mendapatkannya hingga 165 byte

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:]

Cobalah online!

LMD
sumber
Bisakah Anda menghemat beberapa byte dengan menggunakan spasi tunggal untuk indentasi? Saya tidak begitu mengenal Python, tetapi saya pikir itu berhasil
Stephen
@Stephen S: Ya, saya pikir Anda benar.
LMD
1

Javascript, 118 byte

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

Uji

Vitim.us
sumber