Para cima e para a frente, para maior glória!


15

Que esse desafio sirva como ( mais ) homenagem a Stan Lee, que faleceu aos 95 anos.

Stan Lee nos deixou um legado inestimável e uma palavra de efeito peculiar: Excelsior . Então, aqui está um pequeno desafio baseado no que ele disse que era seu significado :

Finalmente, o que significa "Excelsior"? "Para cima e para a frente, para maior glória!" É isso que desejo a você sempre que terminar de twittar! Excelsior!

Desafio

Dada uma série de números inteiros não negativos, imprima uma linha Excelsior!sempre que um número inteiro for maior que o anterior.

Regras

  • A entrada será uma matriz de números inteiros não negativos.
  • A saída consistirá em linhas com a palavra Excelsior(maiúsculas e minúsculas), seguidas de tantas !quanto a duração da execução atual de números cada vez maiores. Você também pode retornar uma matriz de seqüências de caracteres.
  • Os formatos de entrada e saída são flexíveis de acordo com as regras do site, portanto, sinta-se à vontade para adaptá-los aos seus formatos de idioma. Você também pode adicionar espaços no final das linhas, ou até mesmo novas linhas extras antes ou antes do texto, se necessário.

Exemplos

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

Este é o , portanto, pode ganhar o código mais curto para cada idioma!


ouflak assume inteiros são 1 dígito muito tempo, é que ok
ASCII-only

1
@ ASCII-somente não realmente. Não sei se LUA tem uma limitação com isso, mas se esse não for o caso, o ouflak deve analisar números inteiros de qualquer tamanho.
Charlie

@ Charlie Eu não conheço Lua, mas, embora seja detalhado, é possível pegar, por exemplo, uma entrada delimitada por espaço e dividir assim .
21718 Kevin Kevin Krijssen

Eu estou olhando para isso. O truque é ser capaz de lidar com os dois cenários.
ouflak

Linguagens FWIW como C ou Javascript manipularão apenas números inteiros dentro de sua precisão (9/16 dígitos) de qualquer maneira.
user202729

Respostas:


9

JavaScript (ES6), 58 54 bytes

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

Experimente online!

Comentado

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

Por que reutilizar um [] para armazenar o valor anterior é seguro

Existem três casos possíveis:

  • Se a[ ] estiver vazio, a função de retorno de chamada de.map()não será invocada e apenas obteremos uma matriz vazia, produzindo uma string vazia.
  • Se a[ ] contiver exatamente um elemento x , ele será coagido a esse elemento durante o primeiro (e único) teste a < (a = c). Então, estamos testando x<x , o que é falso. Nós obtemos uma matriz contendo uma string vazia, produzindo novamente uma string vazia.
  • Se a[ ] contiver vários elementos, ele será coagido NaNdurante o primeiro teste a < (a = c). Portanto, o resultado é falso e o que é executado é a inicialização de s em uma string vazia - que é o que queremos. A primeira comparação significativa ocorre na 2ª iteração.


5

05AB1E , 26 24 23 bytes

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

-2 bytes graças a @Kroppeb .

Experimente online ou verifique todos os casos de teste .

Explicação:

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

Veja este 05AB1E ponta do meu (seção Como cordas compressa não fazem parte do dicionário? ) Para entender por que .•1Š¥èò²•é "excelsior".


2
Eu realmente não sei 05AB1E mas você não pode trocar o 0Kgcom O?
Kroppeb

@ Kroppeb Ah, perdi completamente isso, mas sim, eu realmente posso. Obrigado! :)
Kevin Cruijssen

5

Perl 6 , 60 58 57 bytes

-1 byte graças a nwellnhof

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

Experimente online!

Bloco de código anônimo que retorna uma lista de Excelsiors!


4

Java-8 118 113 bytes

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

Fácil de ler :

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
Aqui alguns campos de golfe para salvar 10 bytes: 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+="!":"";}. Experimente online ( 108 bytes ). (Java 10+)
Kevin Cruijssen 14/11

@KevinCruijssen Thanks!
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 bytes )
Olivier Grégoire 14/11

Corrigindo meu problema: em ++evez de e++haver pelo menos um !para ser impresso.
Olivier Grégoire

1
@KevinCruijssen Pequeno erro de digitação no seu golfe para fazer você ganhar um byte: em e=...?e+"!":vez de e=...?e+="!":.
Olivier Grégoire

4

R , 86 bytes

Metade desta resposta é da Giuseppe. RIP Stan Lee.

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

Experimente online!


4

05AB1E , 20 19 bytes

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

Experimente online!

Explicação

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

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

Graças a gastropner por jogar 2 bytes.

Experimente online aqui .

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

}

Comecei a fazer uma solução, mas acabei tão perto da sua que postar a minha como uma resposta separada parecia um pouco tolo. Ainda assim, as poucas diferenças existentes podem economizar alguns bytes.
Gastropner

@gastropner Obrigado por compartilhar sua versão. Eu incorporei suas melhorias e joguei ainda mais em 99 bytes. Se não precisássemos lidar com a matriz vazia - caso contrário, seriam 97 bytes , usando seu estilo de loop.
OOBalance

4

Japonês -R, 25 22 bytes

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

Tente

3 bytes salvos graças 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


A -Rbandeira não é realmente necessária, o desafio diz que você pode gerar uma série de strings.
Kamil Drakari #

Bom, obrigado, @KamilDrakari. Tentei uma solução usando slicena minha primeira passagem, mas a rejeitei quando funcionou por muito tempo. Voltando agora, com a sua solicitação, acho que eu deveria ter ficado com ela, porque também diminuía para 22.
Shaggy

3

Lisp comum, 111 bytes

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

Experimente online!


3

Java 8, 106 bytes

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

Experimente online!

(aquelas reatribuições de s... caramba)


Você pode jogar com mais dois bytes substituindo (s="")+s=>(s="")
OOBalance

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 bytes ) Mova s=""para os bytes sobressalentes.
Olivier Grégoire


3

R , 111 bytes

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

Experimente online!

Um tributo R muito melhor pode ser encontrado aqui - eu estava muito fixado em sequencee rle.


Isso não fornece algumas linhas em branco, mas 86 bytes?
J.Doe

2
@ J.Doe dang, isso é muito melhor. Eu mesmo postaria se fosse você.
21418 Giuseppe

3

Gelatina , 16 bytes

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

Um link monádico que produz uma lista de listas de caracteres.

Experimente online!(rodapé se junta a novas linhas)

Quão?

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

Japonês , 22 bytes

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

Experimente online!

Explicação, com exemplo simplificado:

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

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

Script de teste com menos golfe:

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

Resultado:

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

1
Lá está, eu estava tentando fazer um ponteiro de atraso funcionar, mas não conseguia pensar em como.
Veskah

3

PowerShell , 87 85 bytes

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

Experimente online!

Provavelmente há uma reestruturação escondida lá, provavelmente no if-else, mas no geral bem. Utiliza o velho truque "Variável não instanciada para 0" para fazer o índice e o !.


2

Retina , 55 bytes

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

Experimente online! O link inclui casos de teste. Explicação:

\d+
*

Converta para unário.

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

Processe correspondências sobrepostas da direita para a esquerda (embora as correspondências sejam listadas da esquerda para a direita). Isso significa que podemos combinar todos os números de uma corrida, e a partida se estende até o início da corrida. Cada correspondência é ainda mais restrita que cada número correspondente correspondente deve ser menor que o número adicional correspondente anteriormente ou o primeiro número se nenhum número adicional ainda tiver sido correspondido.

L$...
Excelsior$#1*!

Para cada correspondência, imprima Excelsiorcom o número de números adicionais na execução, conforme desejado.


2

Pitão, 32 bytes

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

Experimente online aqui ou verifique todos os casos de teste de uma vez aqui .

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 bytes

Obrigado a Kevin Cruijssen pela atualização que segue o espírito da pergunta original.

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

Experimente online!


1
Sorry but you need to print the exclamation mark according to the rules (one exclamation mark per length of the current run of increasingly greater numbers).
Charlie

No problem. Think I've done as much as I can do here unless someone else sees something...
ouflak

1
I don't know Lua too well, but here is a fix for your code so it runs all test cases correctly Currently you just print an "!" more every time a number is higher than the previous, but you don't reset it back to 1 when that isn't the case. More can probably be golfed, but since I've never golfed in Lua I focused on fixing it with only minor golfs. PS: Not sure if assuming the input are always single digits is correct..
Kevin Cruijssen

2
Como o @Charlie mencionou em um comentário abaixo a descrição do desafio que deveria ser possível usar números de vários dígitos como entrada, aqui uma solução possível é pegar uma entrada delimitada por espaço e dividir nela .
Kevin Cruijssen

Decidi que as modificações de Kevin Cruijssen estão mais alinhadas com as expectativas do OP. Obrigado!
ouflak

2

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

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

Felizmente std::string has a constructor that repeats a char. Try it online here.

Thanks to gastropner for saving 5 bytes.

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

}

Você pode raspar mais 5 bytes
gastropner

2

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

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

Experimente online!

-8 bytes: alterado b para uma string contendo "!" S a partir de um contador int
-2 bytes: definido b+="!" como uma função embutida (graças a Zac Faragher )

Usa um delegado de Ação para receber a entrada e não exigir um retorno.

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
você pode economizar 2 bytes, b+="!"alinhando com o Excelsior if(a[i]>a[i-1])Console.WriteLine("Excelsior"+(b+="!")); Experimente online!
Zac Faragher


2

J, 50 bytes

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

Experimente online!

destroçado

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

1

Java, 113 bytes

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 bytes

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

Unfortunately, this is not a valid solution as it relies on having an explicitly defined variable, a. That said, if you define the function as a subroutine that takes the input as a variant of expected type array, then you can turn your approach into a valid solution. A Golfed version of that approach would look like 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, where the breaks between code block represent new lines
Taylor Scott

1

Python 3, 87 bytes

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

Or 97 with the following:

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

This assumes inputs will be in the format:

32105
12345
<null input>
1
1213415
333343

1
Your first program is invalid as it takes input through a predefined variable. The second is invalud as it can't distinguish between numbers with multiple digits. Why not use Python 2 or turn it into a function instead?
Jo King

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.