Rapunzel, Rapunzel, lasciati andare!


20

Descrizione

Immagino che tutti conoscano la fiaba di Rapunzel e il principe. Per chi non lo fa: leggilo qui. Tuttavia, Rapunzel si era appena fatta tagliare i capelli, quindi potrebbe non essere abbastanza lungo da permettere al suo principe di arrampicarsi! Potrebbe diventare molto triste ..

Sfida

Il tuo compito è quello di scrivere una funzione che valuti cosa dirà Rapunzel quando il principe la chiamerà per abbassare i capelli: quando i suoi capelli sono più lunghi o uguali alla torre sono alti più un metro extra (linee guida di sicurezza), diventa veeeery felice e dice Aaaah!, con il numero di as uguale a length of her hair - height of the tower. Altrimenti, i suoi capelli non hanno una lunghezza sufficiente e lei inizia a piangere:, Booho!dove la os davanti è huguale ai due terzi height of the tower - length of her hair, e la os dopo la h è il resto. Il numero di os dopo il Bdeve essere arrotondato, quindi se ottieni 2.6, ci saranno 3 se ogli altri devono essere dopo il h.

I / O

Ti vengono dati numeri interi positivi (incluso null) come argomenti, come un elenco o come due numeri singoli, nell'ordine che ritieni più conveniente, ma devi indicare in quale ordine li prendi. Come output, stampa ciò che Rapunzel dirà.

Casi test

Nei casi di test, il primo numero sarà la lunghezza dei capelli.

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

Questo è , quindi vince la risposta più breve in byte!


5
Quindi non può scendere se l'altezza della torre è 0? A proposito, numeri interi positivi (incluso null) == _n numeri interi negativi :)
Stewie Griffin

2
Volevo farlo sul tuo primo post, ma vorrei parlarti del Sandbox , dove puoi pubblicare le sfide per ottenere feedback prima di pubblicarle sul main. Sembra una sfida piuttosto interessante ma le persone possono lasciarsi trasportare.
caird coinheringaahing il

4
@StewieGriffin Sì, supponendo che anche la lunghezza dei suoi capelli sia 0. Tuttavia, deve uscire dalla finestra e le restrizioni per la sicurezza si applicano anche qui! Non può in alcun modo sposarlo se ha il collo rotto.
racer290,

Risposte:


5

Gelatina ,  43 41 40 38 34 33 32  31 byte

C'è probabilmente molto C'è un modo più breve però ! ? ... questo era un bel po 'di golf!

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

Un programma completo che stampa il risultato *.

Provalo online!

Come?

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

* Come collegamento monadico restituisce un elenco di caratteri e elenchi di caratteri ['B', [['o', 'o', 'h'], ['o']], '!'], ad es. , Come programma completo, la stampa implicita rompe questo ad es.Booho!



Sì, ho iniziato con l'idea di utilizzare AL€œs3e ho trovato div per zero errori e poi dopo aver risolto il problema con il codice molto più lungo sopra trovato, avevo ancora bisogno del caso speciale del caso di uguale lunghezza. Ho pensato di provare ad implementare un modo diverso oggi, ma sembra che tu l'abbia già fatto.
Jonathan Allan,

... badate che stavo pensando 25-30 byte :)
Jonathan Allan il

4

Python 3 , 87 byte

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

Provalo online!

Argomenti della funzione sono presi nell'ordine length of hair, height of tower.


4

05AB1E , 38 35 32 byte

Ordine di ingresso: length of hair,height of tower

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

Provalo online!

Spiegazione

‹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 "!"

Sembra che tu abbia dimenticato un 3che è mostrato su TIO.
Erik the Outgolfer,

@EriktheOutgolfer: Grazie per avermelo avvisato. Ho corretto la spiegazione per
renderla

Oh, e hai problemi di spaziatura con la tua spiegazione.
Erik the Outgolfer,

@EriktheOutgolfer: non lo vedo. Se intendi il fatto che si trovano su 2 linee diagonali, questa è una separazione intenzionale di if-else per ridurre lo spazio orizzontale utilizzato. Se c'è qualcos'altro, devo essere cieco.
Emigna,

Oh, ero confuso con lo spazio bianco estraneo in esso ...
Erik the Outgolfer

4

Javascript, 105 97 byte

Grazie a Oki per aver contribuito a salvare 7 byte!

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

Definisce una funzione di curry anonima. Usa comef(length)(height)

Provalo online!


Non sembra funzionare per f(1)(4). La sostituzione p(o+d)con p(-o-d)potrebbe risolvere questo problema. Inoltre è possibile utilizzare o=-d*2/3+.5|0per salvare 7 byte.
Oki,

@Oki grazie per aver segnalato quell'errore e avermi mostrato l'arrotondamento più breve!
DanTheMan,

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



0

Julia, 101 byte

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

Argomenti della funzione sono presi nell'ordine length of Hair, height of Tower.



0

Gelatina , 84 76 byte

È davvero piuttosto lungo, ma ho speso troppo tempo per non pubblicarlo. Accetta due argomenti interi:

  1. lunghezza dei capelli
  2. lunghezza della torre

Qualche consiglio sul golf sarebbe apprezzato.

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

Provalo online!


bene, c'è già una risposta Jelly molto più breve
Cœur

0

R, 117 byte

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 po 'lungo, abbastanza sicuro che questo possa essere risolto. Riceve input da STDIN nell'ordine Tower, Hair.


Uh Oh; questo in realtà non funziona per input1 4
Giuseppe,


0

Python 2 , 77 byte

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

Una funzione senza nome che prende la lunghezza dei capelli he l'altezza della torre te restituisce una stringa.

Provalo online!

Crea una stringa che inizia con BA, seguita da due terzi della differenza arrotondata della stringa oaripetuta, seguita da una singola h, quindi la quantità rimanente di aoripetuta e infine h!!. Il valore restituito è quindi ogni secondo carattere che inizia con Bo Atramite la notazione di sezione [h>t::2].


0

Perl, 107 byte

Prende prima la lunghezza dei capelli, poi la lunghezza della 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))}).'!'}

Puoi sbarazzarti di `` '' e intendi il tuo codice di 4 spazi per renderlo più bello ..
Roman Gräf
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.