より大きな栄光へと上方へ!


15

この挑戦が、95歳で亡くなったスタン・リーへの(別の)オマージュとして役立つことを願っています。

スタン・リーは私たちにかけがえのない遺産と独特のキャッチコピーを残しました: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桁の長さであると想定しています。それはOK
ASCIIのみ

1
@ASCIIのみではありません。LUAに制限があるかどうかはわかりませんが、そうでない場合は、ouflakが任意の長さの整数を解析する必要があります。
チャーリー

@Charlie私はLuaを知りませんが、冗長ですが、例えばスペースで区切られた入力を取り、このように分割することは可能です。
ケビンクルーイッセン

私はそれを見ています。トリックは、両方のシナリオを処理できるようにすることです。
ouflak

CやJavascriptなどのFWIW言語は、とにかくその精度(9/16桁)内の整数のみを処理します。
user202729

回答:


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 []を再利用するのが安全な理由

次の3つのケースが考えられます。

  • 場合[ ]空である、のコールバック関数a[ ].map()、すべてで呼び出されていないと私たちは空の文字列を得、空の配列を取得します。
  • [ ]に要素xが 1つだけ含まれている場合a[ ]最初の(一意の)テスト中にその要素に強制変換されます。したがって、x < xをテストしていますが、これは偽です。空の文字列を含む配列を取得し、再び空の文字列を生成します。xa < (a = c)x<x
  • 場合、[ ]は、いくつかの要素が含まれて、それがに強制される最初の試験中。したがって、結果は偽であり、実行されるのは、空の文字列へのsの初期化です。最初の意味のある比較は、2回目の反復で行われます。a[ ]NaNa < (a = c)s


5

05AB1E26 24 23 バイト

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

@Kroppebのおかげで-2バイト。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

ü                        # 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ああ、完全にそれを見逃したが、はい、私は本当にできる。ありがとう!:)
ケビンクルーイッセン


4

Javaの-8 118 113のバイト

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以降)
ケビンクルーイッセン

@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バイト
オリビエグレゴワール

私の問題の修正:印刷するものが少なくとも1つあるようにする++e代わりに。e++!
オリビエグレゴワール

1
@KevinCruijssen小さなあなたが1つのバイトを獲得するためにあなたのゴルフのタイプミス:e=...?e+"!":代わりにe=...?e+="!":
オリビエグレゴワール


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

2バイトのゴルフをしてくれたgastropnerに感謝します。

こちらからオンラインでお試しください。

ゴルフをしていない:

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バージョンを共有していただきありがとうございます。私はあなたの改善を取り入れて、さらに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

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の賛辞を見つけることができるここに -私も上の固定されたsequencerle


これはいくつかの空白行を与えませんが、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
そこに、私は動作するようにラグポインターを取得しようとしていましたが、どのように考えることができませんでした。
ヴェスカー

3

PowerShell87 85バイト

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

オンラインでお試しください!

おそらくそこには再構築の隠蔽があり、おそらくif-elseにありますが、全体的には大丈夫です。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つの感嘆符が増え続けています)。
チャーリー

問題ない。他の誰かが何かを見ない限り、私はここでできる限りのことをしたと
思う...-ouflak

1
Luaについてはあまりよく知りませんが、コードを修正してすべてのテストケースを正しく実行するように修正しました。現在は「!」数値が以前よりも大きくなるたびに増えますが、そうでない場合は1にリセットしません。もっとゴルフができるかもしれませんが、ルアでゴルフをしたことがないので、マイナーなゴルフだけでそれを修正することに集中しました。PS:必ず入力を想定していない場合は、常に一桁の数字は...正しいです
ケビンCruijssen

2
@Charlieはチャレンジの説明の下のコメントで、入力として複数桁の数字を取ることができるはずだと述べているので、ここではスペースで区切られた入力を取り、その上で分割することによる修正が可能です。
ケビンクルーッセン

Kevin Cruijssenの修正は、OPの期待に沿ったものであると判断しました。ありがとう!
ouflak

2

C ++ 14(g ++)、123 118バイト

[](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こちらからオンラインでお試しください。

5バイトを節約してくれたgastropnerに感謝します。

ゴルフをしていない:

[] (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+="!")); オンラインで試してみてください!
ザックファラガー



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
最初のプログラムは、事前定義された変数を介して入力を受け取るため無効です。2番目は、複数の数字を持つ数字を区別できないため、無効です。代わりにPython 2を使用するか代わりに関数に変換しみませんか?
ジョーキング

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.