Lihat, di langit! Ini array super duper!

39

Terinspirasi oleh pertanyaan ini dari teman-teman saingan kami di Code Review.

Definisi

Sebuah Array Super adalah array di mana setiap elemen baru dalam array lebih besar daripada jumlah semua elemen sebelumnya. {2, 3, 6, 13}adalah array super karena

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

{2, 3, 5, 11}adalah tidak array super, karena

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

Sebuah Array duper adalah array di mana setiap elemen baru dalam array lebih besar dari produk dari semua elemen sebelumnya. {2, 3, 7, 43, 1856}adalah array super, tetapi juga merupakan array duper sejak itu

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

Tantangan

Tulis fungsi atau program yang menggunakan array sebagai input dalam format daftar asli bahasa Anda, dan tentukan seberapa hebat array itu. Anda juga dapat secara opsional mengambil input panjang array (untuk bahasa seperti C / C ++). Juga, Anda dapat mengasumsikan bahwa semua nomor dalam daftar akan bilangan bulat lebih besar dari 0. Jika itu adalah yang super array, anda harus mencetak It's a super array!Jika itu adalah yang super duper array, anda harus mencetak It's a super duper array!Ada juga kemungkinan untuk array menjadi duper- bukan super. Sebagai contoh {1, 2, 3}Dalam hal ini, Anda harus mencetak It's a duper array!Jika array tidak super atau duper, Anda dapat mencetak nilai palsu.

Seperti biasa, ini adalah kode golf, sehingga celah standar berlaku, dan jawaban terpendek dalam byte akan menang.

DJMcMayhem
sumber
9
Saya tidak suka format I / O yang rumit , tetapi mungkin sudah terlambat untuk berubah sekarang.
lirtosiast
1
Saya yakin Anda bermaksud "duper-non-super" untuk {1, 2, 3}array?
Darrel Hoffman
1
@DJMcMayhem oops, entah bagaimana aku harus 2 * 1menyamai 3kepalaku.
Alexander Revo
4
Ini muncul dalam komentar : Spec Anda mengatakan Jika array tidak super atau duper, Anda bisa mencetak nilai palsu. Apakah ini berarti kita harus mencetak nilai palsu?
Dennis
1
Apakah yang penting adalah ada 2 ruang antara kata di suatu tempat? Saya masih bisa menyimpan lebih banyak jika super[space][space]arraydiizinkan.
aross

Jawaban:

20

Jelly , 47 45 4̷4̷ 42 byte

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

Ini mencetak string kosong (falsy) untuk array yang bukan super atau duper. Cobalah online!

Bagaimana itu bekerja

+\,×\<Ḋ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.
Dennis
sumber
1
Cara yang baik seperti biasa, Dennis :) Sudah beberapa saat, waktu untuk membaca dokumen Jelly;)
Kade
Apakah ada dokumentasi bagaimana kompresi string bekerja di Jelly?
Luis Mendo
@LuisMendo Tidak sekarang. Ada metode kompresi saat ini adalah eksperimental dan saya akan segera mengubahnya. Gambaran singkat: Menggunakan indeks pada halaman kode , string yang dikompresi dikonversi dari bijective base 250 ke integer. Setiap langkah menerjemahkan ke karakter ASCII yang dapat dicetak atau kata kamus, mungkin dengan case yang diubah dan / atau spasi sebelum itu.
Dennis
9

JavaScript (ES6), 111 110 byte

Menyimpan satu byte berkat @ETHproductions !

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!`

Penjelasan

Mengambil array angka, mengembalikan string atau angka 0untuk false.

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!`

Uji

pengguna81655
sumber
Itu cara cerdas untuk melakukan ini! Saya pikir Anda dapat menyimpan dua byte dengans+=s&&n>s&&n,d*=d&&n>d&&n
ETHproduk
@ ETHproductions sperlu dilakukan dengan cara ini karena itu perlu diatur falsejika n>s, tetapi d*falsememiliki efek yang sama sehingga satu berfungsi. Terima kasih!
user81655
5

Jawa, 183 182 Bytes

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!":"";}

Saya membuat asumsi berikut:

  • Outputnya adalah melalui nilai balik.
  • String kosong ""adalah nilai palsu.

Jika ada yang salah, tolong beritahu saya.

Lagi pula, saya tidak bisa menghilangkan perasaan bahwa saya mungkin sudah berlebihan dengan jumlah variabel.

Sunting: berhasil menyimpan byte, berkat @UndefinedFunction

ECS
sumber
1
Apakah mungkin untuk perubahan boolean s=trueke boolean s=1<2?
Jrich
@UndefinedFunction Ya, tangkapan yang bagus
ECS
4

MATL , 66 byte

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

Menggunakan rilis saat ini (10.0.3) , yang lebih awal dari tantangan ini.

Masukan dari stdin. Jika tidak super atau duper, output kosong (yang salah).

EDIT (7 April 2016) : karena perubahan dalam rilis 16.0.0 bahasa, 5Ldan 6Lperlu diganti oleh 3Ldan secara 4Lrepektif. Tautan ke kompiler online mencakup modifikasi-modifikasi itu.

Cobalah online !

Penjelasan

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
Luis Mendo
sumber
3

C ++ 14, 178, ..., 161 157 byte

Tidak bisa memikirkan cara untuk membuatnya lebih pendek. Sepertinya selalu ada ruang untuk perbaikan!

Pembaruan 1 : Saya semua untuk kode aman, tetapi mengambil array mentah dan ukurannya sebagai argumen fungsi lebih pendek 9 byte daripada mengambil vektor :(

Pembaruan 2: Sekarang mengembalikan string kosong sebagai nilai palsu, dengan biaya 8 byte.

Pembaruan 3: Kembali ke 165 byte, berkat komentar CompuChip.

Perbarui 4: Komentar lain oleh CompuChip, off 4 byte lainnya.

Pembaruan 5: menggunakan autoalih-alih stringbersama dengan saran lain oleh CompuChip mencukur 4 byte lainnya dari kode.

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!":"";}

Program lengkap yang tidak digabungkan dengan kasus uji:

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

Keluaran:

It's a super array!

It's a super duper array!
It's a duper array!
Alexander Revo
sumber
2
String It's a array!itu benar ( bukti ) menurut definisi kami tentang Meta .
Dennis
@ Dennis sebenarnya, ini adalah kesalahan kompilasi (Saya menggunakan C ++ 14 std :: string literal, bukan array karakter mentah), yang bukan keduanya. Bagaimanapun, saya memperbarui jawaban saya untuk mencetak string kosong sekarang, karena itulah pendekatan yang digunakan dalam solusi lain.
Alexander Revo
1
Anda dapat mencukur beberapa byte lagi jika Anda kehilangan if ... >= perbandingan panjang : saya pikir e=r>s?e:0setara dengan if(r<=s)e=0.
CompuChip
1
@AlexanderRevo tidak suka for(s=p=*a;--n;s+=r,p*=r)r=*++abekerja? Akan memungkinkan Anda untuk turun isama sekali
CompuChip
1
Tidak bisakah Anda menghindari salah satu kenaikan? Yang ada di inisialisasi tampaknya tidak perlu? Atau apakah itu memberi Anda satu putaran terlalu banyak iterasi?
CompuChip
2

C, 150 byte

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

Setiap input diakhiri oleh a 0. Tes utama:

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

Bonus jika kita diizinkan format output yang lebih kompak, kita dapat memotongnya 107 byte :

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

Dalam hal ini, Zkembalilah 3untuk superduper, 2untuk super, 1untuk duper dan 0tidak ada.

Stefano Sanfilippo
sumber
1

Pyth - 54 52 byte

Bagian pemformatan string mungkin bisa golf, tapi saya suka pendekatan pengujian super-duper.

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

Test Suite .

Maltysen
sumber
1
c2"superduper"bisa +R"uper""sd"
bermain golf
@isaacg itu benar-benar pintar
Maltysen
3
Anda kehilangan tanda seru, saya pikir
ETHproduk
4
@ TrangOul lang-pythtidak ada.
Dennis
2
Ini benar-benar mencetak "Ini array" untuk array non-super-non-duper, yang merupakan string yang benar menurut definisi meta . Juga, string yang dicetak harus diakhiri dengan tanda seru.
Alexander Revo
1

Python 3, 127

Disimpan 5 byte berkat FryAmTheEggman.

Solusi yang cukup mendasar saat ini, tidak ada yang terlalu mewah. Hanya menjalankan total jumlah dan produk yang berjalan dan memeriksa setiap elemen.

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)

Inilah kasus-kasus pengujian untuk berjaga-jaga jika ada orang lain yang ingin mengalahkan skor saya.

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')
Morgan Thrapp
sumber
1

AWK - 140 byte

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]}'

Bagi mereka yang tidak tahu AWK, catatan secara otomatis diuraikan ke dalam garis berdasarkan variabel RSdan garis secara otomatis diurai ke dalam bidang berdasarkan variabel FS. Variabel yang tidak ditugaskan juga adalah "" yang ketika ditambahkan ke # bertindak seperti 0. BEGINBagian ini dipanggil tepat sekali, sebelum catatan / bidang apa pun diuraikan. Sisa bahasanya cukup mirip C dengan setiap blok kode yang cocok diterapkan pada setiap record. Lihat http://www.gnu.org/software/gawk/manual/gawk.html#Getting-Mulai untuk detail lebih lanjut.

Contoh run di mana 'code'adalah seperti di atas: echo 1 2 6 | 'code'

Bisa juga menempatkan array di file bernama Nama file dan jalankan sebagai: 'code' Filename

Jika kode ini sering dijalankan, kode tersebut dapat ditempatkan dalam file skrip yang dapat dieksekusi. Ini akan menghapus penutup ' 'dan awkperintah akan ditempatkan di bagian atas file sebagai:#!/bin/awk -f

Robert Benson
sumber
Saya tidak tahu AWK, adakah yang bisa menjelaskan mengapa ini diturunkan?
Alexander Revo
Bukan saya, tapi saya ingin penjelasan kodenya. Idk AWK juga.
mbomb007
Ini mencetak It's a array!untuk array yang bukan super atau duper, yang merupakan string yang benar menurut definisi kami tentang Meta .
Dennis
Untuk menguji coba:echo 1 2 6 | <the above code>
Robert Benson
2
@ Dennis ini tidak seperti saya nitpicking, tetapi tantangannya mengatakan "Jika array tidak super atau duper, Anda dapat mencetak nilai palsu." , sedangkan dalam kasus lain harus digunakan sebagai gantinya. Saya akan mengatakan, selama outputnya jelas dapat dibedakan dari kasus lain dan benar, itu harus baik-baik saja. Saya ingin kata OP tentang ini.
Stefano Sanfilippo
1

PHP, 144 ... 113 112 Bytes

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

Penjelasan:

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

Tanpa mendaftar global akan menjadi ini (118 byte):

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
  • Menyimpan 3 byte lainnya dengan tidak mempedulikan ruang ekstra dalam output
  • Disimpan 3 byte dengan mencetak $a(hasil konversi array ke string Array)
  • Menyimpan byte dengan menginisialisasi $pke 1, sehingga menaikkan biaya produk lebih murah.
aross
sumber
Solusi yang bagus. Beberapa catatan: Ini bukan program lengkap atau fungsi karena Anda tidak menangani input Anda $a. Anda tidak perlu khawatir tentang pemberitahuan dan hal-hal - cukup abaikan saja di situs ini.
masukkan nama pengguna
Haruskah saya menggantinya dengan $ argv [1] sebagai gantinya? Apakah ada posting dalam meta tentang input yang dapat diterima untuk PHP (atau secara umum)? Ini golf pertama saya
aross
2
@aross Ini dia. Ada juga ini secara khusus tentang PHP tetapi tidak pernah menerima banyak perhatian . Secara umum, argumen STDIN dan baris perintah adalah permainan yang adil. Anda juga dapat mengirimkan kode Anda sebagai suatu fungsi.
Martin Ender
Saya pikir pergi dengan $argv[1]adalah alternatif yang baik. Yang sedang berkata, tantangan ini sangat kabur tentang itu dalam dan format output. Tetapi Anda mungkin dihukum karena tantangan lain dengan pendekatan ini. Dan pengkodean keras input sebenarnya tidak dapat diterima - meskipun ada beberapa pengecualian yang mengizinkannya. Saya tahu bahwa membaca input sangat mahal di PHP itu sebabnya saya mengajukan pertanyaan serupa tentang meta tentang itu .
masukkan nama pengguna
Skrip saya akan bekerja dengan baik register_globals, tetapi saya akan menulis golf masa depan sebagai fungsi. Mengapa oh mengapa short_closures ditolak?
aross
1

R , 115 byte

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

Cobalah online!

Nilai palsu: It's a array! Tidak ada yang terlalu mewah di sini kecuali mungkin menggunakan sapplypada daftar fungsi.

JayCe
sumber
0

Scala, 172 Bytes

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

Tidak digerogoti (walaupun sebenarnya tidak ada banyak pekerjaan untuk melakukannya):

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")
}
Ethan
sumber
0

Haskell, 136 Bytes

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!"

fadalah fungsi yang diperlukan. Perhatikan bahwa jumlah kosong adalah 0 dan produk kosong adalah 1 yang mengapa [0]bukan super atau duper.

smenangkap struktur umum pengujian super atau duper dengan mengambil operator yang arbitrer odan elemen netral yang arbitrer t. The foldrmelacak tupel (s,b)mana sadalah hasil dari chaining semua elemen terlihat dengan operator odanb mengatakan apakah, untuk setiap elemen memandang sejauh ini, unsur ini adalah lebih besar dari sebelumnya dihitung jumlah / produk.

Outputnya tidak banyak golf dan saya akan sangat menghargainya jika seseorang berkontribusi ide yang lebih baik!

Versi yang sedikit lebih mudah dibaca:

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!"
camelNeck
sumber
0

05AB1E , 53 51 byte

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

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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

Lihat di sini untuk penjelasan tentang bagaimana .•dwā•"duper" dan bagaimana „¦È!"array!".

Kevin Cruijssen
sumber
0

Jelly , 37 byte

Ä,×\<ḊZṖPµ“¤ḋГ¡e⁽»x'“¡Ƈɠİ[lɦ“Ñŀṙ»jẋẸ

Cobalah online!

Program lengkap.

Saya mendapat Z…Pide dari jawaban (lama) Dennis.

Erik the Outgolfer
sumber