Рапунцель, Рапунцель, опусти волосся!


20

Опис

Напевно, всі знають казку про Рапунцель та принца. Для тих, хто цього не робить: читайте тут. Однак Рапунцель щойно стригла волосся, тож може не вистачити довго, щоб принц піднявся вгору! Їй може стати дуже сумно ..

Виклик

Ваше завдання - написати функцію, яка оцінює, що буде говорити Рапунцель, коли принц закликає її відпустити волосся: Коли волосся довше або дорівнює вежі, це високий плюс додатковий метр (правила безпеки), вона стає veeeery задоволений і каже Aaaah!, що кількість as така сама, як length of her hair - height of the tower. В іншому випадку її волосся не мають достатньої довжини, і вона починає плакати:, Booho!де os hдорівнює дві третини height of the tower - length of her hair, а os після h - решта. Кількість os після Bобов'язкового закруглення, тому якщо ви отримаєте 2.6, це буде 3 os, а інші повинні бути після h.

I / O

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

Тестові кейси

У тестових випадках першим номером буде довжина волосся.

0, 0 -> 'Bh!' (probably a dry sob..)
2, 1 -> 'Aah!'
1, 2 -> 'Boh!'
1, 4 -> 'Booho!'
4, 1 -> 'Aaaah!'
2, 4 -> 'Boho!'

Це , тому найкоротша відповідь у байтах виграє!


5
Тож вона не може зійти, якщо висота вежі 0? BTW, натуральні числа (включаючи нульові) == _негативні цілі числа :)
Стюі Гріффін

2
Я мав намір це зробити на своєму першому дописі, але я хотів би розповісти вам про пісочницю , де ви можете опублікувати виклики, щоб отримати зворотний зв'язок перед тим, як опублікувати їх на основну. Це здається досить цікавим викликом, але люди можуть захопитися.
caird coinheringaahing

4
@StewieGriffin Так, припускаючи, що довжина волосся 0теж. І все-таки вона повинна вийти з вікна, і тут також діють обмеження безпеки! Немає можливості вийти за нього заміж, якщо у неї сама зламана шия.
racer290

Відповіді:


5

Желе ,  43 41 40 38 34 33 32  31 байт

Мабуть, є багато. Хоча існує і коротший шлях ! ? ... це було зовсім трохи гольфу!

‘:3;ạ¥⁸4ẋ+;€⁹¦7Ṛṭ;8ị“øŻPLC»
ạç>

Повна програма, що друкує результат *.

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

Як?

‘:3;ạ¥⁸4ẋ+;€⁹¦7Ṛṭ;8ị“øŻPLC» - Link 1: number, abs(hair-tower); number, (hair > tower)?
‘                           - increment -> abs(hair-tower)+1
 :3                         - integer divide by 3 -> (abs(hair-tower)+1)//3
                            -   ...the remainder amount after removing 2/3 rounded
      ⁸                     - chain's left argument, abs(hair-tower)
     ¥                      - last two links as a dyad:
    _                       -   subtract (yields the 2/3 rounded amount)
   ;                        - concatenate
       4ẋ                   - repeat 4 (vectorises) (i.e. [[4,4,...],[4,...]])
         +                  - add (hair > tower)? (vectorises) (i.e. 4s->5s if so)
             ¦              - sparse application:
          ;€  7             - of:  concatenate €ach with a 7
            ⁹               - to indexes: chain's right argument, (hair-tower)?
               Ṛ            - reverse the list
                ṭ           - tack (hair-tower)?
                 ;8         - concatenate an 8
                    “øŻPLC» - compression of the word "Abroach" & the string "!B"
                   ị        - index into "Abroach!B" (1-indexed & modular, so 0->B)
                            - implicit (smashed) print

ạç> - Main link: number, hair; number, tower
ạ   - absolute difference -> abs(hair-tower)
  > - greater than? -> (hair > tower)? (1 if so, else 0)
 ç  - call the last link (1) as a dyad

* Як монадійне посилання повертає список символів і списки символів, наприклад ['B', [['o', 'o', 'h'], ['o']], '!'], як повна програма, неявна друк розбиває це, наприкладBooho!



Так, я почав з ідеї використання AL€œs3і виявив div з нульовими помилками, а потім після того, як я звернувся до цього, з набагато більш довгим кодом, знайденим вище, мені все-таки потрібно було окремий випадок, що має рівну довжину. Я думав, що спробую сьогодні реалізувати інший шлях, але схоже, що ти вже робив.
Джонатан Аллан

... майте на увазі, я думав 25-30 байт :)
Джонатан Аллан


4

05AB1E , 38 35 32 байт

Вхідний замовлення: length of hair,height of tower

‹i¹α'a×"Aÿh!"ë¹-x‚>3÷R'o×'hý…Bÿ!

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

Пояснення

‹i                                  # if h < l
  ¹α                                # push absolute difference of h and l
    'a×                             # repeat "a" that many times
       "Aÿh!"                       # interpolate between "A" and "h!"
 ë                                  # else 
  ¹-                                # push h-l
    x‚                              # pair with its double
      >3÷                           # increment and integer divide by 3
         R                          # reverse the list
          'o×                       # for each, repeat "o" that many times
             'hý                    # merge the o's on "h"
                …Bÿ!                # interpolate between "B" and "!"

Здається, ви забули, 3що показано на TIO.
Ерік Аутгольфер

@EriktheOutgolfer: Дякуємо за повідомлення. Я виправив пояснення щодо відповідності коду :)
Emigna

О, і у вас є проблеми з інтервалом у вашому поясненні.
Erik the Outgolfer

@EriktheOutgolfer: Я цього не бачу. Якщо ви маєте на увазі той факт, що вони знаходяться в двох діагональних лініях, це навмисне розділення, якщо інакше, щоб зменшити використаний горизонтальний простір. Якщо є щось інше, я повинен бути сліпим.
Емінья

О, я був переплутаний із сторонніми пробілами в ньому ...
Ерік Вигнавець

4

Javascript, 105 97 байт

Дякую Окі за допомогу зберегти 7 байт!

p=(t,s)=>(s||"o").repeat(t)
l=>h=>(d=l-h,o=d/3-.5|0,l>h?`A${p(d,"a")}h`:`B${p(o-d)}h`+p(-o))+"!"

Визначає функцію анонімного currying. Використовуйте якf(length)(height)

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


Здається, це не працює f(1)(4). Заміна p(o+d)на це p(-o-d)могла б виправити це. Також ви можете використовувати o=-d*2/3+.5|0для збереження 7 байт.
Окі

@Oki дякую за вказівку на цю помилку та показавши мені коротше округлення!
DanTheMan

p=(t,s='o')=>s.repeat(t)
tsh


2

Желе , 32 байти

_‘”aẋŒt;⁾h!ɓ_÷1.,3+.”oẋ“Bh!”żð>?

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

-1 завдяки Джонатану Аллану .

Працює лише як повна програма.

Аргументи в порядку: волосся, башта


Збережіть байт, замінивши ær0на+.
Джонатан Аллан

@JonathanAllan Ooh справді працює. (проклятий двобайтовий вбудований)
Ерік Атголфер

0

Джулія, 101 байт

g(h,t)=h>t?string("A","a"^(h-t),"h!"):string("B","o"^round(Int,(t-h)*2/3),"h","o"^round(Int,(t-h)/3))

Аргументи функції приймаються в порядку length of Hair, height of Tower.


Typo: heigth of
Hower

0

Желе , 84 76 байт

Це дійсно досить довго, але я витратив надто багато часу на це, щоб не публікувати його. Бере два цілих аргументи:

  1. довжина волосся
  2. довжина вежі

Будь-які поради щодо гольфу це вдячні.

³>⁴×111ð;ø³>⁴¬×97
97ðxø³ạ⁴
111ðxø¢L÷3×⁸ær0:1
2Çṭ2£“h”ṭµ1ÇṭµFḟ1£
>¬+65¥;¢;33Ọ

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


ну, є вже набагато коротша відповідь Желе
Cœur


0

Python 2 , 77 байт

lambda h,t:("BA"+(abs(h-t)*2+1)/3*"oa"+"h"+(abs(h-t)+1)/3*"ao"+"h!!")[h>t::2]

Безіменна функція, яка займає довжину волосся, hвисоту та висоту вежі tта повертає рядок.

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

Побудовує рядок, починаючи з BA, а потім дві третини різниці, округлених рядка oaповторення, після чого одинарним h, потім залишком кількості aoповторень і, нарешті h!!. Повертається значення - це кожен другий символ, починаючи з Bабо Aчерез позначення зрізу [h>t::2].


0

Perl, 107 байт

Довжина волосся займає перше, довжина вежі - друге.

sub b{(($c=$_[0]-$_[1])>0?'A'.'a'x--$c.'h':do{$o=int(2/3*($c*=-1)+.5);'B'.('o'x$o).'h'.('o'x($c-$o))}).'!'}

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