มองขึ้นไปบนฟ้า! มันเป็นอาร์เรย์ที่ยอดเยี่ยมมาก!


39

ได้รับแรงบันดาลใจจากคำถามนี้จากเพื่อน ๆคู่แข่งของเราในการตรวจสอบรหัส

คำนิยาม

อาร์เรย์ซุปเปอร์เป็นอาร์เรย์ที่แต่ละองค์ประกอบใหม่ในอาร์เรย์มีขนาดใหญ่กว่าผลรวมขององค์ประกอบทั้งหมดก่อนหน้านี้ด้วย {2, 3, 6, 13}เป็นอาเรย์ super เพราะ

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

{2, 3, 5, 11}คือไม่อาร์เรย์สุดเพราะ

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

อาร์เรย์ duperเป็นอาร์เรย์ที่แต่ละองค์ประกอบใหม่ในอาร์เรย์มีขนาดใหญ่กว่าสินค้าทุกองค์ประกอบก่อนหน้านี้ด้วย {2, 3, 7, 43, 1856}เป็นอาเรย์ super แต่ก็เป็นอาเรย์duperตั้งแต่นั้นเป็นต้นมา

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!ถ้าเป็นซุปเปอร์duperอาร์เรย์คุณต้องพิมพ์It's a super duper array!นอกจากนี้ยังเป็นไปได้สำหรับอาร์เรย์จะเป็น duper- ไม่ใช่ซุปเปอร์ ตัวอย่างเช่น{1, 2, 3}ในกรณีนี้คุณควรพิมพ์It's a duper array!ถ้าอาร์เรย์ไม่ใช่ super หรือ duper คุณสามารถพิมพ์ค่าที่ผิดพลาดได้

ตามปกตินี่คือ code golf ดังนั้นจึงมีช่องโหว่มาตรฐานและคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ


9
ฉันไม่ชอบรูปแบบ I / O ที่ยุ่งยากแต่อาจจะสายเกินไปที่จะเปลี่ยนแปลง
lirtosiast

1
ฉันแน่ใจว่าคุณหมายถึง "duper-non-super" สำหรับ{1, 2, 3}อาร์เรย์หรือไม่
Darrel Hoffman

1
@DJMcMayhem อุ๊ปส์ฉัน2 * 1จะมีความเท่าเทียมกัน3ในหัวของฉัน
Alexander Revo

4
สิ่งนี้เกิดขึ้นในความคิดเห็น : สเปคของคุณบอกว่าถ้าอาเรย์นั้นไม่ได้ยอดเยี่ยมหรือยอดเยี่ยมคุณสามารถพิมพ์ค่าที่ผิดพลาดได้ นี่หมายความว่าเราต้องพิมพ์ค่าที่ผิดพลาดหรือไม่?
Dennis

1
มันจะมีความสำคัญหรือไม่ที่มีช่องว่าง 2 คำระหว่างคำหนึ่งคำ? ฉันยังสามารถประหยัดได้มากขึ้นหากsuper[space][space]arrayได้รับอนุญาต
Aross

คำตอบ:


20

เยลลี่ , 47 45 4̷4̷ 42 ไบต์

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

สิ่งนี้พิมพ์สตริงว่าง (falsy) สำหรับอาร์เรย์ที่ไม่ใช่ค่า super หรือ duper ลองออนไลน์!

มันทำงานอย่างไร

+\,×\<Ḋ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 docs)
Kade

มีเอกสารใด ๆ ว่าการบีบอัดสตริงทำงานในเยลลี่หรือไม่
Luis Mendo

@LuisMendo ยังไม่ได้ตอนนี้ มีวิธีการบีบอัดปัจจุบันกำลังทดลองและฉันจะเปลี่ยนในไม่ช้า ภาพรวมอย่างรวดเร็ว: การใช้ดัชนีในหน้ารหัสสตริงที่บีบอัดจะถูกแปลงจากฐาน bijective เป็นจำนวนเต็ม แต่ละขั้นตอนจะถอดรหัสเป็นอักขระ ASCII ที่พิมพ์ได้หรือคำของพจนานุกรมซึ่งอาจเป็นไปได้กับตัวพิมพ์ใหญ่และ / หรือช่องว่างก่อนหน้า
Dennis

9

JavaScript (ES6), 111 110 ไบต์

บันทึกเป็นไบต์ด้วย@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!`

คำอธิบาย

รับอาร์เรย์ของตัวเลขส่งคืนสตริงหรือตัวเลข0สำหรับ 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!`

ทดสอบ


นั่นเป็นวิธีที่ฉลาดในการทำสิ่งนี้! ฉันคิดว่าคุณสามารถบันทึกสองไบต์ด้วยs+=s&&n>s&&n,d*=d&&n>d&&n
ETHproductions

@ETHproductions sต้องทำด้วยวิธีนี้เพราะจะต้องตั้งค่าเป็นfalseหากn>sแต่d*falseมีผลเหมือนกันดังนั้นจึงใช้งานได้ ขอบคุณ!
user81655

5

ชวา 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

@Undefined ฟังก์ชั่นใช่จับได้ดี
ECS

4

MATL , 66 ไบต์

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

ใช้รีลีสปัจจุบัน (10.0.3)ซึ่งเร็วกว่าความท้าทายนี้

อินพุตจาก stdin หากไม่ใช่ super หรือ duper เอาต์พุตจะว่างเปล่า (ซึ่งเป็นเท็จ)

แก้ไข (7 เมษายน 2016) : เนื่องจากการเปลี่ยนแปลงในรุ่น 16.0.0 ของภาษา5Lและ6Lต้องถูกแทนที่ด้วย3Lและ4Lrepectively ลิงก์ไปยังคอมไพเลอร์ออนไลน์รวมถึงการดัดแปลงเหล่านั้น

ลองออนไลน์ !

คำอธิบาย

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 ไบต์

อัปเดต 3:กลับไปที่ 165 ไบต์ขอบคุณความคิดเห็นของ CompuChip

อัปเดต 4:ความคิดเห็นอื่นโดย CompuChip และอีก 4 ไบต์ปิด

อัปเดต 5: การใช้autoแทนstringพร้อมกับข้อเสนอแนะอื่นโดย CompuChip โกนรหัสออกอีก 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!":"";}

โปรแกรมเต็มรูปแบบ Ungolfed พร้อมกรณีทดสอบ:

#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
สตริงIt's a array!เป็น truthy ( หลักฐาน ) ตามความหมายของเราใน Meta
Dennis

@Dennis จริง ๆ แล้วมันเป็นข้อผิดพลาดในการคอมไพล์ (ฉันใช้ C ++ 14 std :: string literal ไม่ใช่อาเรย์ตัวอักษรดิบ) ซึ่งไม่ใช่ อย่างไรก็ตามฉันกำลังปรับปรุงคำตอบของฉันเพื่อพิมพ์สตริงที่ว่างเปล่าในขณะนี้เนื่องจากเป็นวิธีการที่ใช้ในการแก้ปัญหาอื่น ๆ
อเล็กซานเด Revo

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
คุณไม่สามารถหลีกเลี่ยงการเพิ่มทีละอย่างได้หรือไม่ หนึ่งใน initializer ดูเหมือนไม่จำเป็น? หรือนั่นทำให้คุณวนซ้ำหนึ่งวงมากเกินไปหรือไม่
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สำหรับ super 1สำหรับ duper และ0for none


1

Pyth - 54 52 ไบต์

ส่วนการจัดรูปแบบสตริงอาจจะเป็นกอล์ฟ แต่ฉันชอบวิธีการทดสอบที่ยอดเยี่ยม

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

Test Suite


1
c2"superduper"สามารถเล่นกอล์ฟถึง+R"uper""sd"
isaacg

@isaacg มันยอดเยี่ยมจริงๆ
Maltysen

3
คุณไม่มีเครื่องหมายอัศเจรีย์ฉันคิดว่า
ETHproductions

4
@TrangOul lang-pythไม่มีอยู่จริง
Dennis

2
นี้จริงพิมพ์ "มันเป็นอาร์เรย์" ไม่ใช่ซุปเปอร์ไม่ใช่ duper อาร์เรย์ซึ่งเป็นสตริง truthy ตามกับคำนิยามเกี่ยวกับเมตา นอกจากนี้สตริงที่พิมพ์ควรลงท้ายด้วยเครื่องหมายอัศเจรีย์
อเล็กซานเด Revo

1

Python 3, 127

บันทึก 5 ไบต์ด้วย FryAmTheEggman

ทางออกพื้นฐานที่เป็นธรรมตอนนี้ไม่มีอะไรแฟนซีเกินไป เพียงแค่เรียกใช้ผลรวมของผลรวมและผลิตภัณฑ์และตรวจสอบแต่ละองค์ประกอบ

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ส่วนจะถูกเรียกว่าหนึ่งครั้งก่อนที่จะมีการแยกวิเคราะห์ระเบียน / เขตข้อมูล ส่วนที่เหลือของภาษานั้นค่อนข้าง 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 ทุกคนสามารถอธิบายได้ว่าทำไมสิ่งนี้จึงถูกลดระดับลง
อเล็กซานเด Revo

ไม่ใช่ฉัน แต่ฉันต้องการคำอธิบายของรหัส Idk AWK เช่นกัน
mbomb007

พิมพ์นี้It's a array!สำหรับอาร์เรย์ที่มีค่าสุดมิได้ duper ซึ่งเป็นสตริง truthy ตามความหมายของเราใน Meta
Dennis

เพื่อทดสอบลอง:echo 1 2 6 | <the above code>
Robert Benson

2
@ เดนนิสมันไม่ใช่ว่าฉันกำลังพูดถึงความท้าทาย แต่ความท้าทายบอกว่า"ถ้าอาเรย์นั้นไม่ได้ยอดเยี่ยมหรือยอดเยี่ยมคุณสามารถพิมพ์ค่าที่ผิดพลาดได้" ในขณะที่ในกรณีอื่น ๆจะต้องใช้แทน ฉันจะบอกว่าตราบใดที่ผลลัพธ์มีความแตกต่างอย่างชัดเจนจากกรณีอื่นและแก้ไขให้ถูกต้อง ฉันต้องการคำของ OP เกี่ยวกับเรื่องนี้
Stefano Sanfilippo

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;

หากไม่มี register globals มันจะเป็นแบบนี้ (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)
  • บันทึกไบต์ด้วยการเริ่มต้น$pเป็น 1 ดังนั้นการเพิ่มต้นทุนผลิตภัณฑ์จึงลดลง

ทางออกที่ดี ไม่กี่บันทึก: $aนี่คือค่าโปรแกรมเต็มรูปแบบหรือฟังก์ชั่นที่คุณไม่ได้จัดการกับการป้อนข้อมูลของคุณ คุณไม่ต้องกังวลเกี่ยวกับประกาศและอื่น ๆ - เพียงแค่เพิกเฉยต่อสิ่งเหล่านี้บนไซต์นี้
แทรกชื่อที่นี่

ฉันควรแทนที่ด้วย $ argv [1] แทนหรือไม่ มีโพสต์ในเมตาเกี่ยวกับอินพุตที่ยอมรับได้สำหรับ PHP (หรือโดยทั่วไป) นี่คือสนามกอล์ฟครั้งแรกของฉัน
aross

2
@ aross ไปเลย นอกจากนี้ยังมีสิ่งนี้โดยเฉพาะเกี่ยวกับ PHP แต่ก็ไม่เคยได้รับความสนใจมากนัก โดยทั่วไปแล้วอาร์กิวเมนต์ STDIN และบรรทัดคำสั่งเป็นเกมที่ยุติธรรม คุณยังสามารถส่งรหัสของคุณเป็นฟังก์ชันได้
Martin Ender

ฉันคิดว่าการไปด้วย$argv[1]เป็นทางเลือกที่ดี ที่ถูกกล่าวว่าความท้าทายนี้คลุมเครือมากเกี่ยวกับมัน - และรูปแบบผลลัพธ์ แต่คุณอาจถูกลงโทษในความท้าทายอื่น ๆ ด้วยวิธีนี้ และการเข้ารหัสอย่างหนักอินพุตนั้นไม่เป็นที่ยอมรับ - แม้ว่าจะมีข้อยกเว้นบางประการที่อนุญาต ฉันรู้ว่าการอ่านการป้อนข้อมูลที่มีราคาแพงมากใน PHP ที่ว่าทำไมฉันถามคำถามที่คล้ายกันในการเมตาเกี่ยวกับมัน
insertusernamehere

สคริปต์ของฉันจะทำงานด้วยregister_globalsแต่ฉันจะเขียนสนามกอล์ฟในอนาคตเป็นฟังก์ชั่นแทน ทำไมโอ้ทำไมshort_closuresถูกปฏิเสธ?
aross

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

สกาลา, 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จับโครงสร้างทั่วไปของการทดสอบหรือ super duper โดยการดำเนินการโดยพลการและองค์ประกอบที่เป็นกลางโดยพลการo ติดตาม tuples ที่เป็นผลมาจากการผูกมัดองค์ประกอบทั้งหมดเห็นกับผู้ประกอบการและกล่าวว่าสำหรับองค์ประกอบมองที่เพื่อให้ห่างไกลทุกองค์ประกอบนี้มีขนาดใหญ่กว่าก่อนหน้านี้คำนวณผลรวม / สินค้า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

05AB1E , 53 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.