Vers le haut et en avant vers une plus grande gloire!


15

Puisse ce défi rendre ( un autre ) hommage à Stan Lee, décédé à l'âge de 95 ans.

Stan Lee nous a laissé un héritage inestimable et un mot d'ordre particulier: Excelsior . Voici donc un petit défi basé sur ce qu'il a dit que c'était sa signification :

Enfin, que signifie «Excelsior»? "Vers le haut et en avant vers une plus grande gloire!" C'est ce que je vous souhaite chaque fois que je termine tweet! Excelsior!

Défi

Étant donné une série d'entiers non négatifs, affichez une ligne à Excelsior!chaque fois qu'un entier est supérieur à la précédente.

Règles

  • L'entrée sera un tableau d'entiers non négatifs.
  • La sortie consistera en lignes avec le mot Excelsior(la casse importe) suivi par autant !que la longueur de la course actuelle de nombres de plus en plus grands. Vous pouvez également renvoyer un tableau de chaînes.
  • Les formats d'entrée et de sortie sont flexibles selon les règles du site, alors n'hésitez pas à les adapter à vos formats de langue. Vous pouvez également ajouter des espaces à la fin des lignes, ou même de nouvelles lignes supplémentaires après ou avant le texte si vous en avez besoin.

Exemples

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

C'est le , donc le code le plus court pour chaque langue peut gagner!


ouflak suppose que les entiers sont à 1 chiffre, est-ce correct
ASCII uniquement

1
@ ASCII seulement pas vraiment. Je ne sais pas si LUA a une limitation avec ça, mais si ce n'est pas le cas, ouflak devrait analyser des entiers de n'importe quelle longueur.
Charlie

@Charlie Je ne connais pas Lua, mais bien qu'elle soit verbeuse, il est possible de prendre par exemple une entrée délimitée par un espace et de la diviser comme ceci .
Kevin Cruijssen

Je regarde ça. L'astuce est de pouvoir gérer les deux scénarios.
ouflak

Les langages FWIW comme C ou Javascript ne traiteront de toute façon que les entiers dans sa précision (9/16 chiffres).
user202729

Réponses:


9

JavaScript (ES6), 58 54 octets

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

Essayez-le en ligne!

Commenté

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

Pourquoi réutiliser un [] pour stocker la valeur précédente est sûr

Il y a trois cas possibles:

  • Si a[ ] est vide, la fonction de rappel de .map()n'est pas du tout invoquée et nous obtenons simplement un tableau vide, produisant une chaîne vide.
  • Si a[ ] contient exactement un élément x , il est contraint à cet élément lors du premier (et unique) test a < (a = c). Donc, nous testons x<x , ce qui est faux. Nous obtenons un tableau contenant une chaîne vide, donnant à nouveau une chaîne vide.
  • Si a[ ] contient plusieurs éléments, il est contraint NaNlors du premier test a < (a = c). Par conséquent, le résultat est faux et ce qui est exécuté est l'initialisation de s dans une chaîne vide - c'est ce que nous voulons. La première comparaison significative se produit à la 2e itération.


5

05AB1E , 26 24 23 octets

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

-2 octets grâce à @Kroppeb .

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

ü                        # 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

Voir cette astuce de mes 05AB1E (section Comment chaînes Compresser ne font pas partie du dictionnaire? ) Pour comprendre pourquoi .•1Š¥èò²•est "excelsior".


2
Je ne connais pas vraiment 05AB1E mais tu ne peux pas échanger 0Kgavec O?
Kroppeb

@ Kroppeb Ah, j'ai complètement raté ça, mais oui, je le peux. Merci! :)
Kevin Cruijssen

5

Perl 6 , 60 58 57 octets

-1 octet grâce à nwellnhof

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

Essayez-le en ligne!

Bloc de code anonyme qui renvoie une liste d'Excelsiors!


4

Java-8 118 113 Octets

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 à lire :

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
Voici quelques pour sauver 10 Golfs octets: 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+="!":"";}. Essayez-le en ligne ( 108 octets ). (Java 10+)
Kevin Cruijssen

@KevinCruijssen Merci!
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 octets )
Olivier Grégoire

Correction de mon problème: ++eau lieu d'en e++avoir au moins un !à imprimer.
Olivier Grégoire

1
@KevinCruijssen Petite faute de frappe dans votre golf pour vous faire gagner un octet: e=...?e+"!":au lieu de e=...?e+="!":.
Olivier Grégoire

4

R , 86 octets

La moitié de cette réponse est celle de @ Giuseppe. RIP Stan Lee.

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

Essayez-le en ligne!


4

05AB1E , 20 19 octets

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

Essayez-le en ligne!

Explication

ü‹                    # 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 octets

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

Merci à gastropner pour avoir joué au golf 2 octets.

Essayez-le en ligne ici .

Non golfé:

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

}

J'ai commencé à trouver une solution, mais je me suis retrouvé si près de la vôtre que poster la mienne comme réponse distincte était un peu idiot. Pourtant, les quelques différences qui existent peuvent vous faire économiser quelques octets.
gastropner

@gastropner Merci d'avoir partagé votre version. J'ai incorporé vos améliorations et je l'ai fait jouer à 99 octets. Si seulement nous n'avions pas besoin de gérer le tableau vide - sinon ce serait 97 octets , en utilisant votre style de boucle.
OOBalance

4

Japt -R, 25 22 octets

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

Essayez-le

3 octets économisés grâce à 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


le -R drapeau n'est pas réellement nécessaire, le défi dit que vous pouvez sortir un tableau de chaînes.
Kamil Drakari

Bien joué, merci, @KamilDrakari. J'ai essayé une solution en utilisant slicelors de mon premier passage, mais je l'ai rejetée lorsqu'elle a fonctionné trop longtemps. Pour y revenir maintenant, avec votre incitation, je suppose que j'aurais dû m'en tenir parce que je suis descendu à 22 aussi.
Shaggy

3

Lisp commun, 111 octets

(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 #\!))

Essayez-le en ligne!


3

Java 8, 106 octets

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;}

Essayez-le en ligne!

(ces réaffectations de s ... yikes)


Vous pouvez (s="")+s(s="")
jouer au

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 octets ) Déplacez le s=""pour libérer des octets.
Olivier Grégoire


3

R , 111 octets

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

Essayez-le en ligne!

Un hommage bien meilleur à R peut être trouvé ici - j'étais trop obsédé par sequenceet rle.


Cela ne donne pas quelques lignes vierges, mais 86 octets?
J.Doe

2
@ J.Doe dang, c'est bien mieux. Je posterais ça moi-même si j'étais toi.
Giuseppe

3

Gelée , 16 octets

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

Un lien monadique donnant une liste de listes de personnages.

Essayez-le en ligne!(le pied de page rejoint les nouvelles lignes)

Comment?

<Ɲṣ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 octets

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

Essayez-le en ligne!

Explication, avec exemple simplifié:

ò¨                       :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 octets

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

Script de test moins golfé:

$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
}

Production:

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

1
Voilà, j'essayais de faire fonctionner un pointeur de décalage mais je ne pouvais pas penser à comment.
Veskah

3

PowerShell , 87 85 octets

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

Essayez-le en ligne!

Il y a probablement une restructuration qui s'y cache, très probablement dans le cas contraire, mais dans l'ensemble assez bien. Utilise l'ol "" La variable non instanciée par défaut à 0 "pour à la fois faire l'index et le !.


2

Rétine , 55 octets

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

Essayez-le en ligne! Le lien inclut des cas de test. Explication:

\d+
*

Convertissez en unaire.

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

Traitez les correspondances qui se chevauchent de droite à gauche (bien que les correspondances soient ensuite répertoriées de gauche à droite). Cela signifie que nous pouvons faire correspondre chaque numéro dans une course, et la correspondance s'étend jusqu'au début de la course. Chaque correspondance est en outre contrainte que chaque numéro correspondant supplémentaire doit être inférieur au numéro supplémentaire précédemment correspondant, ou au premier numéro si aucun numéro supplémentaire n'a encore été mis en correspondance.

L$...
Excelsior$#1*!

Pour chaque correspondance, sortez Excelsioravec le nombre de numéros supplémentaires dans la course comme vous le souhaitez.


2

Pyth, 32 octets

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

Essayez-le en ligne ici ou vérifiez tous les cas de test en même temps ici .

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 octets

Merci @Kevin Cruijssen pour la mise à jour en respectant l'esprit de la question d'origine.

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

Essayez-le en ligne!


1
Désolé mais vous devez imprimer le point d'exclamation selon les règles (un point d'exclamation par longueur de la course actuelle de nombres toujours plus grands).
Charlie

Aucun problème. Je pense que j'ai fait autant que je peux faire ici à moins que quelqu'un d'autre ne voie quelque chose ...
ouflak

1
Je ne connais pas trop Lua, mais voici un correctif pour votre code afin qu'il exécute tous les cas de test correctement. Actuellement, vous imprimez simplement un "!" plus chaque fois qu'un nombre est supérieur au précédent, mais vous ne le réinitialisez pas à 1 lorsque ce n'est pas le cas. Il y a probablement plus de golf, mais comme je n'ai jamais joué à Lua, je me suis concentré sur la réparation avec seulement des golfs mineurs. PS: Je ne sais pas si l'hypothèse que l'entrée est toujours à un seul chiffre est correcte ..
Kevin Cruijssen

2
Puisque @Charlie a mentionné dans un commentaire ci-dessous la description du défi qu'il devrait être possible de prendre des nombres à plusieurs chiffres en entrée, voici une solution possible en prenant une entrée délimitée par un espace et en la divisant .
Kevin Cruijssen

J'ai décidé que les modifications de Kevin Cruijssen étaient plus conformes aux attentes du PO. Merci!
ouflak

2

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

[](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;}

Heureusement, std::stringun constructeur répète a char. Essayez-le en ligne ici .

Merci à gastropner pour avoir économisé 5 octets.

Non golfé:

[] (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

}

Vous pouvez raser 5 autres octets
gastropner

2

C # (.NET de base) , 115 107 105 octets

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

Essayez-le en ligne!

-8 octets: changé b en une chaîne contenant "!" S d'un compteur int
-2 octets: défini b+="!" comme une fonction en ligne (grâce à Zac Faragher )

Utilise un délégué Action pour extraire l'entrée et ne nécessite pas de retour.

Non golfé:

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
vous pouvez économiser 2 octets en faisant l' b+="!"inline avec l'Excelsior if(a[i]>a[i-1])Console.WriteLine("Excelsior"+(b+="!")); Essayez-le en ligne!
Zac Faragher


2

J, 50 octets

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

Essayez-le en ligne!

non golfé

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

1

Java, 113 octets

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 octets

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

Malheureusement, ce n'est pas une solution valable car elle repose sur une variable ayant explicitement définie, a. Cela dit, si vous définissez la fonction comme un subroutinequi prend l'entrée comme une variante du tableau de types attendu, vous pouvez transformer votre approche en une solution valide. Une version Golfed de cette approche ressemblerait 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, où les ruptures entre les blocs de code représentent de nouvelles lignes
Taylor Scott

1

Python 3, 87 octets

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

Ou 97 avec ce qui suit:

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

Cela suppose que les entrées seront au format:

32105
12345
<null input>
1
1213415
333343

1
Votre premier programme n'est pas valide car il nécessite une entrée via une variable prédéfinie. Le second est invalide car il ne peut pas distinguer les numéros à plusieurs chiffres. Pourquoi ne pas utiliser Python 2 ou le transformer en fonction à la place?
Jo King

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.