Olha, lá em cima no céu! É uma matriz super duper!


39

Inspirado por essa pergunta de nossos amigos rivais na Code Review.

Definições

Uma super matriz é uma matriz em que cada novo elemento da matriz é maior que a soma de todos os elementos anteriores. {2, 3, 6, 13}é uma super matriz porque

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

{2, 3, 5, 11}não é um super array, porque

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

Uma matriz duper é uma matriz em que cada novo elemento da matriz é maior que o produto de todos os elementos anteriores. {2, 3, 7, 43, 1856}é um super array, mas também é um array duper desde

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

O desafio

Escreva uma função ou programa que aceite uma matriz como entrada no formato de lista nativa de idiomas e determine o quão super é a matriz. Opcionalmente, você também pode obter uma entrada de comprimento de matriz (para idiomas como C / C ++). Além disso, você pode assumir que todos os números da lista serão números inteiros maiores que 0. Se for uma super matriz, você deve imprimir It's a super array!Se for uma matriz super duper , você deve imprimir It's a super duper array!Também é possível que uma matriz seja duplicada. não super. Por exemplo: {1, 2, 3}neste caso, você deve imprimir It's a duper array!Se a matriz não for nem super nem duper, é possível imprimir um valor falso.

Como de costume, esse é um código de golfe, então as brechas padrão se aplicam e a resposta mais curta em bytes vence.


9
Não gosto do formato de E / S complicado , mas pode ser tarde demais para mudar agora.
lirtosiast

1
Tenho certeza que você quis dizer "duper-non-super" para a {1, 2, 3}matriz?
Darrel Hoffman

1
@DJMcMayhem opa, de alguma forma eu tenho 2 * 1que igualar 3na minha cabeça.
Alexander Revo 19/01

4
Isso surgiu em um comentário : Sua especificação diz que se a matriz não for nem super nem duper, você poderá imprimir um valor falso. Isso significa que devemos imprimir um valor falso?
Dennis

1
Importa se há 2 espaços entre uma palavra em algum lugar? Eu ainda poderia economizar mais se super[space][space]arrayfor permitido.
Aross

Respostas:


20

Geléia , 47 45 4̷4̷ 42 bytes

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

Isso imprime uma string vazia (falsy) para matrizes que não são nem super nem duper. Experimente online!

Como funciona

+\,×\<Ḋ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
Nice maneira como de costume, Dennis :) Estive fora por um tempo, tempo para ler os docs geléia;)
Kade

Existe alguma documentação sobre como a compactação de strings funciona no Jelly?
18136 Luis Mendo

@LuisMendo Agora não. O método de compactação atual é experimental e vou alterá-lo em breve. Uma visão geral rápida: usando os índices na página de códigos , a sequência compactada é convertida da base bijetiva 250 em número inteiro. Cada etapa decodifica para um caractere ASCII imprimível ou para uma palavra do dicionário, possível com maiúsculas e minúsculas e / ou um espaço antes dele.
Dennis

9

JavaScript (ES6), 111 110 bytes

Guardou um byte graças a @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!`

Explicação

Pega uma matriz de números, retorna uma string ou o número 0para 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!`

Teste


Essa é uma maneira inteligente de fazer isso! Eu acho que você pode salvar dois bytes coms+=s&&n>s&&n,d*=d&&n>d&&n
ETHproductions

O @ETHproductions sprecisa ser feito dessa maneira porque precisa ser definido como falseif n>s, mas d*falsetem o mesmo efeito para que um funcione. Obrigado!
precisa saber é o seguinte

5

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

Fiz as seguintes suposições:

  • A saída é via valor de retorno.
  • A String vazia ""é um valor falso.

Se algum destes estiver errado, por favor me diga.

De qualquer forma, não posso deixar de pensar que poderia ter exagerado com a quantidade de variáveis.

Edit: conseguiu salvar um byte, graças a @UndefinedFunction


1
Seria possível mudar boolean s=truepara boolean s=1<2?
jrich

@UndefinedFunction Sim, boa captura
ECS

4

MATL , 66 bytes

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

Usa a versão atual (10.0.3) , anterior a esse desafio.

A entrada é de stdin. Se não for super ou duper, a saída está vazia (o que é falsey).

EDIT (7 de abril de 2016) : devido a alterações no release 16.0.0 do idioma, 5Le 6Lprecisa ser substituído 3Le respeitosamente 4L. O link para o compilador online inclui essas modificações.

Experimente online !

Explicação

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 bytes

Não consigo pensar em uma maneira de torná-lo mais curto. Parece que sempre há espaço para melhorias!

Atualização 1 : Sou a favor de código seguro, mas pegar uma matriz bruta e seu tamanho como argumentos de função é 9 bytes mais curto que pegar um vetor :(

Atualização 2: agora retorna uma string vazia como valor falso, ao custo de 8 bytes.

Atualização 3: Voltar para 165 bytes, graças ao comentário do CompuChip.

Atualização 4: Outro comentário da CompuChip, mais 4 bytes de desconto.

Atualização 5: usar em autovez de stringjuntamente com outra sugestão do CompuChip remove outros 4 bytes do código.

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

Programa completo não destruído com casos de teste:

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

Saída:

It's a super array!

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

2
A string It's a array!é verdadeira ( prova ) de acordo com nossa definição no Meta .
Dennis

@ Dennis, na verdade, é um erro de compilação (estou usando um C ++ 14 std :: string literal, não uma matriz de caracteres brutos), que também não é. De qualquer forma, estou atualizando minha resposta para imprimir uma string vazia agora, pois essa é a abordagem usada em outras soluções.
Alexander Revo

1
Você pode economizar mais alguns bytes se perder as if ... >= comparações de comprimento : acho que e=r>s?e:0é equivalente a if(r<=s)e=0.
CompuChip

1
@AlexanderRevo não é algo como for(s=p=*a;--n;s+=r,p*=r)r=*++atrabalho? Permitiria que você caísse icompletamente
CompuChip

1
Você não pode evitar um dos incrementos? O do inicializador parece desnecessário? Ou isso dá a você uma repetição de loop demais?
CompuChip

2

C, 150 bytes

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

Cada entrada é finalizada por a 0. Teste principal:

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

Bônus, se for permitido um formato de saída mais compacto, podemos reduzi-lo para 107 bytes :

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

Nesse caso, Zretorne 3para superduper, 2para super, 1para duper e 0para nenhum.


1

Pitão - 54 52 bytes

A parte de formatação da string provavelmente pode ser jogada no golfe, mas eu gosto da abordagem de teste de super-duper.

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

Conjunto de Teste .


1
c2"superduper"pode ser +R"uper""sd"
jogado

@isaacg que é muito inteligente
Maltysen

3
Você está perdendo o ponto de exclamação, eu acho
ETHproductions

4
@TrangOul lang-pythnão existe.
Dennis

2
Na verdade, ele imprime "É uma matriz" para matrizes não super-não-duper, que é uma string verdadeira de acordo com a definição na meta . Além disso, a sequência impressa deve terminar com um ponto de exclamação.
Alexander Revo

1

Python 3, 127

Economizou 5 bytes graças a FryAmTheEggman.

Solução bastante básica no momento, nada muito chique. Basta executar um total de soma e produto e verificar cada elemento.

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)

Aqui estão os casos de teste, caso alguém queira tentar bater minha pontuação.

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 bytes

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

Para aqueles que não conhecem o AWK, os registros são automaticamente analisados ​​em linhas com base na variável RSe as linhas são automaticamente analisadas em campos com base na variávelFS . Também são "" variáveis ​​não atribuídas que, quando adicionadas a um #, agem como um 0. A BEGINseção é chamada exatamente uma vez, antes de qualquer registro / campo ser analisado. O restante do idioma é semelhante ao C, com cada bloco de código correspondente sendo aplicado a cada registro. Consulte http://www.gnu.org/software/gawk/manual/gawk.html#Getting-Started para obter mais detalhes.

Exemplo de execução onde 'code'está como acima: echo 1 2 6 | 'code'

Também pode colocar a matriz em um arquivo chamado Filename e executar como: 'code' Filename

Se o código for executado com frequência, ele poderá ser colocado em um arquivo de script executável. Isso removeria o anexo ' 'e o awkcomando seria colocado na parte superior do arquivo como:#!/bin/awk -f


Eu não sei AWK, alguém poderia explicar por que isso foi rebaixado?
Alexander Revo 19/01

Não fui eu, mas eu gostaria de uma explicação do código. Idk AWK também.
mbomb007

Isso imprime It's a array!para matrizes que não são super nem duper, que é uma string verdadeira de acordo com nossa definição no Meta .
Dennis

Para testar, tente:echo 1 2 6 | <the above code>
Robert Benson

2
@ Dennis, não é como se eu estivesse dando uma palpite , mas o desafio diz: "Se a matriz não for nem super nem duper, você poderá imprimir um valor falso". , enquanto que nos outros casos, must é usado. Eu diria que, desde que a saída seja claramente distinguível dos outros casos e correta, ela deverá ficar bem. Eu gostaria da palavra de OP sobre isso.
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;

Explicação:

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

Sem registradores globais, seria este (118 bytes):

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
  • Economizou mais 3 bytes por não se preocupar com um espaço extra na saída
  • Economizou 3 bytes imprimindo $a(rendimentos de conversão de matriz em cadeia Array)
  • Salve um byte inicializando $pem 1, aumentando assim o custo do produto.

Ótima solução. Algumas notas: Este não é um programa completo nem uma função, pois você não lida com sua entrada $a. Você não precisa se preocupar com avisos e outras coisas - simplesmente ignore-os neste site.
usar o seguinte comando

Devo substituí-lo por $ argv [1]? Existe um post na meta sobre entrada aceitável para PHP (ou em geral)? Este é o meu primeiro golfe
aross

2
@aross Aqui você vai. Há também isso especificamente sobre PHP, mas ele nunca recebeu muita atenção . Em geral, STDIN e argumentos de linha de comando são um jogo justo. Você também pode enviar seu código como uma função.
Martin Ender

Eu acho que ir com $argv[1]é uma boa alternativa. Dito isto, esse desafio é muito vago quanto aos formatos de entrada e saída. Mas você pode ser penalizado com outros desafios com essa abordagem. E codificar permanentemente a entrada não é aceitável - embora haja algumas exceções permitindo isso. Eu sei que a leitura de entrada é muito cara em PHP, por isso fiz uma pergunta semelhante na meta sobre isso .
usar o seguinte comando

Meu script funcionaria register_globals, mas escreverei futuros golfs como uma função. Por que, oh, por que os short_closures foram rejeitados?
aross

1

R , 115 bytes

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

Experimente online!

Valor de falsidade: It's a array! Nada muito chique aqui, exceto talvez o uso sapplyem uma lista de funções.


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

Ungolfed (embora realmente não haja muito trabalho para fazer isso):

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

fé a função necessária. Observe que a soma vazia é 0 e o produto vazio é 1, e é por isso que [0]não é nem super nem duper.

scaptura a estrutura comum de testar super ou duper usando um operador arbitrário oe um elemento neutro arbitrário t. O foldrguarda informação de tuplas (s,b)em que sé o resultado de encadeamento todos os elementos vistos com o operador oeb diz se, para cada elemento olhou até agora, este elemento foi maior do que a soma / produto previamente calculado.

A produção não é muito disputada e eu apreciaria se alguém contribuísse com uma idéia melhor!

Versão um pouco mais legível:

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 bytes

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

Experimente online ou verifique todos os casos de teste .

Explicação:

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

Veja aqui uma explicação de como .•dwā•é "duper" e como „¦È!é "array!".


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.