Kendi Kırmızı ve Siyahınızı yaratın


9

Les Miserables'ın müzikal yorumunda "Kırmızı ve Siyah" adlı bir şarkı belirir. İşte bu şarkının bir parçası:

Kırmızı - kızgın erkeklerin kanı!

Siyah - geçmiş çağların karanlığı!

Kırmızı - şafak vakti bir dünya!

Siyah - sonunda biten gece!

Kaynak.

Göreviniz girdiyi yankılanan bir "Kırmızı ve Siyah" marşına dönüştürmektir.

Giriş

Yeni satırlarla ayrılmış metin veya benzer bir uygun metin girişi. Örneğin,

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

Boş giriş tanımsız (kapsam dışı).

Çıktı

Girişin uzunluğu (satır sayısı veya giriş dizisinin uzunluğu veya benzeri) garip ise, hiçbir şey çıktılamaz veya çıkış falseyidir. Gönderiminiz hatalar vermeyebilir veya doğru çıktıyı almaya çalışamaz.

Aksi takdirde, girişi Kırmızı / Siyah lirikine dönüştürün. Satırın başlangıcındaki tüm büyük harfleri küçük harfe çevirin. RedTek satırların önüne artı bir sınırlayıcı ve çift satırların önüne Blackbir (görünür) sınırlayıcı ekleyin . Sınırlayıcı ayrıca boşluklarla çevrelenmelidir, bu nedenle çıktı izsiz (ve çözülmemiş;)) görünür.

Artık çıktılarınız var.

Test Durumları

Çıkış sınırlayıcı -.

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!


"Veya girişin uzunluğu tuhaf" olarak satırlardan veya karakterlerden mi bahsediyorsunuz?
Tutleman

@Tutleman satır sayısı, açıklığa kavuşacağım
Stephen

3
Sanırım bu meydan okuma olduğu gibi Tamam, ama genel olarak, gönderimleri geçersiz giriş işlemek yapmak gerçekten çok eklemez . Sadece ileride başvurmak için.
James

@DJMcMayhem cevap olmadığı için boş girişi tanımsız yapacağım - daha mantıklı, teşekkürler (Tek uzunluk girişini olduğu gibi tutmak istiyorum)
Stephen

Yanıtlar:


4

05AB1E , 26 bayt

Kod:

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

05AB1E kodlamasını kullanır . Çevrimiçi deneyin!

Açıklama:

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

V , 31 , 30 bayt

êuòIRed - 
IBlack - 
òñFRdH

Çevrimiçi deneyin!

HexDump:

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

Bu V için önemsizdir, ancak garip girdilerin uç durumu onu zorlaştırır çünkü V gerçekten koşullu değildir. Neyse ki, bunu nispeten küçük +6bayt maliyetiyle halledebiliriz .


5

Haskell , 104 120 113 112 111 110 bayt

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

Çevrimiçi deneyin!

Açıklama ile başa çıkıldı

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, bir dize listesi (diğer bir liste listesi Char) Maybealan ve aynı döndüren bir işlevdir . Haskell'in işlevleri oldukça "saf" tır ve bu nedenle bu işlevin hiçbir şey döndürmeyebileceğini açıkça belirtmeliyiz. (Türün bir işlevi Maybe aya Nothingda döndürür Just a).

|Koşullu bir tür - operatörü bir bekçi olduğunu. İlk dal even $ length $ x( eğer başka bir yazım şekli even (length x)) ise takip edilir True. Aksi takdirde, ikincisi ( 1<2elbette her zaman doğru olan golf örneğinde) takip edilir ve geri döneriz Nothing.

zipWithiki bağımsız değişkenli bir işlevi alır ve iki listenin her öğesine uygular. Burada kullandığımız işlev \(h : t) x -> x ++ toLower h : t. h : tilk argümanımızdan ilk karakteri örtük olarak ayırır, bu Haskell'de yapabileceğiniz hoş bir şeydir. İlk liste (zaten çift sayıda satır içerdiğini bildiğimiz) girdidir ve ikincisi ise sonsuz bir şekilde "Kırmızı -" ve "Siyah -" (sonsuz listeler mümkün olan başka bir şeydir, çünkü Haskell, tembel - sadece kullandığınız kadar bir şeye önem verir).


(h:t)!x=x++toLower h:tbazı baytlar kaydeder.
Laikoni

İki vakanın değiştirilmesi başka bir bayt tasarrufu sağlar:f x|odd$length$x=Nothing|1<2=Just ...
Laikoni

@Laikoni bunlar için teşekkürler! Haskell için oldukça yeniyim ve bu benim ilk kez golf oynuyorum - ve gerçekten beğendim!
felixphew

memptyile karşılaştırıldığında 1 bayt tasarruf sağlar Nothing!
bartavelle

Şunun yerine tanımlayıp c="Red - ":"Black - ":ckullanarak başka bir bayt kaydedebilirsiniz : Çevrimiçi deneyin! ccycle["Red - ","Black - "]
Laikoni

3

Jöle , 29 bayt

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

Tam bir program.
Tek sayıda satıra sahip girişler için "falsey" çıkış seçeneğini kullanır.

Çevrimiçi deneyin!

Nasıl?

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 bayt

-4 MeC sayesinde sadece ASCII
sayesinde -2

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

Girdi olarak bir "dizi" alır. Misal:

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!

Nasıl çalışır

  • iitüm işlevlerin dışında bir değişken oluşturur , yani otomatik olarak 0 olarak başlatılır.
  • main(a,s)char**s;{iki işlevi alan ana işlevi bildirir - bir int a(komut satırı bağımsız değişkenlerinin sayısı) ve bir char ** s(komut satırı bağımsız değişkenleri dizisi).
  • for(;a%2&++i<a;)aeven ( a%2) öğesinin olup olmadığını ve iletilen ( i<a) komut satırı bağımsız değişkenlerinin sayısından daha az olup olmadığını denetleyen bir döngüdür .
  • printf("%s - %c%s\n",i%2"Red":"Black",tolower(*s[i]),s[i]+1 baskılar:
    • "Kırmızı" igaripse, "Siyah" ise içifttir ( i%2?"Red":"Black")
    • Geçerli komut satırı bağımsız değişkeninin küçük harfli ( tolower(*s[i])) ilk harfi
    • İlk harf ( s[i]+1) olmadan dize

Çevrimiçi deneyin!


Genel değişkenler varsayılan olarak başlatılır, böylece =02 bayt daha kaydetmek için parçayı atlayabilirsiniz .
Cody Gray

@CodyGray Oh evet, teşekkürler!
MD XF





1

JavaScript (ES6), 93 bayt

Şarkıyı bir dizi çizgi olarak alır.

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


@ Stephen-S bu girdi geçerli sayılıyor mu?
Vitim.us

1

Python 2 , 215-> 184-> 165 bayt

Stephen S'nin yorumuna göre 31 bayt kaydedildi

Challenger5 onu 165 bayta indirdi

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

Çevrimiçi deneyin!


Girinti için tek boşluklar kullanarak bazı baytlar kaydedebilir misiniz? Python'u o kadar iyi tanımıyorum ama işe yaradığını düşünüyorum
Stephen

@Stephen S: Evet, bence haklısın.
LMD


1

Javascript, 118 bayt

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

Ölçek

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.