Рапунцель, Рапунцель, опускай волосы!

20

Описание

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

Вызов

Ваша задача - написать функцию, которая оценивает то, что Рапунцель скажет, когда принц призовет ее опустить волосы: когда ее волосы длиннее или равны башне высокой, плюс дополнительный метр (правила безопасности), она становится очень хорошо, и говорит 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 oс, а остальные должны быть после 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!'

Это , поэтому выигрывает самый короткий ответ в байтах!

racer290
источник
5
Значит, она не может спуститься, если высота башни 0? Кстати, положительные целые числа (включая ноль ) == _негативные целые числа :)
Stewie Griffin
2
Я хотел сделать это в вашем первом посте, но я хотел бы рассказать вам о Песочнице , где вы можете публиковать задания, чтобы получить обратную связь, прежде чем отправлять их на главную. Это кажется довольно интересным испытанием, но люди могут увлечься.
Caird Coneheringaahing
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!

Джонатан Аллан
источник
Да, есть. :-)
Эрик Outgolfer
Да, я начал с идеи использования 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 "!"
Emigna
источник
Вы, кажется, забыли, 3что показано на TIO.
Эрик Outgolfer
@EriktheOutgolfer: Спасибо за уведомление. Я исправил объяснение, чтобы соответствовать коду :)
Emigna
О, и у вас есть проблемы с интервалом в вашем объяснении.
Эрик Аутгольфер
@EriktheOutgolfer: я этого не вижу. Если вы имеете в виду тот факт, что они находятся в 2 диагональных линиях, это намеренное разделение if-else для уменьшения используемого горизонтального пространства. Если есть что-то еще, я должен быть слепым.
Эминья
О, я был перепутан с посторонним пробелом в нем ...
Эрик Outgolfer
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))+"!"

Определяет анонимную функцию карри. Используйте какf(length)(height)

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

DanTheMan
источник
Кажется, не работает на 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

PHP> = 7,1, 111 байт

[,$h,$t]=$argv;echo BA[$b=$h>$t],($r=str_repeat)(oa[$b],$c=round(($a=abs($h-$t))*($b?:2/3))),h,$r(o,$a-$c),"!";

PHP Sandbox Online

Йорг Хюльсерманн
источник
Аргумент порядка 1. волосы 2. башня?
racer290
@ racer290 Да $ h hair $ t tower
Йорг Хюльсерманн
2

Желе , 32 байта

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

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

-1 спасибо Джонатану Аллану .

Работает только как полная программа.

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

Эрик Outgolfer
источник
Сохранить байт, заменив ær0на+.
Джонатан Аллан
@JonathanAllan Ох, это действительно работает. (чертовски двухбайтовый встроенный)
Эрик Outgolfer
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.

Tanj
источник
Опечатка: высота Хауэра
racer290
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

R, 117 байт

x=diff(scan());cat(`if`(x>0,paste0("A",rep("a",x),"h!"),paste0("B",rep("o",F<-round(-2*x/3)),"h",rep("o",-x-F),"!")))

Немного долго, почти уверен, что это можно проиграть. Принимает ввод из STDIN в порядке Tower, Hair.

JAD
источник
э-э-о; это на самом деле не работает для ввода1 4
Джузеппе
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))}).'!'}
bytepusher
источник
Вы можете избавиться от `` `и назначить свой код на 4 пробела, чтобы он выглядел лучше ..
Роман