Створіть свій власний червоний та чорний


9

У музичному перекладі Les Miserables з’являється пісня під назвою «Червоне і чорне». Ось частина цієї пісні:

Червоний - кров розлючених чоловіків!

Чорний - темрява минулих віків!

Червоний - світ перед світанком!

Чорний - ніч, яка закінчується нарешті!

Джерело

Ваше завдання - перетворити внесок у надзвичайний гімн "Червоно-чорний".

Вхідні дані

Текст, обмежений новими рядками, або аналогічним відповідним введенням тексту. Наприклад,

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

Порожнє введення не визначено (поза межами).

Вихідні дані

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

В іншому випадку перетворіть вхід на червоний / чорний лірик. Перетворіть будь-які великі літери на початку рядка в малі. Додайте 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 кількість рядків, я уточню
Стівен

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

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

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

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


(h:t)!x=x++toLower h:tзберігає деякі байти.
Лайконі

Переключення двох випадків економить ще один байт:f x|odd$length$x=Nothing|1<2=Just ...
Лайконі,

@Laikoni дякую за це! Я досить новачок у Haskell, і це вперше гольф в ньому - і мені це дуже подобається!
феліксфев

memptyекономить 1 байт порівняно з Nothing!
bartavelle

Ви можете зберегти ще один байт, визначивши c="Red - ":"Black - ":cта використовуючи cзамість cycle["Red - ","Black - "]: Спробуйте його в Інтернеті!
Лайконі

3

Желе , 29 байт

0
“ZœĠk»ḲṁJżj€“ - ”Y
ỴŒl1¦€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 байт

-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, що рівний ( 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)

Спробуйте в Інтернеті!


Глобальні змінні ініціалізуються за замовчуванням, тому ви можете опустити =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

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

Спробуйте в Інтернеті!


Чи можете ви зберегти кілька байт, використовуючи одинарні пробіли для відступу? Я не знаю Python так добре, але думаю, що це працює
Стівен

@Stephen S: Так, я думаю, ти маєш рацію.
ЛМД


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

Тест

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.