Rapunzel, Rapunzel, solte seu cabelo!

20

Descrição

Acho que todo mundo conhece o conto de fadas de Rapunzel e o príncipe. Para quem não: leia aqui. No entanto, Rapunzel tinha acabado de cortar o cabelo, por isso pode não demorar o suficiente para deixar seu príncipe subir! Ela pode ficar muito triste ..

Desafio

Sua tarefa é escrever uma função que avalie o que Rapunzel dirá quando o príncipe pedir para ela soltar o cabelo: quando o cabelo é maior ou igual à torre, é alto mais um medidor extra (diretrizes de segurança), ela se torna muito feliz e diz Aaaah!, com o número de as sendo o mesmo que length of her hair - height of the tower. Caso contrário, seu cabelo não tem comprimento suficiente e ela começa a chorar:, Booho!onde os antes dos hdois terços iguais height of the tower - length of her haire oes depois h são os demais. O número de os após o Bdeve ser arredondado; portanto, se você obtiver 2.6, haverá 3 os e os outros deverão ser após o h.

I / O

Você recebe números inteiros positivos (incluindo nulo) como argumentos, como uma lista ou como dois números únicos, na ordem que achar mais conveniente, mas deve declarar em que ordem os aceita. Como saída, imprima o que o Rapunzel estará dizendo.

Casos de teste

Nos casos de teste, o primeiro número será o comprimento do cabelo.

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

Isso é , então a resposta mais curta em bytes vence!

racer290
fonte
5
Então ela não pode descer se a altura da torre é 0? Aliás, inteiros positivos (incluindo nulo) inteiros == _non-negativas :)
Stewie Griffin
2
Eu pretendia fazer isso no seu primeiro post, mas gostaria de falar sobre o Sandbox , onde você pode postar desafios para obter feedback antes de publicá-los no main. Parece um desafio bastante interessante, mas as pessoas podem se deixar levar.
caird coinheringaahing
4
@StewieGriffin Sim, assumindo que o comprimento do cabelo 0também é . Ainda assim, ela tem que sair pela janela, e as restrições de segurança também se aplicam aqui! Não há como ela se casar com ele se tiver um pescoço quebrado.
racer290

Respostas:

5

Geléia ,  43 41 40 38 34 33 32  31 bytes

Provavelmente há muito. Existe uma maneira mais curta ! ? ... isso foi bastante golfe!

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

Um programa completo imprimindo o resultado *.

Experimente online!

Quão?

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

* Como um link monádico, ele retorna uma lista de caracteres e listas de caracteres ['B', [['o', 'o', 'h'], ['o']], '!'], por exemplo , como um programa completo, a impressão implícita esmaga isso, por exemplo.Booho!

Jonathan Allan
fonte
Sim, existe. :-)
Erik the Outgolfer
Sim, comecei com a idéia de usar AL€œs3e encontrei div por zero erros e, depois de abordar isso com o código muito mais longo encontrado, ainda precisava de um caso especial com o mesmo comprimento. Pensei em tentar implementar uma maneira diferente hoje, mas parece que você já o fez.
Jonathan Allan
... você mente eu estava pensando 25-30 bytes :)
Jonathan Allan
4

Python 3 , 87 bytes

lambda l,h:["B"+"o"*round((h-l)*2/3)+"h"+"o"*round((h-l)/3),"A"+"a"*(l-h)+"h"][l>h]+"!"

Experimente online!

Argumentos para a função são tomadas na ordem length of hair, height of tower.

notjagan
fonte
4

05AB1E , 38 35 32 bytes

Ordem de entrada: length of hair,height of tower

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

Experimente online!

Explicação

‹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
fonte
Você parece ter esquecido um 3que é mostrado no TIO.
Erik the Outgolfer
@ EriktheOutgolfer: Obrigado por notificar. Eu fixo a explicação para estar em conformidade com o código :)
Emigna
Ah, e você tem problemas de espaçamento com sua explicação.
Erik the Outgolfer
@EriktheOutgolfer: Eu não vejo isso. Se você quer dizer que elas estão em duas linhas diagonais, é uma separação intencional do if-else para diminuir o espaço horizontal usado. Se houver algo mais, devo ser cego.
Emigna
Oh, eu estava confuso com o espaço em branco estranho nele ...
Erik o Outgolfer
4

Javascript, 105 97 bytes

Agradecemos à Oki por ajudar a economizar 7 bytes!

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))+"!"

Define uma função de curry anônima. Use comof(length)(height)

Experimente online!

DanTheMan
fonte
Não parece estar trabalhando f(1)(4). Substituir p(o+d)por p(-o-d)poderia corrigir isso. Além disso, você pode usar o=-d*2/3+.5|0para salvar 7 bytes.
Oki
@Oki obrigado por apontar esse erro e me mostrar o arredondamento mais curto!
21417 DanTheMan
p=(t,s='o')=>s.repeat(t)
tsh
2

PHP> = 7.1, 111 bytes

[,$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),"!";

Sandbox do PHP Online

Jörg Hülsermann
fonte
Ordem dos argumentos 1. cabelo 2. torre?
racer290
@ racer290 Sim $ h hair $ t tower
Jörg Hülsermann
2

Geléia , 32 bytes

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

Experimente online!

-1 graças a Jonathan Allan .

Funciona apenas como programa completo.

Os argumentos estão em ordem: cabelo, torre

Erik, o Outgolfer
fonte
Salve um byte, substituindo ær0por+.
Jonathan Allan
@ JonathanAllan Ooh realmente funciona. (maldito
built
0

Julia, 101 bytes

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

Argumentos para a função são tomadas na ordem length of Hair, height of Tower.

Tanj
fonte
Typo: ALTURA de Hower
racer290
0

Geléia , 84 76 bytes

É realmente bastante longo, mas gastei muito tempo nisso para não publicá-lo. Leva dois argumentos inteiros:

  1. comprimento do cabelo
  2. comprimento da torre

Qualquer dica sobre golfe isso seria apreciada.

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

Experimente online!

Élektra
fonte
bem, já existe uma resposta muito mais curto Jelly
Cœur
0

R, 117 bytes

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),"!")))

Um pouco longo, com certeza isso pode ser jogado para baixo. Recebe entrada de STDIN no pedido Tower, Hair.

JAD
fonte
uh-oh; isso realmente não funciona para entrada1 4
Giuseppe
0

Python 2 , 77 bytes

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

Uma função sem nome que obtém o comprimento do cabelo h, e a altura da torre te retorna uma sequência.

Experimente online!

Constrói uma sequência iniciada com BA, seguida por dois terços da diferença arredondada da sequência oarepetida, seguida por uma única h, depois a quantidade restante de aorepetida e finalmente h!!. O valor de retorno é então cada segundo caractere começando com a notação Bou Aatravés da fatia [h>t::2].

Jonathan Allan
fonte
0

Perl, 107 bytes

Pega primeiro o comprimento do cabelo, depois o comprimento da torre.

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
fonte
Você pode se livrar do `` `e pretender o seu código por 4 espaços para torná-lo mais agradável .. #
7897 Roman Gräf