Verso l'alto e poi verso una maggiore gloria!


15

Possa questa sfida servire come ( un altro ) omaggio a Stan Lee, morto all'età di 95 anni.

Stan Lee ci ha lasciato un'eredità inestimabile e una parolaccia particolare: Excelsior . Quindi ecco una piccola sfida basata su ciò che ha detto che era il suo significato :

Infine, cosa significa "Excelsior"? "Verso l'alto e poi verso una maggiore gloria!" Questo è quello che ti auguro ogni volta che finisco di twittare! Excelsior!

Sfida

Data una serie di numeri interi non negativi, genera una riga Excelsior!ogni volta che un numero intero è maggiore di quello precedente.

Regole

  • L'input sarà un array di numeri interi non negativi.
  • L'output sarà costituito da righe con la parola Excelsior(il caso è importante) seguite da !un numero sempre maggiore di lunghezza della sequenza corrente. È inoltre possibile restituire una matrice di stringhe.
  • I formati di input e output sono flessibili in base alle regole del sito, quindi sentiti libero di adattarli ai formati della tua lingua. Puoi anche aggiungere spazi alla fine delle linee, o anche nuove righe extra dopo o prima del testo, se necessario.

Esempi

Input             Output
-----------------------------------
[3,2,1,0,5]       Excelsior!      // Excelsior because 5 > 0

[1,2,3,4,5]       Excelsior!      // Excelsior because 2 > 1
                  Excelsior!!     // Excelsior because 3 > 2 (run length: 2)
                  Excelsior!!!    // Excelsior because 4 > 3 (run length: 3)
                  Excelsior!!!!   // Excelsior because 5 > 4 (run length: 4)

[]                <Nothing>

[42]              <Nothing>

[1,2,1,3,4,1,5]   Excelsior!      // Excelsior because 2 > 1
                  Excelsior!      // Excelsior because 3 > 1
                  Excelsior!!     // Excelsior because 4 > 3 (run length: 2)
                  Excelsior!      // Excelsior because 5 > 1

[3,3,3,3,4,3]     Excelsior!      // Excelsior because 4 > 3

Questo è , quindi può vincere il codice più breve per ogni lingua!


ouflak presume che i numeri interi siano lunghi 1 cifra, è ok
solo ASCII il

1
@ ASCII-solo non proprio. Non so se LUA abbia una limitazione in tal senso, ma in caso contrario ouflak dovrebbe analizzare numeri interi di qualsiasi lunghezza.
Charlie,

@Charlie Non conosco Lua, ma sebbene sia prolisso, è possibile prendere ad esempio un input delimitato da spazi e dividerlo in questo modo .
Kevin Cruijssen,

Lo sto guardando. Il trucco è riuscire a gestire entrambi gli scenari.
ouflak,

I linguaggi FWIW come C o Javascript gestiranno comunque solo numeri interi con precisione (9/16 cifre).
user202729

Risposte:


9

JavaScript (ES6), 58 54 byte

a=>a.map(c=>a<(a=c)?`Excelsior${s+='!'}
`:s='').join``

Provalo online!

Commentate

a =>                           // a[] = input array, also used to store the previous value
  a.map(c =>                   // for each value c in a[]:
    a <                        //   compare the previous value
    (a = c)                    //   with the current one; update a to c
                               //   this test is always falsy on the 1st iteration
    ?                          //   if a is less than c:
      `Excelsior${s += '!'}\n` //     add a '!' to s and yield 'Excelsior' + s + linefeed
    :                          //   else:
      s = ''                   //     reset s to an empty string and yield an empty string
  ).join``                     // end of map(); join everything

Perché riutilizzare un [] per memorizzare il valore precedente è sicuro

Esistono tre casi possibili:

  • Se a[ ] è vuoto, la funzione di callback di .map()non viene affatto invocata e otteniamo solo un array vuoto, producendo una stringa vuota.
  • Se a[ ] contiene esattamente un elemento x , viene costretto a quell'elemento durante il primo (e unico) test a < (a = c). Quindi, stiamo testando x<x , che è falso. Otteniamo un array che contiene una stringa vuota, restituendo una stringa vuota.
  • Se a[ ] contiene diversi elementi, viene forzato NaNdurante il primo test a < (a = c). Pertanto, il risultato è falso e ciò che viene eseguito è l'inizializzazione di s in una stringa vuota, che è ciò che vogliamo. Il primo confronto significativo si verifica alla seconda iterazione.


5

05AB1E , 26 24 23 byte

ü‹γvyOE.•1Š¥èò²•™N'!׫,

-2 byte grazie a @Kroppeb .

Provalo online o verifica tutti i casi di test .

Spiegazione:

ü                        # Loop over the (implicit) input as pairs
                        #  And check for each pair [a,b] if a<b is truthy
                         #   i.e. [1,2,1,3,4,1,5,7,20,25,3,17]
                         #   → [1,0,1,1,0,1,1,1,1,0,1]
  γ                      # Split it into chunks of equal elements
                         #  i.e. [1,0,1,1,0,1,1,1,1,0,1]
                         #   → [[1],[0],[1,1],[0],[1,1,1,1],[0],[1]]
   vy                    # Foreach `y` over them
     O                   #  Take the sum of that inner list
                         #   i.e. [1,1,1,1] → 4
                         #   i.e. [0] → 0
      E                  #  Inner loop `N` in the range [1, length]:
       .•1Š¥èò²•         #   Push string "excelsior"
                        #   Titlecase it: "Excelsior"
                 N'!׫  '#   Append `N` amount of "!"
                         #    i.e. N=3 → "Excelsior!!!"
                      ,  #   Output with a trailing newline

Vedere questo 05AB1E punta del mio (sezione Come stringhe di comprimere che non fanno parte del dizionario? ) Per capire il motivo per cui .•1Š¥èò²•è "excelsior".


2
Non conosco davvero 05AB1E ma non puoi scambiarlo 0Kgcon O?
Kroppeb,

@Kroppeb Ah, l'ho perso del tutto, ma sì, davvero posso. Grazie! :)
Kevin Cruijssen,

5

Perl 6 , 60 58 57 byte

-1 byte grazie a nwellnhof

{"Excelsior"X~("!"Xx grep +*,[\[&(-+^*×*)]] .skip Z>$_)}

Provalo online!

Blocco di codice anonimo che restituisce un elenco di Excelsiors!


4

Java-8 118 113 byte

n->{String e="";for(int i=0;i<n.length-1;)System.out.print(""==(n[i+1]>n[i++]?e+="!":(e=""))?e:"Excelsior"+e+"\n");}

Facile da leggere :

private static void lee(int num[]) {
    String exclamation = "";
    for (int i = 0; i < num.length - 1;) {
        exclamation = num[i + 1] > num[i++] ? exclamation += "!" : "";
        System.out.print("".equals(exclamation) ? "" : "Excelsior" + exclamation + "\n");
    }
}

2
Ecco alcuni golf per salvare 10 byte: n->{var e="";for(int i=0;i<n.length-1;System.out.print(""==e?e:"Excelsior"+e+"\n"))e=n[i++]<n[i]?e+="!":"";}. Provalo online ( 108 byte ). (Java 10+)
Kevin Cruijssen,

@KevinCruijssen Grazie!
CoderCroc

2
n->{for(int e=0,i=0;i<n.length-1;)if(n[i++]<n[i])System.out.println("Excelsior"+"!".repeat(e++));else e=0;}( 107 byte )
Olivier Grégoire,

Risolve il mio problema: ++eanziché in e++modo che ce ne sia almeno uno !da stampare.
Olivier Grégoire,

1
@KevinCruijssen Piccolo errore di battitura nel tuo golf per farti guadagnare un byte: e=...?e+"!":anziché e=...?e+="!":.
Olivier Grégoire,

4

R , 86 byte

La metà di questa risposta è @ Giuseppe's. RIP Stan Lee.

function(a)for(i in diff(a))"if"(i>0,cat("Excelsior",rep("!",F<-F+1),"
",sep=""),F<-0)

Provalo online!


4

05AB1E , 20 19 byte

ü‹0¡€ƶ˜ε'!×”¸Îsiorÿ

Provalo online!

Spiegazione

ü‹                    # pair-wise comparison, less-than
  0¡                  # split at zeroes
    €ƶ                # lift each, multiplying by its 1-based index
      ˜               # flatten
       ε              # apply to each
        '!×           # repeat "!" that many times
                  ÿ   # and interpolate it at the end of
           ”¸Îsior    # the compressed word "Excel" followed by the string "sior"

4

C (gcc / clang), 106 99 97 byte

f(a,n)int*a;{int r=0,s[n];for(memset(s,33,n);n-->1;)r*=*a<*++a&&printf("Excelsior%.*s\n",++r,s);}

Grazie a gastropner per giocare a golf 2 byte.

Provalo online qui .

Ungolfed:

f(a, n) // function taking a pointer to the first integer and the length of the array
  int *a; { // a is of type pointer to int, n is of type int

    int r = 0, // length of the current run
        i = 0, // loop variable
        s[n];  // buffer for exclamation marks; we will never need more than n-1 of those (we are declaring an array of int, but really we will treat it as an array of char)

    for(memset(s, 33, n); // fill the buffer with n exclamation marks (ASCII code 33)
        n -- > 1; ) // loop over the array

        r *= *a < *(++ a) // if the current element is less than the next:
             && printf("Excelsior%.*s\n", // print (on their own line) "Excelsior", followed by ...
                       ++ r, // ... r (incremented) of the ...
                       s) // ... n exclamation marks in the buffer s
             ; // else r is reset to 0

}

Ho iniziato a trovare una soluzione, ma sono finito così vicino al tuo che pubblicare la mia come risposta separata mi è sembrato un po 'sciocco. Tuttavia, le poche differenze esistenti possono farti risparmiare qualche byte.
Gastropner,

@gastropner Grazie per aver condiviso la tua versione. Ho incorporato i tuoi miglioramenti e ho continuato a giocare a golf a 99 byte. Se solo non avessimo bisogno di gestire l'array vuoto, altrimenti sarebbe 97 byte , usando il tuo stile di loop.
OOBalance,

4

Japt -R, 25 22 byte

ò¨ ËÅ£`Ex­lÐâ`ú'!Y+A
c

Provalo

3 byte salvati grazie a Kamil

ò¨                      :Partition at items that are greater than or equal to the previous item
   Ë                    :Map
    Å                   :  Slice off the first element
     £                  :  Map each element at 0-based index Y
      `Ex­lÐâ`           :    Compressed string "Excelsior"
             ú'!        :    Right pad with exclamation marks
                Y+A     :     To length Y+10
c                       :Flatten
                        :Implicitly join with newlines & output


Il -Rflag non è effettivamente necessario, la sfida dice che puoi produrre una serie di stringhe.
Kamil Drakari,

Bello, grazie, @KamilDrakari. Ho provato una soluzione usando sliceil mio primo passaggio ma l'ho scartata quando ha funzionato troppo a lungo. Tornando a questo ora, con il tuo suggerimento, immagino che avrei dovuto restare bloccato perché ho portato anche a 22.
Shaggy,

3

Lisp comune, 111 byte

(setq i 0)(loop for(a b)on(read)do(incf i(if(and b(> b a))1(- i)))(format(> i 0)"Excelsior~v@{~a~:*~}~%"i #\!))

Provalo online!


3

Java 8, 106 byte

n->{String s="",z=s;for(int i=0;i<n.length-1;)z+=n[i++]<n[i]?"Excelsior"+(s+="!")+"\n":(s="")+s;return z;}

Provalo online!

(quelle riassegnazioni di s... yikes)


Puoi giocare a golf altri due byte sostituendo (s="")+s=>(s="")
OOBalance il

1
n->{String s="",z=s;for(int i=0;i<n.length-1;)z+=n[i++]>=n[i]?s="":"Excelsior"+(s+="!")+"\n";return z;}( 103 byte ) Spostare i s=""byte di riserva.
Olivier Grégoire,


3

R , 111 byte

function(a,r=rle(sign(diff(a))),v=r$l[r$v>0])write(paste0(rep("Excelsior",sum(v)),strrep("!",sequence(v))),1,1)

Provalo online!

Un tributo R di gran lunga migliore può essere trovato qui - ero troppo fissato su sequencee rle.


Questo non dà alcune righe vuote, ma 86 byte?
J.Doe,

2
@ J.Doe dang, è molto meglio. Lo pubblicherei se fossi in te.
Giuseppe,

3

Gelatina , 16 byte

<Ɲṣ0ÄẎ”!ẋ“Ø6ḥ»;Ɱ

Un collegamento monadico che fornisce un elenco di elenchi di caratteri.

Provalo online! (il piè di pagina si unisce alle nuove righe)

Come?

<Ɲṣ0ÄẎ”!ẋ“Ø6ḥ»;Ɱ - Link: list of integers     e.g. [1,1,4,2,1,1,3,4]
 Ɲ               - for each pair of integers:      [1,1] [1,4] [4,2] [2,1] [1,1] [1,3] [3,4]
<                -   less than?                    [  0,    1,    0,    0,    0,    1,    1]
  ṣ0             - split at zeros                  [[],    [1],     [],   [],      [1,    1]]
    Ä            - cumulative sums                 [[],    [1],     [],   [],      [1,    2]]
     Ẏ           - tighten                         [1,1,2]
      ”!         - literal '!' character           '!'
        ẋ        - repeat (vectorises)             [['!'],['!'],['!','!']]
         “Ø6ḥ»   - dictionary lookup               ['E','x','c','e','l','s','i','o','r']
               Ɱ - map with:
              ;  -   concatenate                   [['E','x','c','e','l','s','i','o','r','!'],['E','x','c','e','l','s','i','o','r','!'],['E','x','c','e','l','s','i','o','r','!','!']]


3

Japt , 22 byte

ò¨ ®£`Ex­lÐâ`+'!pYÃÅÃc

Provalo online!

Spiegazione, con esempio semplificato:

ò¨                       :Split whenever the sequence does not increase
                           e.g. [2,1,1,3] -> [[2],[1],[1,3]]
   ®               Ã     :For each sub-array:
    £            Ã       :  For each item in that sub-array:
     `Ex­lÐâ`             :    Compressed "Excelsior"
            +            :    Concat with
             '!pY        :    a number of "!" equal to the index
                               e.g. [1,3] -> ["Excelsior","Excelsior!"]
                  Å      :  Remove the first item of each sub-array
                            e.g. [[Excelsior],[Excelsior],[Excelsior,Excelsior!]]->[[],[],[Excelsior!]]
                    c    :Flatten
                           e.g. [[],[],[Excelsior!]] -> [Excelsior!]

3

Powershell, 69 byte

$args|%{if($o-ne$e-and$_-gt$o){'Excelsior'+'!'*++$c}else{$c=0}$o=$_}

Script di test meno golfato:

$f = {

$args|%{
    if($old-ne$empty-and$_-gt$old){
        'Excelsior'+'!'*++$c
    }else{
        $c=0
    }
    $old=$_
}

}

@(
    ,( (3,2,1,0,5),  'Excelsior!')      # Excelsior because 5 > 0

    ,( (1,2,3,4,5),  'Excelsior!',      # Excelsior because 2 > 1
                    'Excelsior!!',     # Excelsior because 3 > 2 (run length: 2)
                    'Excelsior!!!',    # Excelsior because 4 > 3 (run length: 3)
                    'Excelsior!!!!')   # Excelsior because 5 > 4 (run length: 4)

    ,( $null,         '')                # <Nothing>

    ,( (42),          '')                # <Nothing>

    ,( (1,2,1,3,4,1,5), 'Excelsior!',      # Excelsior because 2 > 1
                        'Excelsior!',      # Excelsior because 3 > 1
                        'Excelsior!!',     # Excelsior because 4 > 3 (run length: 2)
                        'Excelsior!')      # Excelsior because 5 > 1

    ,( (3,3,3,3,4,3),   'Excelsior!')      # Excelsior because 4 > 3
) | % {
    $a,$expected = $_
    $result = &$f @a
    "$result"-eq"$expected"
    $result
}

Produzione:

True
Excelsior!
True
Excelsior!
Excelsior!!
Excelsior!!!
Excelsior!!!!
True
True
True
Excelsior!
Excelsior!
Excelsior!!
Excelsior!
True
Excelsior!

1
Eccolo, stavo cercando di far funzionare un puntatore di ritardo ma non riuscivo a pensare a come.
Veskah,

3

PowerShell , 87 85 byte

param($n)for(;++$i-lt$n.count){if($n[$i]-gt$n[$i-1]){"Excelsior"+"!"*++$c}else{$c=0}}

Provalo online!

Probabilmente c'è una ristrutturazione nascosta lì, molto probabilmente nell'if-if, ma nel complesso abbastanza bene. Utilizza il trucco "Variabile non istanziata per impostazione predefinita su 0" sia per rendere l'indice sia per !.


2

Retina , 55 byte

\d+
*
L$rv`(_*,(?<!(?(1)\1|\2,)))+(_+)\b
Excelsior$#1*!

Provalo online! Il link include casi di test. Spiegazione:

\d+
*

Converti in unario.

rv`(_*,(?<!(?(1)\1|\2,)))+(_+)\b

Elaborazione delle corrispondenze sovrapposte da destra a sinistra (anche se le corrispondenze vengono quindi elencate da sinistra a destra). Ciò significa che possiamo abbinare tutti i numeri di una corsa e la corrispondenza si estende all'inizio della corsa. Ogni corrispondenza è ulteriormente vincolata al fatto che ciascun numero abbinato aggiuntivo deve essere inferiore al numero aggiuntivo precedentemente abbinato, o al primo numero se non sono stati ancora abbinati numeri aggiuntivi.

L$...
Excelsior$#1*!

Per ogni corrispondenza, output Excelsiorcon il numero di numeri aggiuntivi nella corsa come desiderato.


2

Pyth, 32 byte

j+L"Excelsior"*L\!fT.u*hN<0Y.+Q0

Provalo online qui o verifica tutti i casi di test contemporaneamente qui .

j+L"Excelsior"*L\!fT.u*hN<0Y.+Q0   Implicit: Q=eval(input())
                            .+Q    Get forward difference between consecutive elements of Q
                    .u         0   Reduce the above, returning all steps, with current value N starting at 0, next element as Y, using:
                       hN            N+1
                      *              Multiplied by
                         <0Y         1 if 0<Y, 0 otherwise
                  fT               Filter to remove 0s
              *L\!                 Repeat "!" each element number of times
 +L"Excelsior"                     Prepend "Excelsior" to each
j                                  Join on newlines, implicit print


2

Lua , 88 87 83 82 96 95 113 byte

Grazie @Kevin Cruijssen per l'aggiornamento aderendo allo spirito della domanda originale.

s=io.read()n=9 e="Excelsior!"f=e
for c in s.gmatch(s,"%S+")do if n<c+0then print(e)e=e..'!'else e=f end n=c+0 end

Provalo online!


1
Siamo spiacenti ma è necessario stampare il punto esclamativo in base alle regole (un punto esclamativo per lunghezza della corsa corrente di numeri sempre più grandi).
Charlie,

Nessun problema. Penso di aver fatto tutto ciò che posso fare qui a meno che qualcun altro non veda qualcosa ...
ouflak,

1
Non conosco Lua troppo bene, ma ecco una correzione per il tuo codice, quindi esegue correttamente tutti i casi di test Attualmente stampi solo un "!" più ogni volta che un numero è superiore al precedente, ma non lo ripristini a 1 quando non è così. Probabilmente si può giocare di più, ma dal momento che non ho mai giocato a golf a Lua, mi sono concentrato sul risolverlo solo con golf minori. PS: Non sono sicuro che supponendo che l'input sia sempre a cifre singole sia corretto ..
Kevin Cruijssen

2
Dato che @Charlie ha menzionato in un commento sotto la descrizione della sfida che dovrebbe essere possibile prendere numeri a più cifre come input, ecco una possibile soluzione prendendo un input delimitato da spazi e diviso su di esso .
Kevin Cruijssen,

Ho deciso che le modifiche di Kevin Cruijssen sono più in linea con le aspettative del PO. Grazie!
ouflak,

2

C ++ 14 (g ++), 123 118 byte

[](auto a){for(int n=0,i=0;++i<a.size();)a[i]>a[i-1]?puts(&("Excelsior"+std::string(++n,33))[0]):n=0;}

Fortunatamente std::stringha un costruttore che ripete a char. Provalo online qui .

Grazie a Gastropner per il salvataggio di 5 byte.

Ungolfed:

[] (auto a) { // void lambda taking a std::array of integer

    for(int n = 0, // length of the current run
        i = 0; // loop variable
        ++ i < a.size(); ) // start with the second element and loop to the last
        a[i] > a[i - 1] // if the current element is greater than the previous ...
        ? puts( // ... print a new line:
               &("Excelsior" + // "Excelsior, followed by ...
                std::string(++ n, 33)) // ... the appropriate number of exclamation marks (33 is ASCII code for '!'); increment the run length
               [0]) // puts() takes a C string
        : n = 0; // else reset run length

}

Puoi radere via altri 5 byte
gastropner il

2

C # (.NET Core) , 115 107 105 byte

a=>{var b="";for(int i=0;++i<a.Length;)if(a[i]>a[i-1])Console.WriteLine("Excelsior"+(b+="!"));else b="";}

Provalo online!

-8 byte: modificato b in una stringa contenente "!" S da un contatore int
-2 byte: impostato b+="!" come funzione inline (grazie a Zac Faragher )

Utilizza un delegato all'azione per inserire l'input e non richiede un ritorno.

Ungolfed:

a => {
    var b = "";                         // initialize the '!' string (b)
    for(int i = 0; ++i < a.Length;)     // from index 1 until the end of a
        if(a[i] > a[i - 1])                 // if the current index is greater than the previous index
            Console.WriteLine("Excelsior" +     // on a new line, print "Excelsior"
                                    (b += "!"));    // add a "!" to b, and print the string
        else                                // if the current index is not greater than the previous index
            b = "";                             // reset b
}

1
puoi risparmiare 2 byte rendendo in b+="!"linea con Excelsior if(a[i]>a[i-1])Console.WriteLine("Excelsior"+(b+="!")); Provalo online!
Zac Faragher,

2

PHP , 117 109 byte

<?php do{$i=next($argv);if($p!==null&&$p<$i){$e.='!';echo "
Excelsior$e";}else$e='';$p=$i;}while($i!==false);

Provalo online!


2

J, 50 byte

'Excelsior',"1'!'#"0~[:;@(([:<+/\);._1)0,2</\ ::0]

Provalo online!

ungolfed

'Excelsior' ,"1 '!' #"0~ [: ;@(([: < +/\);._1) 0 , 2 </\ ::0 ]

1

Java, 113 byte

String i="";for(int a=0;a<s.length-1;a++){if(s[a+1]>s[a]){i+="!";System.out.println("Excelsior"+i);}else{i="";}}

1

VBA, 114 byte

For i=0 To UBound(a)-LBound(a)-1 If a(i+1)>a(i)Then s=s&"!" Debug.Print("Excelsior"&s&"") Else s="" End If Next i

Purtroppo, questa non è una soluzione valida in quanto si basa su avere una variabile definita in modo esplicito, a. Detto questo, se si definisce la funzione come una subroutineche accetta l'input come una variante dell'array di tipo previsto, è possibile trasformare il proprio approccio in una soluzione valida. Una versione Golfed di quell'approccio sarebbe simile sub f(x) For i=0To UBound(x)-1 If x(i+1)>x(i)Then s=s+"!":Debug.?"Excelsior"s:Else s="" Next End Sub, dove le interruzioni tra i blocchi di codice rappresentano nuove righe
Taylor Scott,

1

Python 3, 87 byte

c='!'
for i in range(1,len(n)):
    if n[i]>n[i-1]:print('Excelsior'+c);c+='!'
    else:c='!'

O 97 con il seguente:

c='!';n=input()
for i in range(1,len(n)):
    if n[i]>n[i-1]:print('Excelsior'+c);c+='!'
    else:c='!'

Ciò presuppone che gli input saranno nel formato:

32105
12345
<null input>
1
1213415
333343

1
Il tuo primo programma non è valido poiché accetta input tramite una variabile predefinita. Il secondo è invalud in quanto non è in grado di distinguere tra numeri con più cifre. Perché non usare Python 2 o trasformarlo invece in una funzione ?
Jo King,

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.