Raiponce, Raiponce, laisse tomber tes cheveux!

20

La description

Je suppose que tout le monde connaît le conte de fées de Raiponce et du prince. Pour ceux qui ne le font pas: lisez-le ici. Cependant, Raiponce venait de se faire couper les cheveux, donc cela pourrait ne pas être assez long pour laisser son prince grimper! Elle peut devenir très triste ..

Défi

Votre tâche consiste à écrire une fonction qui évalue ce que Raiponce dira lorsque le prince lui demandera de laisser tomber ses cheveux: lorsque ses cheveux sont plus longs ou égaux à la tour est grand plus un mètre supplémentaire (consignes de sécurité), elle devient veeeery heureux et dit Aaaah!, avec le nombre de as étant le même que length of her hair - height of the tower. Sinon, ses cheveux n'ont pas une longueur suffisante et elle se met à pleurer: Booho!où le os avant les hdeux tiers égaux height of the tower - length of her hairet le os après le h étant le reste. Le nombre de os après le Bdoit être arrondi, donc si vous obtenez 2.6, il y aura 3 os, et les autres doivent être après le h.

E / S

On vous donne des entiers positifs (y compris null) comme arguments, comme une liste ou comme deux nombres simples, dans l'ordre que vous trouvez le plus pratique, mais vous devez indiquer dans quel ordre vous les prenez. En sortie, imprimez ce que Raiponce dira.

Cas de test

Dans les cas de test, le premier nombre sera la longueur des cheveux.

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

C'est le , donc la réponse la plus courte en octets l'emporte!

racer290
la source
5
Elle ne peut donc pas descendre si la hauteur de la tour est 0? BTW, entiers positifs (y compris null) == _ entiers non négatifs :)
Stewie Griffin
2
Je voulais le faire sur votre premier post, mais je voudrais vous parler du Sandbox , où vous pouvez poster des défis pour obtenir des commentaires avant de les poster sur main. Cela semble être un défi assez intéressant, mais les gens peuvent se laisser emporter.
caird coinheringaahing
4
@StewieGriffin Yep, en supposant que la longueur de ses cheveux l'est 0aussi. Pourtant, elle doit sortir par la fenêtre, et les restrictions de sécurité s'appliquent ici aussi! Il n'y a aucun moyen qu'elle puisse l'épouser si elle a un cou cassé.
racer290

Réponses:

5

Gelée ,  43 41 40 38 34 33 32  31 octets

Il y a probablement beaucoup Est - il un moyen plus court si ! ? ... c'était pas mal de golf!

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

Un programme complet imprimant le résultat *.

Essayez-le en ligne!

Comment?

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

* En tant que lien monadique, il renvoie une liste de caractères et des listes de caractères, par exemple ['B', [['o', 'o', 'h'], ['o']], '!'], en tant que programme complet, l'impression implicite écrase cela, par exemple.Booho!

Jonathan Allan
la source
Oui, il y en a. :-)
Erik the Outgolfer
Oui, j'ai commencé avec l'idée d'utiliser AL€œs3et trouvé des erreurs div par zéro, puis après avoir résolu le problème avec le code beaucoup plus long ci-dessus, j'avais encore besoin de cas particulier le cas de longueur égale. Je pensais que j'essaierais de mettre en œuvre une méthode différente aujourd'hui, mais il semble que vous l'ayez déjà fait.
Jonathan Allan
... attention je pensais à 25-30 octets :)
Jonathan Allan
4

Python 3 , 87 octets

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

Essayez-le en ligne!

Les arguments de la fonction sont prises dans l'ordre length of hair, height of tower.

notjagan
la source
4

05AB1E , 38 35 32 octets

Ordre d' entrée: length of hair,height of tower

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

Essayez-le en ligne!

Explication

‹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
la source
Vous semblez avoir oublié un 3qui est montré sur TIO.
Erik the Outgolfer
@EriktheOutgolfer: Merci d'avoir informé. J'ai corrigé l'explication pour me conformer au code :)
Emigna
Oh, et vous avez des problèmes d'espacement avec votre explication.
Erik the Outgolfer
@EriktheOutgolfer: Je ne le vois pas. Si vous voulez dire le fait qu'ils sont sur 2 lignes diagonales, c'est une séparation intentionnelle de if-else pour diminuer l'espace horizontal utilisé. S'il y a autre chose, je dois être aveugle.
Emigna
Oh, j'étais confus avec les espaces étrangers qui s'y
trouvent
4

Javascript, 105 97 octets

Merci à Oki d'avoir aidé à économiser 7 octets!

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

Définit une fonction de curry anonyme. Utilisez commef(length)(height)

Essayez-le en ligne!

DanTheMan
la source
Ne semble pas travailler pour f(1)(4). Le remplacement p(o+d)par p(-o-d)pourrait résoudre ce problème. Vous pouvez également utiliser o=-d*2/3+.5|0pour enregistrer 7 octets.
Oki
@Oki merci d'avoir signalé cette erreur et de m'avoir montré l'arrondi le plus court!
DanTheMan
p=(t,s='o')=>s.repeat(t)
tsh
2

PHP> = 7.1, 111 octets

[,$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

Jörg Hülsermann
la source
Ordre des arguments 1. cheveux 2. tour?
racer290
@ racer290 Yes $ h hair $ t tower
Jörg Hülsermann
2

Gelée , 32 octets

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

Essayez-le en ligne!

-1 merci à Jonathan Allan .

Fonctionne uniquement comme programme complet.

Les arguments sont en ordre: cheveux, tour

Erik le Outgolfer
la source
Enregistrer un octet en remplaçant ær0par+.
Jonathan Allan
@JonathanAllan Ooh ça marche bien. (putain de construction sur deux octets)
Erik the Outgolfer
0

Julia, 101 octets

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

Les arguments de la fonction sont prises dans l'ordre length of Hair, height of Tower.

Tanj
la source
Typo: heigth of Hower
racer290
0

Gelée , 84 76 octets

C'est vraiment assez long, mais j'ai passé trop de temps sur ça pour ne pas le poster. Prend deux arguments entiers:

  1. longueur de cheveux
  2. longueur de tour

Tous les conseils sur le golf seraient appréciés.

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

Essayez-le en ligne!

Élektra
la source
eh bien, il y a déjà une réponse Jelly beaucoup plus courte
Cœur
0

R, 117 octets

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 peu long, je suis sûr que cela peut être joué au golf. Prend l'entrée de STDIN dans l'ordre Tower, Hair.

JAD
la source
euh-oh; cela ne fonctionne pas réellement pour la saisie1 4
Giuseppe
0

Python 2 , 77 octets

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

Une fonction sans nom prenant la longueur des cheveux het la hauteur de la tour t, et renvoyant une chaîne.

Essayez-le en ligne!

Construit une chaîne commençant par BA, suivie des deux tiers de la différence arrondie de la chaîne oarépétée, suivie d'un simple h, puis du reste de la aorépétition, et enfin h!!. La valeur de retour est alors tous les deux caractères commençant par Bou Avia la notation de tranche [h>t::2].

Jonathan Allan
la source
0

Perl, 107 octets

Prend la longueur des cheveux en premier, la longueur de la tour en second.

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
la source
Vous pouvez vous débarrasser du `` '' et prévoir votre code de 4 espaces pour le rendre plus agréable ..
Roman Gräf