Sua tarefa hoje é escrever um programa ou função que utilize uma matriz de números inteiros e conte o número de vezes, lendo da esquerda para a direita, que o valor muda. Isso é mais fácil de mostrar com um exemplo:[1 1 1 2 2 5 5 5 5 17 3] => [1 1 1 **2** 2 **5** 5 5 5 **17** **3**] => 4
Caso de teste:
Input | Output
[] | 0
[0] | 0
[0 1] | 1
[0 0] | 0
[1 2 3 17] | 3
[1 1 1 2 2 3] | 2
[-3 3 3 -3 0] | 3
Isso é código-golfe , o menor número de bytes vence!
code-golf
array-manipulation
Pavel
fonte
fonte
False
será impresso?2+False
e erros, não está bem, mas se eu conseguir2
, tudo bem.0
aceitável?Respostas:
MATL , 2 bytes
Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
Python 3 , 38 bytes
Experimente online!
fonte
maximum recursion depth exceeded
.y>()
será avaliado como False , para que o código a seguirand
não seja executado.Haskell , 33 bytes
Experimente online!
Bônus: Versão aritmética um pouco curiosa e sem pontos (44 bytes)
Experimente online!
Dada uma entrada
[1,1,4,3,3,3]
, primeiro pegamos a diferença das entradas adjacentes ([0,3,-1,0,0]
), depois oabs
valor olute:[0,3,1,0,0]
. Levando zero à potência de cada elemento na primeira vez[1,0,0,1,1]
, e uma segunda vez inverte a lista:[0,1,1,0,0]
((1-)
também funcionaria aqui em vez de(0^)
). Finalmente, pegamos osum
da lista para obter2
.fonte
Python 2 , 42 bytes
Experimente online!
fonte
Flacidez cerebral , 50 bytes
Experimente online!
Não produz nada para 0, o que no cérebro é equivalente. Se isso não for aceitável, acrescente-o a
+4
bytes:({})
Explicação:
fonte
-0+1 = 1
Flacidez cerebral , 50 bytes
Experimente online!
fonte
Haskell , 35 bytes
-8 bytes graças a H.PWiz.
Out-golfed por uma versão recursiva . Haskell é praticamente o melhor em recursão e eu perdi. > _ <
Experimente online!
Seria incrível se alguém descobrisse como empregar essa dica .
Solução alternativa, 36 bytes
Experimente online!
fonte
uncurry
da funçãof
para fazê-la funcionar. Estesum.map fromEnum.(zipWith(/=)=<<tail)
é provavelmente o mais próximo que você começa, mas não vai trabalhar com[]
e é de 37 bytes ..Java (OpenJDK 8) , 65 bytes
Não é tão curto quanto eu gostaria, mas isso é apenas Java para você.
Teste passando a matriz como uma lista delimitada por vírgula.
Experimente online!
fonte
a->{int s=0,p=a[0];for(int n:a)s+=p==(p=n)?0:1;return s;}
(57 bytes).a->{int s=0;for(int i:a)s+=a[0]!=(a[0]=i)?1:0;return s;}
Casca , 3 bytes
Experimente online!
Explicação
fonte
Ohm v2 , 3 bytes
Experimente online!
Explicação
fonte
sign
builtin!Língua Wolfram (Mathematica) , 23
242629bytesExperimente online!
Split[]
.uma pequena explicação:
Split
dividirá uma matriz em uma lista de listas (dos mesmos elementos), ou seja, se transformará{1, 2, 2, 3, 1, 1}
em{{1}, {2, 2}, {3}, {1, 1}}
. Então,Length@Split@#
é a quantidade de segmentos consecutivos.Max[*****-1, 0]
é usado para lidar com{}
entrada.fonte
Max[Length@Split@#-1,0]&
Length@Split@#~Max~1-1&
Retina ,
242116 bytesGraças a @MartinEnder por -3 bytes e percebendo um erro
-1 byte graças a @tsh
-4 bytes graças a @Leo
Experimente online!
fonte
Python simbólico ,
120117 bytesGolpeou 3 bytes removendo uma conversão explícita para inteiro (usando unário
+
) para a variável do contador - isso significa que, se não houver alterações na matriz, a saída será emFalse
vez de0
, mas isso é permitido por meta .Experimente online!
fonte
Gelatina , 3 bytes
Experimente online!
Como funciona
fonte
K (oK) , 8 bytes
Solução:
Experimente online!
Exemplos:
Explicação:
Interpretado da direita para a esquerda:
fonte
05AB1E , 3 bytes
Experimente online!
fonte
Casca , 4 bytes
Experimente online!
fonte
R , 24 bytes
Experimente online!
O mesmo que a resposta MATL, usada apenas
sum(!!diff))
porque não hánnz
.fonte
rle
seria mais curto, mas não,length(rle()$v)
usa muitos caracteres e está desativado por um.sum(rle()$v|1)
vez delength
qualquer maneira. :)Cubix , 24 bytes
Experimente online
Observe que o Cubix usa 0 para indicar que não há mais entradas, portanto, 0 não pode estar na lista.
Explicação
Desdobrado:
Começamos no
0
, pressionando o contador (inicializado com0
) e a primeira entrada (I
) para a pilha.Em seguida, entramos no loop. A cada iteração do loop, obtemos a próxima entrada com
I
. Se for 0, ficamos sem entradas, então giramos o contador para top (p
),O
utput e exit (@
).Caso contrário, consideramos a diferença dos dois principais elementos. Se for diferente de zero, giramos o contador para cima, incrementamos e giramos de volta para baixo com
p)q
. Em seguida, mostramos a diferença;
antes de passar para a próxima iteração.Todos os caracteres não mencionados aqui são apenas controle de fluxo. Existem muitos programas nos programas Cubix.
fonte
0
por a(
, mas isso falha na entrada vazia.Flacidez cerebral , 50 bytes
Experimente online!
Como todo mundo está postando suas soluções de 50 bytes aqui é minha (eu tenho uma de 48 bytes, mas foi uma modificação simples do DjMcMayhem, então achei que valha a pena postar)
Explicação
Esta resposta usa extensivamente o cancelamento de valor.
Sem golfe parece
Aqui, calculamos os delta's até que a pilha tenha um item restante, cada vez que acumulamos um valor do loop interno se o delta for diferente de zero.
Esta é uma maneira bastante direta de fazê-lo.
Para fazer este golfe, começamos o cancelamento de valor. O primeiro e o que deve ser óbvio para qualquer jogador endurecido de ataques cerebrais são as alturas das pilhas. É um fato bem conhecido que
é o mesmo que
Quando os valores são modificados por um, o mesmo vale. Isso nos dá
Você pode notar que isso nem nos salvou bytes, mas não se preocupe, isso se tornará mais útil à medida que prosseguimos.
Podemos realizar outra redução, se você vir uma declaração
você pode reduzi-lo a
Isso funciona porque se inserirmos o loop
[(...)]
e{}
cancelar, e se não o fizermos, o valor de[(...)]
já era zero em primeiro lugar e não precisará ser cancelado. Como temos uma ocorrência desse padrão em nosso código, podemos reduzi-lo.Isso nos salvou 2 bytes, mas também colocou dois pontos negativos um ao lado do outro. Estes podem ser combinados para salvar outros 2.
E esse é o nosso código.
fonte
Perl 6 , 18 bytes
Teste-o
Expandido:
fonte
Gaia , 2 bytes
Experimente online!
Isso abusa de um bug (ou recurso?) Do Gaia, que a codificação do comprimento da execução não leva em consideração a última execução dos elementos. Observe que eu verifiquei duas vezes, ele funciona para todos os casos de teste.
ė
- Execute a codificação de comprimento (com a falha descrita acima).l
- Comprimento.fonte
JavaScript (ES6), 35 bytes
fonte
f=([a,...b])=>1/a?!!(a-b[0])+f(b):0
Pitão, 5 bytes
Suíte de teste.
Explicação:
fonte
APL (Dyalog) , 8 bytes
Experimente online!
Quão?
⊃,⊢
- a lista, com o primeiro valor repetido para o caso de elemento único2≠/
- lista de alterações, não é igual para cada 2 elementos+/
- somafonte
Perl 5 , 37 + 2 (
-ap
) = 39 bytesExperimente online!
fonte
J, 10 bytes
Infixes de comprimento 2 ... são desiguais?
2 ~:/\ ]
Soma a lista resultante de
0
s e1
s:+/
Experimente online!
fonte
[:+/0=-/\
deve funcionar, acho que 9 bytes.Ruby , 31 bytes
Experimente online!
fonte
.drop(1)
você pode fazer[1..-1]
drop
retorna um enumerador , não uma matriz, para que não funcione.size
de uma matriz de qualquer maneira?C (gcc 5.4.0), 61 bytes
Experimente Online!
f
é uma função que leva o comprimento da matriz e um ponteiro para o primeiro elemento da matriz e retorna o número de alterações na matriz;Este envio utiliza um comportamento indefinido (
*p++!=*p
, p é usado duas vezes em uma expressão na qual é alterado), que funciona na minha máquina (gcc 5.4.0) e no TIO, mas pode não funcionar em outras implementações ou versões.Explicação:
fonte
05AB1E , 3 bytes
Experimente online!
Uma alternativa à resposta de Erik.
fonte