Rapunzel, Rapunzel, ¡suéltate el pelo!

20

Descripción

Supongo que todos conocen el cuento de hadas de Rapunzel y el príncipe. Para aquellos que no lo hacen: léalo aquí. Sin embargo, Rapunzel acababa de cortarse el pelo, ¡así que podría no ser lo suficientemente largo como para dejar que su príncipe se trepara! Ella puede ponerse muy triste ...

Desafío

Su tarea es escribir una función que evalúe lo que Rapunzel dirá cuando el príncipe le pida que se suelte el cabello: cuando su cabello es más largo o igual que la torre es alta más un metro adicional (pautas de seguridad), se convierte muuuy feliz y dice Aaaah!, con el número de as igual length of her hair - height of the tower. De lo contrario, su cabello no tiene la longitud suficiente y comienza a llorar Booho!, donde el os antes de los hdos tercios iguales height of the tower - length of her hairy el os después de la h son el resto. El número de os después del Bdebe redondearse, por lo que si obtiene 2.6, habrá 3 os, y los demás deben estar después del h.

I / O

Se le proporcionan enteros positivos (incluido nulo) como argumentos, como una lista o como dos números individuales, en el orden que le resulte más conveniente, pero debe indicar en qué orden los toma. Como salida, imprime lo que Rapunzel dirá.

Casos de prueba

En los casos de prueba, el primer número será la longitud del cabello.

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

Este es el , por lo que gana la respuesta más corta en bytes.

racer290
fuente
55
¿Entonces no puede bajar si la altura de la torre es 0? Por cierto, enteros positivos (incluido nulo) == _ enteros no negativos :)
Stewie Griffin
2
Tenía la intención de hacer esto en su primera publicación, pero me gustaría contarle sobre el Sandbox , donde puede publicar desafíos para obtener comentarios antes de publicarlos en main. Esto parece un desafío bastante interesante, pero la gente puede dejarse llevar.
caird coinheringaahing
44
@StewieGriffin Sí, suponiendo que su longitud de cabello 0también lo sea. Aún así, ella tiene que salir por la ventana, ¡y las restricciones de seguridad también se aplican aquí! No hay manera de que ella pueda casarse con él si ella tiene un cuello roto.
racer290

Respuestas:

5

Gelatina ,  43 41 40 38 34 33 32  31 bytes

Probablemente hay mucho. ¿Hay un camino más corto ? ? ... esto fue bastante golf!

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

Un programa completo que imprime el resultado *.

Pruébalo en línea!

¿Cómo?

‘: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 enlace monádico, devuelve una lista de caracteres y listas de caracteres ['B', [['o', 'o', 'h'], ['o']], '!'], por ejemplo , como un programa completo, la impresión implícita destruye esto, por ejemploBooho!

Jonathan Allan
fuente
Sí, lo hay. :-)
Erik the Outgolfer
Sí, comencé con la idea de usar AL€œs3y encontré div por cero errores y luego, después de abordar eso con el código mucho más largo que encontré, todavía necesitaba un caso especial en el caso de igual longitud. Pensé que trataría de implementar una forma diferente hoy, pero parece que ya lo hiciste.
Jonathan Allan
... eso sí, estaba 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]+"!"

Pruébalo en línea!

Argumentos de la función se toman en el orden length of hair, height of tower.

notjagan
fuente
4

05AB1E , 38 35 32 bytes

Orden de entrada: length of hair,height of tower

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

Pruébalo en línea!

Explicación

‹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
fuente
Parece que has olvidado uno 3que se muestra en TIO.
Erik the Outgolfer
@EriktheOutgolfer: Gracias por notificarme. He arreglado la explicación para que se ajuste al código :)
Emigna
Ah, y tienes problemas de espacio con tu explicación.
Erik the Outgolfer
@EriktheOutgolfer: No lo veo. Si te refieres al hecho de que están en 2 líneas diagonales, es una separación intencional de if-else para disminuir el espacio horizontal utilizado. Si hay algo más, debo ser ciego.
Emigna
Oh, estaba confundido con el espacio en blanco extraño en él ...
Erik the Outgolfer
4

Javascript, 105 97 bytes

¡Gracias a Oki por ayudar a ahorrar 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 una función de currículum anónimo. Usar comof(length)(height)

Pruébalo en línea!

DanTheMan
fuente
No parece estar trabajando para f(1)(4). Reemplazar p(o+d)con p(-o-d)podría solucionar esto. También puede usar o=-d*2/3+.5|0para guardar 7 bytes.
Oki
@Oki, gracias por señalar ese error y mostrarme el redondeo más corto.
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),"!";

PHP Sandbox en línea

Jörg Hülsermann
fuente
Orden de argumento 1. cabello 2. torre?
racer290
@ racer290 Sí $ h cabello $ t torre
Jörg Hülsermann
2

Jalea , 32 bytes

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

Pruébalo en línea!

-1 gracias a Jonathan Allan .

Solo funciona como programa completo.

Los argumentos están en orden: cabello, torre

Erik el Outgolfer
fuente
Ahorre un byte reemplazándolo ær0con+.
Jonathan Allan
@ JonathanAllan Ooh, de hecho funciona. (maldito
juego de
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 de la función se toman en el orden length of Hair, height of Tower.

Tanj
fuente
Typo: heigth of Hower
racer290
0

Jalea , 84 76 bytes

Es realmente bastante largo, pero pasé demasiado tiempo en esto para no publicarlo. Toma dos argumentos enteros:

  1. longitud del cabello
  2. longitud de la torre

Cualquier consejo sobre golf esto sería apreciado.

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

Pruébalo en línea!

Élektra
fuente
bueno, ya hay una respuesta Jelly mucho más corta
Coœ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),"!")))

Un poco largo, bastante seguro de que se puede jugar golf. Toma información de STDIN en el orden Tower, Hair.

JAD
fuente
UH oh; esto realmente no funciona para la 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]

Una función sin nombre que toma la longitud del cabello h, y la altura de la torre t, y devuelve una cadena.

Pruébalo en línea!

Construye una secuencia comenzando con BA, seguida de dos tercios de la diferencia redondeada de la secuencia oarepetida, seguida de una sola h, luego la cantidad restante de aorepetida y finalmente h!!. El valor de retorno es entonces cada segundo carácter que comienza con Bo Amediante la notación de corte [h>t::2].

Jonathan Allan
fuente
0

Perl, 107 bytes

Toma la longitud del cabello primero, la longitud de la torre segundo

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
fuente
Puede deshacerse del `` '' y pretender su código por 4 espacios para que se vea mejor ...
Roman Gräf