空を見上げて!それは超大型アレイです!


39

Code Reviewでライバルの友人から寄せられたこの質問に触発されました。

定義

スーパーアレイは、アレイ内の各新しい要素は、以前のすべての要素の合計よりも大きい配列です。{2, 3, 6, 13}スーパーアレイです

3 > 2
6 > 3 + 2 (5)
13 > 6 + 3 + 2 (11)

{2, 3, 5, 11}なぜならスーパーアレイではないからです

3 > 2
5 == 3 + 2
11 > 5 + 3 + 2

大型のアレイは、アレイ内の各新しい要素は、以前のすべての要素の積よりも大きい配列です。{2, 3, 7, 43, 1856}はスーパー配列ですが、それはまた、より大きな配列です

3 > 2
7 > 3 * 2 (6)
43 > 7 * 3 * 2 (42)
1856 > 43 * 7 * 3 * 2 (1806)

チャレンジ

言語のネイティブリスト形式で入力として配列を受け取り、配列がどの程度スーパーであるかを決定する関数またはプログラムを作成します。オプションで、配列の長さを入力することもできます(C / C ++などの言語の場合)。それはだ場合はまた、あなたがリスト内の数字のすべてが整数に0よりも大きくなることを想定することができ、スーパーの配列、あなたは印刷する必要がありIt's a super array!、それがある場合には、超大型の配列は、あなたは印刷する必要があり、It's a super duper array!配列はduper-もすることも可能です非スーパー。たとえば、{1, 2, 3}この場合、It's a duper array!配列がスーパーでもデュパーでもない場合は印刷する必要があります。偽の値を印刷できます。

いつものように、これはコードゴルフであるため、標準の抜け穴が適用され、バイト単位の最短回答が勝ちます。


9
面倒なI / O形式は好きではありませんが、今では変更するには遅すぎます。
リルトシアスト

1
私はあなたが{1, 2, 3}アレイのための「超非スーパー」を意味していたと確信していますか?
ダレルホフマン

1
@DJMcMayhemおっと、私はどういうわけか頭の中で2 * 1平等3になった。
アレクサンドル・レボ

4
これはコメントで出てきました:あなたの仕様は、配列がスーパーでもデュパーでもないなら、偽の値を出力できると言っています。これは、偽の値を印刷する必要があるということですか?
デニス

1
単語の間に2つのスペースがあるかどうかは重要ですか?super[space][space]array許可されればさらに節約できます。
アロス

回答:


20

ゼリー47の 45 44 42 バイト

+\,×\<ḊZṖP“sd”x;€“uper ”;/“It's a ”,“¥ṫɲ»j

これは、スーパーでもデュパーでもない配列に対して空の文字列(偽)を出力します。オンラインでお試しください!

使い方

+\,×\<ḊZṖP“sd”x;€“uper ”  Main link (first half). Argument: A (array)

+\                        Compute all partial sums of A.

   ×\                     Compute all partial products of A.
  ,                       Pair the results to the left and to the right.
     <Ḋ                   Perform vectorized comparison with A[1:].
                          This yields a 2D array of Booleans.
       Z                  Zip; pair the Booleans corresponding to each integer.
        Ṗ                 Remove the last pair.
                          (Nothing is compared with the last sum/product.)
         P                Take the product of each column.
          “sd”x           Perform vectorized character repetition.
                          This yields ['s', d'], ['s'], ['d'], or [].
               ;€“uper ”  Append the string "uper " to each character.


;/“It's a ”,“¥ṫɲ»j        Main link (second half).

;/                        Reduce the resulting array of strings by concatenation.
                          This will fail for an empty array, exiting immediately.
  “It's a ”,“¥ṫɲ»         Push ['It's a ', 'array!'].
                 j        Join that array, separating by the super duper string.

1
いつものように良い方法、デニス:)しばらく行って、ジェリーのドキュメントを読む時間;)
ケード

Jellyで文字列圧縮がどのように機能するかのドキュメントはありますか?
ルイスメンドー

@LuisMendo今はありません。現在の圧縮方法は実験的であり、すぐに変更します。簡単な概要:コードページのインデックスを使用して、圧縮された文字列は全単射250から整数に変換されます。各ステップは、印刷可能なASCII文字または辞書の単語にデコードします。大文字と小文字を変更したり、前にスペースを入れたりできます。
デニス

9

JavaScript(ES6)、111 110バイト

@ETHproductionsのおかげで1バイト節約できました

a=>a.map((n,i)=>i&&(s=s&&n>s&&s+n,d*=d&&n>d&&n),s=d=a[0])|s|d&&`It's a ${s?"super ":""}${d?"duper ":""}array!`

説明

数値の配列を受け取り、文字列または0false の数値を返します。

a=>
  a.map((n,i)=>      // for each number n at index i
    i&&(             // skip the first number (because s and d are initialised to it)
      s=s&&n>s&&s+n, // if it is still super and n > s, s += n, else s = false
      d*=d&&n>d&&n   // if it is still duper and n > d, d *= n, else d = false
    ),
    s=               // s = sum of previous numbers if super, else false
    d=               // d = product of previous numbers if duper, else false
      a[0]           // initialise s and d to the first number
  )
  |s|d               // if it is neither super or duper, output 0

  // Output the appropriate string
  &&`It's a ${s?"super ":""}${d?"duper ":""}array!`

テスト


これは賢い方法です!s+=s&&n>s&&n,d*=d&&n>d&&n
ETHproductions

@ETHproductions sfalseif n>sに設定する必要があるため、この方法で行う必要がありますd*falseが、1つが機能するように同じ効果があります。ありがとう!
user81655

5

Java、 183 182バイト

String w(int[]a){boolean s=1<2,d=s;int m=a[0],p=m,k=a.length,i=0,e;if(k>0)for(;++i<k;s&=e>m,d&=e>p,m+=e,p*=e)e=a[i];return d|s?"It's a "+(s?"super ":"")+(d?"duper ":"")+"array!":"";}

私は次のことを仮定しました:

  • 出力は戻り値によるものです。
  • 空の文字列""は偽の値です。

これらのいずれかが間違っている場合は、教えてください。

とにかく、私は変数の量で船外に行ったかもしれないという気持ちを揺るがすことはできません。

編集:@UndefinedFunctionのおかげで、バイトを保存することができました


1
に変更boolean s=trueすることは可能boolean s=1<2ですか?
-jrich

@UndefinedFunctionはい、良いキャッチ
ECS

4

MATL、66バイト

Ys5L)G6L)XK<?' super']GYp5L)K<?' duper']N?N$h'It''s a'wh' array!'h

現在のリリース(10.0.3)を使用します。これは、このチャレンジよりも前のものです。

入力は標準入力からです。superまたはduperでない場合、出力は空です(falseです)。

EDIT(2016年4月7日):による言語のリリース16.0.0の変化に5L6Lで交換する必要がある3L4Lrepectively。オンラインコンパイラへのリンクには、これらの変更が含まれています。

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

説明

Ys             % implicit input. Cumulative sum
5L)            % remove last element
G6L)           % push input. Remove first element
XK             % copy to clipboard K
<?             % if all elements are smaller
  ' super'     % push string
]              % end
GYp            % push input. Cumulative product
5L)            % remove last element
K              % push input except first element
<?             % if all elements are smaller
  ' duper'     % push string
]              % end
N?             % if stack not empty
  N$h          % concatenate all elements (will be one or two strings)
  'It''s a'    % string
  wh           % prepend
  ' array!'    % string
  h            % concatenate. Implicit end. Implicit display

3

C ++ 14、178、...、161 157バイト

短くする方法は考えられません。常に改善の余地があるようです!

更新1:私は安全なコードを求めていますが、関数の引数として生の配列とそのサイズを使用すると、ベクトルを使用するよりも9バイト短くなります:(

更新2:現在、8バイトのコストで空の文字列をfalse値として返します。

更新3: CompuChipのコメントのおかげで、165バイトに戻りました。

更新4: CompuChipによる別のコメント、さらに4バイトオフ。

更新5: CompuChipによる別の提案と共に使用するauto代わりにstring、コードからさらに4バイト削ります。

auto f(int*a,int n){int s,p,d=1,e=1,r;for(s=p=*a;--n;s+=r,p*=r)r=*++a,e=r>s?e:0,d=r>p?d:0;return e|d?"It's a "s+(e?"super ":"")+(d?"duper ":"")+"array!":"";}

テストケース付きの完全なプログラム:

#include <iostream>
#include <string>
#include <vector>

using namespace std::literals::string_literals;

auto f(int* a, int n)
{
    int s,p,d=1,e=1,r;

    for(s=p=*a; --n; s+=r, p*=r)
        r=*++a, e=r>s?e:0, d=r>p?d:0;

    return e|d ? "It's a "s + (e?"super ":"") + (d?"duper ":"") + "array!" : "";
}

int main()
{
    std::vector<std::vector<int>> test_cases = {{2,3,6,13},
                                                {2,3,5,11},
                                                {2,3,7,43,1856},
                                                {1,2,3}
                                               };

    for(auto& test_case : test_cases)
    {
        std::cout << f(test_case.data(), test_case.size()) << '\n';
    }
}

出力:

It's a super array!

It's a super duper array!
It's a duper array!

2
Metaの定義によるとこの文字列It's a array!は真実(証明)です。
デニス・

@Dennisは実際には、コンパイルエラー(未処理の文字配列ではなくC ++ 14 std :: stringリテラルを使用しています)であり、どちらでもありません。とにかく、他のソリューションで使用されているアプローチであるため、空の文字列を印刷するように回答を更新しています。
アレクサンドル・レボ

1
あなたは長さを失う場合は、さらにいくつかのバイトで剃ることができますif ... >= 比較を:私が考えるe=r>s?e:0に相当しますif(r<=s)e=0
CompuChip

1
@AlexanderRevoはfor(s=p=*a;--n;s+=r,p*=r)r=*++a仕事のようなものではありませんか?i完全にドロップできるようになります
CompuChip

1
いずれかの増分を避けることはできませんか?イニシャライザにあるものは不要のようですか?それとも、1回のループ反復が多すぎますか?
CompuChip

2

C、150バイト

#define M(N,O)N(int*d,int c){return*d?*d>c?N(d+1,c O*d):0:1;}
M(S,+)M(D,*)Z(int*d){printf("It's a %s%s array!\n",S(d,0)?"super":"",D(d,0)?"duper":"");}

各入力はで終了します0。メインテスト:

#include <stdio.h>

int main() {
  int test_data[4][6] = {
    {2, 3, 7, 43, 1856, 0}, // superduper
    {2, 3, 5, 11, 0}, // not super
    {2, 3, 6, 13, 0}, // super
    {1, 2, 3, 0} // duper not super
  };

  for (int i = 0; i < 4; ++i) {
    Z(test_data[i]);
  }
}

ボーナスは、我々はよりコンパクトな出力形式を許可されている場合、我々はそれをカットすることができます107バイト

#define M(N,O)N(int*d,int c){return*d?*d>c?N(d+1,c O*d):0:1;}
M(S,+)M(D,*)Z(int*d){return S(d,0)*2^D(d,0);}

この場合、Zリターン3superduperため、2スーパーのために、1大型のため、および0なしのため。


1

Pyth- 54 52バイト

文字列の書式設定部分はおそらくゴルフが可能ですが、私は超過酷なテストアプローチが好きです。

jd++"It's a"fT*V+R"uper""sd"m*F>VtQd,sMK._Q*MK"array

テストスイート


1
c2"superduper"ゴルフすることができます+R"uper""sd"
isaacg

@isaacgそれは本当に賢い
-Maltysen

3
感嘆符が欠落していると思います
-ETHproductions

4
@TrangOul lang-pythは存在しません。
デニス

2
これは実際には、非スーパーデュパーでない配列に対して「It's a array」を出力します。これは、meta定義によると、真実の文字列です。また、印刷された文字列は感嘆符で終わる必要があります。
アレクサンドル・レボ

1

Python 3、127

FryAmTheEggmanのおかげで5バイト節約されました。

現時点ではかなり基本的なソリューションですが、あまり凝っていません。合計と製品の合計を実行し、各要素をチェックするだけです。

def f(a):
 s=p=a[0];e=d=1
 for x in a[1:]:e&=x>s;d&=x>p;s+=x;p*=x
 return"It's a %s array!"%('super'*e+' '*e*d+'duper'*d)*(e|d)

誰かが私のスコアを破ろうとする場合のテストケースを以下に示します。

assert f([2, 3, 6, 13]) == "It's a super array!"
assert f([2, 3, 5, 11]) == ''
assert f([2, 3, 7, 43, 1856]) == "It's a super duper array!"
assert f([1, 2, 3]) == "It's a duper array!"
print('All passed')

1

AWK-140バイト

awk 'BEGIN{d[1]=" super";e[1]=" duper";RS=" ";p=1;a=1;b=1}{a=a&&$1>s;b=b&&$1>p;s+=$1;p*=$1}END{printf "It'\''s a%s%s array!\n",d[a],e[b]}'

AWKを知らない人のために、レコードは変数に基づいてRS行に自動的に解析され、行は変数に基づいてフィールドに自動的に解析されますFS。また、割り当てられていない変数は ""で、#に追加すると0のように動作します。BEGINセクションは、レコード/フィールドが解析される前に1回だけ呼び出されます。言語の残りの部分は、各レコードに適用される各一致するコードブロックを持つかなりCに似ています。詳細については、http://www.gnu.org/software/gawk/manual/gawk.html#Getting-Startedを参照してください。

'code'上記の実行例: echo 1 2 6 | 'code'

Filenameという名前のファイルに配列を配置し、次のように実行することもできます。 'code' Filename

コードを頻繁に実行する場合は、実行可能なスクリプトファイルに配置できます。これにより、囲みが削除され' 'awkコマンドはファイルの先頭に次のように配置されます。#!/bin/awk -f


私はAWKを知りません、なぜこれがダウン投票されたのか誰にも説明できますか?
アレクサンドル・レボ

私ではありませんでしたが、コードの説明が欲しいです。Idk AWKのいずれか。
mbomb007

これIt's a array!は、スーパーでもデュパーでもない配列に対して出力されます。これは、Metaの定義によると、真実の文字列です。
デニス

テストしよう:echo 1 2 6 | <the above code>
ロバートベンソン

2
@Dennisそれは私がちょっとしたことではありませんが、チャレンジは「配列がスーパーでもデュパーでもない場合、偽の値を出力できます」と言います。、他の場合は代わりにmustが使用されます。出力が他のケースと明確に区​​別され、正確である限り、問題ないはずです。これについてOPの言葉をお願いします。
ステファノサンフィリッポ

1

PHP、144 ... 113の 112バイト

$x=super;$d=duper;foreach($a as$v){$v>$s||$x="";$v>$p||$d="";$s+=$v;$p=$p*$v?:$v;}echo$x.$d?"It.s a $x $d $a!":0;

説明:

// Initiate `$s` to prevent isset calls. Leaving this out yields PHP
// notices, but doesn't functionally change the code.
$s = 0;

// Set product to 1, so when multiplying with the first value, `$p` will
// equal `$v`.
$p = 1;

// Not existing constants `super` and `duper` yield PHP notices
// but are interpreted as strings.
$x = super;
$d = duper;

// Iterate over input (register_globals).
foreach ($a as $v) {
    // Check if current value "breaks" [sd]uper-ness: `value` not greater
    // than current sum or product. If so, unset the string.
    $v > $s || $x = "";
    $v > $p || $d = "";

    // Update sum.
    $s += $v;
    // Update product.
    $p *= $v;
}

// Check if super or duper strings are set, if so, wrap output in the
// appropriate string. Otherwise, output falsy value `0`.
echo $x . $d ? "It's a $x $d $a!" : 0;

レジスタグローバルがなければ、これ(118バイト)になります。

php -r '$x=super;$d=duper;for($p=1;$v=$argv[++$i];$p*=$v){$v>$s||$x="";$v>$p||$d="";$s+=$v;}echo$x.$d?"It.s a $x $d array!":0;' 2 3 7 43 1856 2>/dev/null;echo
  • 出力の余分なスペースを気にしないことで、さらに3バイトを節約しました
  • 印刷により3バイトを節約しました$a(配列から文字列への変換はArray
  • $p1に初期化することで1 バイトを節約したため、製品のコストを削減できました。

いい解決策。いくつかの注意:これは完全なプログラムでも機能でもありません$a。入力を処理しないからです。通知などを心配する必要はありません。このサイトでは無視してください。
insertusernamehere

代わりに$ argv [1]で置き換える必要がありますか?PHPの受け入れ可能な入力(または一般)に関する投稿がメタにありますか?これは私の最初のゴルフです
アロス

2
@arossどうぞこれは特にPHPについてもありますが、あまり注目されていません。一般に、STDINとコマンドライン引数は公平なゲームです。関数としてコードを送信することもできます。
マーティンエンダー

一緒に行くの$argv[1]は良い選択肢だと思います。そうは言っても、この課題は入力形式と出力形式について非常にあいまいです。ただし、このアプローチでは他の課題に処罰される場合があります。また、入力のハードコーディングは実際には受け入れられません。ただし、許可される例外もいくつかあります。PHPでは入力の読み取りが非常に高価であることを知っているので、メタについて同様の質問をしました
insertusernamehere

私のスクリプトはで動作しregister_globalsますが、代わりに将来のゴルフを関数として作成します。どうしてshort_closuresが拒否されたのですか?
アロス

1

R、115バイト

function(x)cat("It's a",c("super","duper")[sapply(c(cumsum,cumprod),function(f)all(rev(x[-1]>f(x))[-1]))],"array!")

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

偽の値:関数のリストでIt's a array! 使用sapplyしている場合を除いて、ここであまり派手なことはありません。


0

Scala、172バイト

def f(a:Seq[Int])={var q=" super"
var w=" duper"
val x=a.head
a.drop(1).foldLeft((x,x)){case ((s,p),a)=>{if(s>=a)q=""
if(p>=a)w=""
(a+s,a*p)}}
println(s"It's a $q$w array")}

Ungolfed(そうすることはあまりありませんが)

def f(input:Seq[Int])={
    var super=" super"
    var duper=" duper"
    val head=input.head
    input.drop(1).foldLeft((head,head)){
        case ((sum,product),val)=>
        {
            if(sum>=val)super=""
            if(product>=val)duper=""
                (val+sum,val*product)
        }
    }
    println(s"It's a $super$duper array")
}

0

Haskell、136バイト

s o t=snd.foldl(\(s,b)x->(o s x,b&&x>s))(t,1>0)
f x="It's a "++(if s(+)0x then"super "else"")++(if s(*)1x then"duper "else"")++"array!"

f必要な機能です。空の合計が0で、空の積が1であることに注意してください。これ[0]は、スーパーでもデュパーでもない理由です。

s任意の演算子oと任意の中立要素をとることで、スーパーまたはデュパーのテストの一般的な構造をキャプチャしますtfoldrタプルのトラック続けるオペレータですべて見られる要素の連鎖の結果であるとかと言う、これまでに見て、すべての要素に対して、この要素は以前に計算された合計/製品よりも大きかったし。(s,b)sob

出力はあまりゴルフではなく、誰かがより良いアイデアを提供してくれたら感謝します!

少し読みやすいバージョン:

s :: (Integer -> Integer -> Integer) -> Integer -> [Integer] -> Bool
s o t = snd . (foldl (\(s,b) x -> (s `o` x, b && x>s)) (t, True))

f :: [Integer] -> [Char]
f x = "It's a " ++ (if s (+) 0 x then "super " else "")
      ++ (if s (*) 1 x then "duper " else "") ++ "array!"

0

05AB1E53 51 バイト

"It's"'a„dsIη©εRćsO›}Pè.•dwā•UX¦«®εRćsP›}PiX}„¦È!ðý

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

説明:

"It's"             # Push string "It's"
'a                 # Push string "a"
„ds                # Push string "ds"
   Iη              # Get the prefixes of the input-list
     ©             # Store it in the register (without popping)
      ε     }      # Map each sub-list to:
       R           #  Reverse the list
        ć          #  Take the head extracted
         sO        #  Swap and take the sum
           ›       #  Check if the head is larger than the sum of the rest
             P     # Then check this is truthy for all sub-lists, resulting in 0 or 1
              è    # And use this to index into the "ds" string
.•dwā•             # Push string "duper"
      U            # Store it in variable `X` (with popping unfortunately)
       X¦          # Push `X` and remove the first character
         «         # Then merge it with the "d" or "s"
®εRćsP›}P          # Do the same as explained above, but with the product instead of sum
         i }       # If this resulted in 1:
          X        #  Push variable `X` ("duper")
„¦È!               # Push string "array!"
ðý                 # Join all strings on the stack by spaces (and output implicitly)

.•dwā•「duper」と„¦È!「array!」の詳細については、こちらをご覧ください。


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