하늘을 봐! 슈퍼 듀퍼 어레이입니다!


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!. 배열이 듀 퍼일 수도 있습니다. 슈퍼가 아닙니다. 예를 들어 {1, 2, 3},이 경우 인쇄해야 It's a duper array!합니다. 어레이가 수퍼 또는 듀 퍼가 아닌 경우 잘못된 값을 인쇄 할 수 있습니다.

평소와 같이 이것은 코드 골프이므로 표준 허점이 적용되고 바이트 단위의 최단 답변이 이깁니다.


9
성가신 I / O 형식이 마음에 들지 않지만 지금 변경하기에는 너무 늦을 수 있습니다.
lirtosiast

1
{1, 2, 3}어레이에 "duper-non-super"를 의미한다고 확신 하십니까?
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

슈퍼 또는 듀 퍼가 아닌 배열에 대해 빈 문자열 (거짓)을 인쇄합니다. 온라인으로 사용해보십시오!

작동 원리

+\,×\<Ḋ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
평소와 같이 좋은 방법, Dennis :) 젤리 문서를 읽을 시간이 얼마
남지 않았습니다

Jelly에서 문자열 압축이 작동하는 방법에 대한 문서가 있습니까?
Luis Mendo 2016 년

@LuisMendo 지금은 아닙니다. 현재 압축 방법은 실험적이며 곧 변경하겠습니다. 빠른 개요 : 코드 페이지 의 색인을 사용하여 압축 된 문자열이 이젝트베이스 250에서 정수로 변환됩니다. 각 단계는 변경 가능한 대소 문자 및 / 또는 그 이전의 공백으로 가능한 인쇄 가능한 ASCII 문자 또는 사전의 단어로 디코딩합니다.
Dennis

9

자바 스크립트 (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!`

설명

숫자 배열을 가져오고 문자열 또는 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!`

테스트


이것이 영리한 방법입니다! 나는 당신이 2 바이트를 절약 할 수 있다고 생각합니다s+=s&&n>s&&n,d*=d&&n>d&&n
ETHproductions

@ETHproductions sfalseif 로 설정해야하기 때문에 이런 식으로 수행해야 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=trueboolean 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)를 사용합니다 .

입력은 표준 입력입니다. 수퍼 또는 듀 퍼가 아닌 경우 출력이 비어 있습니다 (거짓).

EDIT (2016년 4월 7일) : 때문에 언어의 버전 16.0.0의 변화로 5L하고 6L필요로 대체 할 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, ..., 161157 바이트

더 짧게 만드는 방법을 생각할 수 없습니다. 항상 개선의 여지가있는 것 같습니다!

업데이트 1 : 나는 안전한 코드를 위해 모두 있지만, 원시 배열과 함수 인수로 크기를 취하는 것은 벡터를 취하는 것보다 9 바이트 짧습니다 :(

업데이트 2 : 이제 8 바이트의 비용으로 빈 문자열을 false 값으로 반환합니다.

업데이트 3 : CompuChip의 의견 덕분에 165 바이트로 돌아갑니다.

업데이트 4 : CompuChip의 또 다른 의견, 또 다른 4 바이트.

업데이트 5 : 사용하는 auto대신 stringCompuChip에 의해 또 다른 제안과 함께 코드 떨어져 또 다른 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!메타 에 대한 우리의 정의에 따라 진실합니다 ( 증거 ) .
Dennis

@Dennis 실제로 컴파일 오류입니다 (원시 문자 배열이 아닌 C ++ 14 std :: string 리터럴을 사용하고 있습니다). 어쨌든 다른 솔루션에서 사용되는 접근 방식이므로 빈 문자열을 인쇄하도록 답변을 업데이트하고 있습니다.
Alexander Revo

1
당신이 길이 잃을 경우 몇 바이트 면도 할 수 if ... >= 비교 : 내가 생각 e=r>s?e:0하는 것과 같습니다 if(r<=s)e=0.
CompuChip 2019 년

1
@AlexanderRevo는 일과 같지 for(s=p=*a;--n;s+=r,p*=r)r=*++a않습니까? i완전히 떨어 뜨릴 수
있을까요

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돌아갑니다 .3210


1

Pyth- 54 52 바이트

문자열 서식 부분은 골퍼 일 수 있지만 슈퍼 듀퍼 테스트 방식이 마음에 듭니다.

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

테스트 스위트 .


1
c2"superduper"에 golfed 할 수 있습니다+R"uper""sd"
isaacg

정말 똑똑한
@isaacg

3
느낌표가
빠졌다고

4
@TrangOul lang-pyth이 없습니다.
Dennis

2
이것은 실제로 non-super-du-duper 배열에 대해 "It 's a array"를 인쇄합니다. 이것은 meta 에 대한 정의에 따른 문자열 입니다. 또한 인쇄 된 문자열은 느낌표로 끝나야합니다.
Alexander Revo

1

파이썬 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를 모르는 경우 레코드는 변수를 기준으로 행으로 자동 구문 분석되고 행은 variable 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를 모르겠습니다. 왜 이것이 다운 피트되었는지 설명 할 수 있습니까?
Alexander Revo

내가 아니었지만 코드에 대한 설명을 원합니다. Idk AWK.
mbomb007

이것은 It's a array!Super 또는 Duper가 아닌 배열에 대해 인쇄 합니다. 이는 Meta대한 정의에 따라 문자열 입니다.
Dennis

테스트 시도 :echo 1 2 6 | <the above code>
Robert Benson

2
@Dennis 그것은 내가 nitpicking하는 것과 같지 않지만 도전은 "어레이가 슈퍼도 듀퍼 도 아닌 경우 거짓 값을 인쇄 할 수 있습니다 " 라고 말합니다 . 다른 경우에는 대신 사용해야합니다 . 출력이 다른 경우와 명확하게 구별되고 정확하기 만하다면 괜찮습니다. 이것에 대한 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;

레지스터 전역이 없으면 다음과 같습니다 (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 로 초기화하여 바이트를 절약 하므로 제품 업핑 비용이 줄어 듭니다.

좋은 해결책. 몇 가지 참고 사항 : 이것은 입력을 처리하지 않는 완전한 프로그램이나 기능이 아닙니다 $a. 통지 및 내용에 대해 걱정할 필요가 없습니다.이 사이트에서이를 무시하십시오.
insertusername 여기

대신 $ argv [1]로 바꿔야합니까? PHP (또는 일반적으로)에 적합한 입력에 대한 메타 게시물이 있습니까? 이것은 내 첫 골프입니다
aross

2
@aross 여기 있습니다. PHP에 대해서도 특별히 있지만 많은 관심을받지 못했습니다 . 일반적으로 STDIN과 명령 줄 인수는 공정한 게임입니다. 코드를 함수로 제출할 수도 있습니다.
Martin Ender 2016 년

나는 함께가는 $argv[1]것이 좋은 대안 이라고 생각 합니다. 그러나이 과제는 입 / 출력 형식에 대해 매우 모호합니다. 그러나이 방법으로 다른 문제에 대해 처벌을받을 수도 있습니다. 입력을 하드 코딩하는 것은 실제로 허용되지 않습니다. 허용되는 예외가 있습니다. PHP에서 입력을 읽는 것이 매우 비싸다는 것을 알고 메타에 대해 비슷한 질문을했습니다 .
insertusername 여기

내 스크립트 register_globals는와 함께 작동 하지만 대신 미래의 골프를 함수로 작성합니다. 왜 short_closures가 거부 되었습니까?
13:13

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

온라인으로 사용해보십시오!

Falsy value : 함수 목록을 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

하스켈, 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와 임의의 중립 요소 를 사용하여 수퍼 또는 듀퍼 테스트의 공통 구조를 캡처합니다 t. 는 foldr튜플 트랙 유지 오퍼레이터 모든 요소 볼 체인의 결과 와 원경 보았다 요소마다,이 요소가 이전에 계산 된 합 / 제품보다 큰이었다 여부를 말한다.(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.