Создайте свой собственный красный и черный

9

В музыкальном исполнении Les Miserables появляется песня под названием «Red and Black». Вот часть этой песни:

Красный - кровь злых людей!

Черный - тьма прошлых веков!

Красный - мир на заре!

Черный - ночь, которая заканчивается наконец!

Источник.

Ваша задача состоит в том, чтобы превратить вход в звучащий гимн «Красно-черный».

вход

Текст, разделенный символом новой строки, или аналогичный подходящий текстовый ввод. Например,

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

Пустой ввод не определен (выходит за рамки).

Вывод

Если длина (количество строк или длина входного массива или аналогичная) ввода нечетна, либо ничего не выводите, либо выводите false. Ваша заявка может не выводить ошибки или пытаться вывести правильный вывод.

В противном случае, превратите вход в красно-черную лирику. Превратите любые заглавные буквы в начале строки в строчные. Добавьте 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!
Стивен
источник
"Или длина ввода нечетная", вы говорите о строках или символах?
Тутлеман
@Тутлмен: количество строк, я
Стивен,
3
Я думаю, что эта проблема в порядке, но в целом, создание представления обрабатывать недопустимый ввод на самом деле не добавляет много . Просто для дальнейшего использования.
Джеймс
@DJMcMayhem, так как ответов не было, я сделаю пустой ввод неопределенным - имеет больше смысла, спасибо (я хочу оставить ввод нечетной длины как есть)
Стивен

Ответы:

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

V , 31 , 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

Haskell , 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).

|Оператор охранник - своего рода условный. За первой ветвью следует if even $ length $ x(что является другим способом записи even (length x)) True. В противном случае следует второй ( 1<2в примере с гольфом, который, конечно, всегда верен), и мы возвращаемся Nothing.

zipWithпринимает функцию с двумя аргументами и применяет ее к каждому элементу двух списков. Функция, которую мы здесь используем \(h : t) x -> x ++ toLower h : t. h : tнеявно отделяет первый символ от нашего первого аргумента, что является хорошей вещью, которую вы можете сделать в Haskell. Первый список - это входные данные (которые, как мы уже знаем, содержат четное число строк), а второй просто бесконечно чередует «Красный -» и «Черный -» (бесконечные списки - еще одна приятная вещь, которая возможна, на этот раз, потому что Haskell ленивый - он заботится только о том, что вы используете).

felixphew
источник
(h:t)!x=x++toLower h:tсохраняет несколько байтов.
Лайкони
Переключение двух случаев сохраняет другой байт:f x|odd$length$x=Nothing|1<2=Just ...
Лайкони
@Laikoni спасибо за это! Я довольно новичок в Хаскеле, и это мой первый опыт игры в гольф - и мне это действительно нравится!
Феликсфью
memptyэкономит 1 байт по сравнению с Nothing!
bartavelle
Вы можете сохранить другой байт, определив c="Red - ":"Black - ":cи использовав cвместо cycle["Red - ","Black - "]: Попробуйте онлайн!
Лайкони
3

Желе , 29 байт

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

Полная программа.
Использует опцию вывода "falsey" для входных данных с нечетным числом строк.

Попробуйте онлайн!

Как?

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!

Как это работает

  • iсоздает переменную iвне всех функций, что означает, что она автоматически инициализируется в 0.
  • main(a,s)char**s;{объявляет основную функцию, которая принимает два аргумента - int a(количество аргументов командной строки) и char ** s(массив аргументов командной строки).
  • for(;a%2&++i<a;)это цикл, который проверяет, aявляется ли even ( a%2) и меньше ли оно переданного количества аргументов командной строки ( i<a).
  • printf("%s - %c%s\n",i%2"Red":"Black",tolower(*s[i]),s[i]+1 печатает:
    • «Красный», если iнечетный, «Черный», если iчетный ( i%2?"Red":"Black")
    • Первая буква текущего аргумента командной строки в нижнем регистре ( tolower(*s[i]))
    • Строка без первой буквы ( s[i]+1)

Попробуйте онлайн!

MD XF
источник
Глобальные переменные инициализируются по умолчанию, поэтому вы можете опустить =0часть, чтобы сохранить еще 2 байта.
Коди Грей
@CodyGray О, да, спасибо!
MD XF
1

CJam, 41 байт

qN/{(el\+}%2/"Red - 
Black - "N/f.\:~2/N*
Esolanging Fruit
источник
1

JavaScript (ES6), 93 байта

Принимает песню как массив строк.

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

darrylyeo
источник
@ Stephen-S этот вход считается действительным?
Vitim.us
1

Python 2 , 215-> 184-> 165 байт

Сохранено 31 байт в соответствии с комментарием Стивена С.

Challenger5 уменьшил его до 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:]

Попробуйте онлайн!

LMD
источник
Можете ли вы сохранить несколько байтов, используя одинарные пробелы для отступа? Я не очень хорошо знаю Python, но думаю, что это работает
Стивен
@ Стефан С: Да, я думаю, что вы правы.
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

Тестовое задание

Vitim.us
источник