向上并向前迈向更大的荣耀!


15

可这一挑战作为(另一个)致敬斯坦·李,谁去世95岁。

斯坦·李(Stan Lee)给我们留下了无价的遗产和奇特的口号:Excelsior。因此,根据他所说的含义,这是一个小挑战:

最后,“ Excelsior”是什么意思?“向上并向前迈向更大的荣耀!”这就是我在发推文时希望您的一切!精益求精!

挑战

给定一系列非负整数,Excelsior!每当一个整数大于前一个整数时,输出一行。

规则

  • 输入将是非负整数的数组。
  • 输出将由带有单词的行Excelsior(大小写无关紧要)组成,后跟多达!当前行的长度(数量越来越大)。您还可以返回字符串数组。
  • 输入和输出格式根据站点规则是灵活的,因此可以随时根据您的语言格式进行调整。您还可以在行末添加空格,如果需要,甚至可以在文本之后或之前添加额外的新行。

例子

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

这是,因此每种语言的最短代码可能会胜出!


ouflak假设整数为1位数长,可以吗
仅使用ASCII

1
@ASCII-仅不是真的。我不知道LUA是否对此有限制,但是如果不是这样,ouflak应该解析任何长度的整数。
查理

@Charlie我不知道Lua,但是尽管它很冗长,但是可以使用空格分隔的输入并像这样分割。
凯文·克鲁伊森

我在看 诀窍是能够处理两种情况。
ouflak

像C或Javascript这样的FWIW语言无论如何都只能处理其精度(9/16位数字)内的整数。
user202729

Answers:


9

JavaScript(ES6),58 54字节

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

在线尝试!

已评论

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

为什么重新使用a []存储先前的值是安全的

有三种可能的情况:

  • 如果a[ ]为空,回调函数.map()是不是在所有的调用,我们只是得到一个空数组,产生一个空字符串。
  • 如果a[ ]包含一个元素x,它是在第一(和唯一的)测试期间强制转换成该元素a < (a = c)。因此,我们正在测试x<x,这是错误的。我们得到一个包含空字符串的数组,再次产生一个空字符串。
  • 如果a[ ]包含多个元素,则强制为NaN第一测试期间a < (a = c)。因此,结果是虚假的,执行的是将s初始化为空字符串-这就是我们想要的。第一个有意义的比较发生在第二次迭代中。


5

05AB1E26 24 23 字节

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

-2个字节,感谢@Kroppeb

在线尝试验证所有测试用例

说明:

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

看到这个05AB1E尖矿(部分如何压缩字符串不是字典的一部分吗?理解为什么.•1Š¥èò²•"excelsior"


2
我真的不知道05AB1E但你不能交换0KgO
Kroppeb

@Kroppeb啊,完全错过了,但是是的,我确实可以。谢谢!:)
Kevin Cruijssen


4

Java-8 118113字节

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

易于阅读 :

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
这里有些高尔夫球可以节省10个字节: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+="!":"";}在线尝试(108字节)。(Java 10+)
Kevin Cruijssen

@KevinCruijssen谢谢!
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字节
OlivierGrégoire18年

解决我的问题:++e而不是e++至少!打印一个。
奥利维尔·格雷戈尔

1
@KevinCruijssen高尔夫中的小错字,使您获得一个字节:e=...?e+"!":而不是e=...?e+="!":
奥利维尔·格雷戈尔

4

R,86字节

这个答案的一半是@Giuseppe的。RIP Stan Lee。

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

在线尝试!


4

05AB1E20 19字节

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

在线尝试!

说明

ü‹                    # 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字节

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

感谢gastropner打高尔夫球2个字节。

在这里在线尝试。

取消高尔夫:

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

}

我开始制定解决方案,但最终与您的解决方案如此接近,以至于将我的问题作为一个单独的答案发布,感觉有点傻。尽管如此,仍然存在一些差异可以节省一些字节。
gastropner

@gastropner感谢您分享您的版本。我已经合并了您的改进,并将其扩展到99字节。如果只是我们不需要处理空数组,那么使用您的循环样式,它将为97个字节
OOBalance

4

Japt -R25 22字节

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

尝试一下

多亏了卡米尔(Kamil),节省了3个字节

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


-R标志实际上不是必需的,挑战是您可以输出一个字符串数组。
卡米尔·德拉卡里

好人,谢谢@KamilDrakari。我slice在第一次通过时尝试了一种解决方案,但解决了太久却将其关闭。现在回到它,在您的提示下,我想我应该坚持使用它,因为我也将其降低到22。
毛茸茸的

3

Common Lisp,111个字节

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

在线尝试!


3

Java 8,106字节

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

在线尝试!

s...喜欢的人的调任)


您可以通过替换(s="")+s=>来(s="")
再打

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个字节)将移至s=""备用字节。
奥利维尔·格雷戈尔


3

R,111字节

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

在线尝试!

这里可以找到更好的R致敬-我对sequence和过于着迷rle


这没有给出空行,而是86个字节?
J.Doe

2
@ J.Doe dang,那就更好了。如果我是你,我会自己张贴。
朱塞佩

3

果冻,16 字节

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

单声道链接产生一个字符列表。

在线尝试!(页脚加入换行符)

怎么样?

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

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

在线尝试!

说明,并带有简化示例:

ò¨                       :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个字节

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

少打高尔夫的测试脚本:

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

输出:

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

1
在那里,我试图获得一个滞后的指针来工作,但是想不到如何。
Veskah

3

PowerShell87 85字节

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

在线尝试!

那里可能存在重组,最有可能隐藏在其中,但总体来说还不错。使用ol的“未实例化的变量默认为0”技巧来制作索引和!


2

视网膜,55字节

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

在线尝试!链接包括测试用例。说明:

\d+
*

转换为一元。

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

从右到左处理重叠的匹配项(尽管然后从左到右列出匹配项)。这意味着我们可以匹配运行中的每个数字,并且匹配范围延伸到运行的开始。进一步限制了每个匹配项,即每个附加的匹配号必须小于先前匹配的附加号,或者如果还没有匹配的附加号,则小于第一个号。

L$...
Excelsior$#1*!

对于每个匹配项,根据需要输出Excelsior带有运行中其他数字的数量。


2

Pyth,32个字节

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

在此处在线尝试,或在此处一次验证所有测试用例。

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

卢(Lua88 87 83 82 96 95 113字节

感谢@Kevin Cruijssen秉承原始问题的精神进行更新。

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

在线尝试!


1
抱歉,但是您需要根据规则打印感叹号(当前运行的每个长度上一个感叹号越来越多)。
查理

没问题。认为除非别人
看不见,

1
我不太了解Lua,但是这里是您的代码修复程序,因此它可以正确运行所有测试用例。当前,您仅打印“!” 每次数字都比前一个数字大时会增加更多,但是在这种情况下,不要将其重置为1。可能会有更多的人打高尔夫球,但是由于我从未在Lua打过高尔夫球,所以我只专注于小高尔夫打球。PS:不确定输入是否始终是个数字是否正确
。–

2
由于@Charlie在挑战说明下方的评论中提到应有可能采用多位数字作为输入,因此在这里可以采用以空格分隔的输入并对其进行分割来解决
凯文·克鲁伊森

我认为Kevin Cruijssen的修改更符合OP的期望。谢谢!
ouflak

2

C ++ 14(g ++),123118字节

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

幸运的是std::string有一个重复一个的构造函数char在这里在线尝试

多亏了gastropner节省了5个字节。

取消高尔夫:

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

}

您可以
删除

2

C#(.NET核心)115 107 105字节

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

在线尝试!

-8字节: b 从int计数器更改为包含“!”的字符串
-2字节:设置 b+="!" 为内联函数(感谢Zac Faragher

使用动作委托提取输入,不需要返回。

取消高尔夫:

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
通过b+="!"与Excelsior内联可以节省2个字节。在线if(a[i]>a[i-1])Console.WriteLine("Excelsior"+(b+="!")); 尝试!
扎克·弗拉格


2

J,50个字节

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

在线尝试!

不打高尔夫球

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

1

Java,113个字节

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字节

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

不幸的是,这不是有效的解决方案,因为它依赖于具有显式定义的变量a。就是说,如果将函数定义为subroutine将输入作为期望类型数组的变体的函数,则可以将方法转变为有效的解决方案。该方法的改进版本看起来像 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,其中代码块之间的中断代表新行
Taylor Scott

1

Python 3,87个字节

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

或带有以下内容的97:

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

假设输入将采用以下格式:

32105
12345
<null input>
1
1213415
333343

1
您的第一个程序无效,因为它通过预定义变量获取输入。第二个值很高,因为它无法区分具有多个数字的数字。为什么不使用Python 2或将其转换为函数呢?
Jo King

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.