Stwórz swój własny czerwony i czarny

9

W muzycznym wykonaniu Les Miserables pojawia się piosenka zatytułowana „Red and Black”. Oto część tej piosenki:

Czerwony - krew gniewnych ludzi!

Czarny - ciemność minionych wieków!

Czerwony - świat o świcie!

Czarny - noc, która w końcu się kończy!

Źródło.

Twoim zadaniem jest przekształcenie wkładu w hymn „Czerwony i czarny”.

Wejście

Tekst rozdzielany znakami nowej linii lub podobny odpowiedni sposób wprowadzania tekstu. Na przykład,

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

Puste wejście jest niezdefiniowane (poza zakresem).

Wynik

Jeśli długość (liczba linii, długość tablicy wejściowej lub podobna) danych wejściowych jest nieparzysta, albo nic nie wysyłaj, albo wyjściowy falsey. Przesłanie może nie powodować wyświetlania błędów lub próby uzyskania prawidłowego wyniku.

W przeciwnym razie zmień dane wejściowe na tekst czerwony / czarny. Zmień dowolne wielkie litery na początku wiersza na małe. Dodaj Redplus separator z przodu linii nieparzystych i Blackplus (widoczny) separator z przodu linii parzystych. Separator musi być również otoczony spacjami, aby wynik wyglądał na niezatłoczony (i niespokojny;)).

Masz teraz swój wynik.

Przypadki testowe

Ogranicznikiem wyjścia jest -.

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
źródło
Przez „czy długość danych wejściowych jest nieparzysta”, czy mówisz o wierszach lub znakach?
Tutleman
@Tutleman liczba linii, wyjaśnię
Stephen
3
Myślę, że to wyzwanie jest w obecnej formie OK, ale ogólnie rzecz biorąc, dokonywanie obsługi niepoprawnych danych wejściowych nie dodaje zbyt wiele . Tylko na przyszłość.
James
@DJMcMayhem, ponieważ nie było odpowiedzi, zrobię puste dane niezdefiniowane - ma większy sens, dziękuję (chcę zachować nieparzyste dane wejściowe, jakie są)
Stephen

Odpowiedzi:

4

05AB1E , 26 bajtów

Kod:

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

Wykorzystuje kodowanie 05AB1E . Wypróbuj online!

Wyjaśnienie:

|                               # 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
źródło
5

V , 31 , 30 bajtów

êuòIRed - 
IBlack - 
òñFRdH

Wypróbuj online!

Hexdump:

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

Jest to trywialne w V, ale przypadek na krawędzi nieparzystych danych wejściowych sprawia, że ​​jest to trudne, ponieważ V tak naprawdę nie ma warunków warunkowych. Na szczęście możemy sobie z tym poradzić przy stosunkowo niewielkim koszcie +6bajtów.

James
źródło
5

Haskell , 104 120 113 112 111 110 bajtów

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

Wypróbuj online!

Nie obeznany z wyjaśnieniem

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

fjest funkcją, która pobiera listę ciągów znaków (zwaną także listą list Chars) i zwraca Maybeto samo. Funkcje Haskella są dość „czyste”, dlatego musimy wyjaśnić, że ta funkcja może niczego nie zwracać. (Funkcja typu Maybe azwraca albo Nothingalbo Just a).

|Operator jest strażnik - rodzaj warunkowe. Pierwszy oddział następuje, jeśli even $ length $ x(co jest innym sposobem pisania even (length x)) True. W przeciwnym razie następuje drugi ( 1<2w golfowym przykładzie, który oczywiście jest zawsze prawdziwy) i wracamy Nothing.

zipWithprzyjmuje funkcję dwóch argumentów i stosuje ją do każdego elementu dwóch list. Używamy tutaj funkcji \(h : t) x -> x ++ toLower h : t. h : tdomyślnie dzieli pierwszą postać od naszego pierwszego argumentu, co jest przyjemną rzeczą, którą możesz zrobić w Haskell. Pierwsza lista to dane wejściowe (które, jak już wiemy, zawierają parzystą liczbę linii), a druga to po prostu nieskończenie naprzemienne „czerwone -” i „czarne -” (nieskończone listy to kolejna fajna rzecz, która jest możliwa, tym razem ponieważ Haskell jest leniwy - troszczy się tylko o tyle, ile używasz).

felixphew
źródło
(h:t)!x=x++toLower h:toszczędza niektóre bajty.
Laikoni
Zmiana dwóch przypadków oszczędza kolejny bajt:f x|odd$length$x=Nothing|1<2=Just ...
Laikoni
@Laikoni dzięki za to! Jestem całkiem nowy w Haskell i po raz pierwszy gram w nim - i naprawdę mi się podoba!
felixphew
memptyoszczędza 1 bajt w porównaniu do Nothing!
bartavelle
Możesz zapisać kolejny bajt, definiując c="Red - ":"Black - ":ci używając czamiast cycle["Red - ","Black - "]: Wypróbuj online!
Laikoni
3

Galaretka , 29 bajtów

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

Pełny program.
Używa opcji wyjściowej „falsey” dla danych wejściowych o nieparzystej liczbie linii.

Wypróbuj online!

W jaki sposób?

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
źródło
3

Japt , 36 35 34 bajtów

Wyjścia 0dla false. Obejmuje niedrukowalne po drugim R.

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

Wypróbuj online

Kudłaty
źródło
3

C, 112 107 105 103 99 bajtów

-4 dzięki tylko ASCII
-2 dzięki 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);}

Pobiera „tablicę” jako dane wejściowe. Przykład:

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!

Jak to działa

  • itworzy zmienną ipoza wszystkimi funkcjami, co oznacza, że ​​jest automatycznie inicjowana na 0.
  • main(a,s)char**s;{deklaruje funkcję główną, która przyjmuje dwa argumenty - an int a(liczba argumentów wiersza poleceń) i a char ** s(tablica argumentów wiersza poleceń).
  • for(;a%2&++i<a;)to pętla, która sprawdza, czy ajest parzysta ( a%2) i czy jest mniejsza niż liczba przekazanych argumentów wiersza poleceń ( i<a).
  • printf("%s - %c%s\n",i%2"Red":"Black",tolower(*s[i]),s[i]+1 drukuje:
    • „Czerwony”, jeśli ijest nieparzysty, „Czarny”, jeśli ijest parzysty ( i%2?"Red":"Black")
    • Pierwsza litera bieżącego argumentu wiersza poleceń małymi literami ( tolower(*s[i]))
    • Ciąg bez pierwszej litery ( s[i]+1)

Wypróbuj online!

MD XF
źródło
Zmienne globalne są inicjowane domyślnie, więc można pominąć =0część, aby zaoszczędzić jeszcze 2 bajty.
Cody Gray
@CodyGray O tak, dzięki!
MD XF
2

Röda , 97 bajtów

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

Wypróbuj online!

user41805
źródło
1

Galaretka , 30 bajtów

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

Wypróbuj online!

Erik the Outgolfer
źródło
1

CJam, 41 bajtów

qN/{(el\+}%2/"Red - 
Black - "N/f.\:~2/N*
Esolanging Fruit
źródło
1

JavaScript (ES6), 93 bajty

Traktuje utwór jako szereg linii.

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

darrylyeo
źródło
@ Stephen-S czy to wejście jest liczone jako prawidłowe?
Vitim.us
1

Python 2 , 215-> 184-> 165 bajtów

Zapisano 31 bajtów zgodnie z komentarzem Stephena S.

Challenger5 obniżył go do 165 bajtów

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

Wypróbuj online!

LMD
źródło
Czy możesz zapisać niektóre bajty, używając pojedynczych spacji do wcięcia? Nie znam tak dobrze Pythona, ale myślę, że to działa
Stephen
@Stephen S: Tak, myślę, że masz rację.
LMD
1

JavaScript, 118 bajtów

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

Test

Vitim.us
źródło