Listas Inteiras de Noé

25

Introdução:

Acho que todos já ouvimos falar, mas aqui está um breve resumo: Noé reuniu duas espécies de animais do planeta, macho e fêmea, para salvar em sua arca durante uma grande enchente. A citação real da Bíblia é:

Gênesis 7: 2-3
Você deve levar consigo sete de todo tipo de animal limpo, o macho e seu companheiro, dois de todo tipo de animal impuro, o macho e seu companheiro, e também sete de todo tipo de pássaro no céu , homem e mulher, para preservar seus filhos na face da terra.
fonte

Mas, para o bem deste desafio, ignoraremos a parte limpa / imunda e a parte em que ele levou sete de cada animal. Este desafio é apenas sobre esta parte:

dois de todo tipo de animal impuro , o macho e seu companheiro

Desafio:

Entrada:

Você recebe uma lista de números inteiros positivos (em ordem aleatória).

Saída:

Dois valores distintos indicando se é uma 'Lista de Noé' ou não. Isso não é necessário que seja um valor de verdade / falsey ; portanto, também pode ser 0/ 1em Java / C # ou 'A'/ 'B'em qualquer idioma, para dar alguns exemplos.

Quando uma lista é uma 'Lista de Noé'? Quando houver exatamente dois de cada número inteiro na lista.

Regras do desafio:

  • A E / S é flexível. A entrada pode ser uma lista / matriz / fluxo de números inteiros / flutuantes / seqüências de caracteres ou pode ser lida uma a uma a partir de STDIN. A saída pode ter dois valores distintos , retornados de uma função ou saída para STDOUT / um arquivo.
  • Os números inteiros na lista de entrada estão em ordem aleatória e são garantidos positivos dentro do intervalo 1n100000 .
  • A lista de entrada é garantida como não vazia.
  • Ter um número inteiro múltiplo de duas vezes presente acima de 2 (ou seja, 4, 6, 8, etc.) será falsey. Ou seja, [6,4,4,6,4,7,4,7]é Falsey, embora você ainda pode criar pares iguais como este: [[4,4],[4,4],[6,6],[7,7]].

Regras gerais:

  • Isso é , então a resposta mais curta em bytes vence.
    Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação.
  • As regras padrão se aplicam à sua resposta com as regras de E / S padrão , para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
  • As brechas padrão são proibidas.
  • Se possível, adicione um link com um teste para o seu código (ou seja, TIO ).
  • Além disso, é altamente recomendável adicionar uma explicação para sua resposta.

Casos de teste:

Truthy:
[7,13,9,2,10,2,4,10,7,13,4,9]
[1,2,3,1,2,3]
[10,100,1000,1,100,10,1000,1]
[123,123]
[8,22,57189,492,22,57188,8,492,57188,57189,1,1]

Falsey:
[6,4,4,6,4,7,4,7]
[2,2,2,2,2,2]
[5,1,4,5,1,1,4]
[77,31,5,31,80,77,5,8,8]
[1,2,3,2,1]
[44,4,4]
[500,30,1]
[1,2,1,1]
[2,4,6,4,4,4]
[2,23,34,4]
[2,23,3,3,34,4]
Kevin Cruijssen
fonte
12
E no Alcorão também; Sura Al-Mumenoon, versículo 27: Então o inspiramos (com esta mensagem): "Construa a arca à nossa vista e sob nossa orientação: quando chegar o nosso comando, e as fontes da terra jorrarem, leve-o a bordo de pares de todas as espécies, homens e mulheres, e tua família - exceto aquelas contra as quais a Palavra já foi divulgada: e não me dirija a favor dos malfeitores, pois serão afogados (no dilúvio). (Yusuf Ali)
Ishaq Khan

Respostas:

19

Python 3 , 31 bytes

lambda l:{*map(l.count,l)}=={2}

Experimente online!


Python 2 , 33 bytes

lambda l:set(map(l.count,l))=={2}

Experimente online!

TFeld
fonte
Legal, não sabia que o operador splat trabalhava dentro de literais definidos, se estou interpretando isso corretamente.
ApproachingDarknessFish
13

05AB1E , 4 bytes

¢<PΘ

Experimente online! ou como um conjunto de testes

Explicação

¢      # count all occurrences of each element in the input list
 <     # decrement each
  P    # product
   Θ   # is equal to 1
Emigna
fonte
Ah, eu havia me preparado ¢2QP, mas usar Θtambém é uma boa alternativa. :)
Kevin Cruijssen
Pensei que eu tinha 3 com {ιË, mas é claro que falha quando números inteiros ocorrem 4 vezes.
Grimmy
9

Braquilog , 4 bytes

ọtᵛ2

Experimente online!

Explicação

ọ           Get the list of occurences of elements in the input: [[x,2], [y,2], …]
  ᵛ         Verify that for each of those pairs…
 t          …the tail (i.e. the number of occurences)
   2        …is 2
Fatalizar
fonte
8

R , 20 bytes

-6 bytes graças ao digEmAll alterando o método de entrada

any(table(scan())-2)

Experimente online!

Saídas FALSEse for uma lista de Noah, e TRUEcaso contrário. Funciona para qualquer tipo de entrada, não apenas números inteiros.

Calcula a contagem de cada valor na lista e verifica se alguma das contagens é diferente de 2.

Robin Ryder
fonte
Você pode obter informações do stdin economizando 6 bytes: Experimente online!
digEmAll 8/07
@digEmAll Obrigado; Eu li mal as regras do desafio e achei que isso não era permitido.
Robin Ryder
6

Haskell , 33 bytes

f x=and[sum[1|b<-x,b==a]==2|a<-x]

Experimente online!

Para cada elemento da entrada, garantimos que ele apareça duas vezes na lista de entradas.

sum[1|b<-x,b==a]é apenas uma versão golfista do length(filter(==a)x).

Assistente de Trigo
fonte
6

Perl 6 , 18 bytes

{so.Bag{*}.all==2}

Experimente online!

  • .Bagconverte a lista de entrada em um Bag- um conjunto com multiplicidade.
  • {*} extrai todas as multiplicidades.
  • .all cria uma junção e das multiplicidades.
  • == 2 resulta em outra junção e booleanos, cada um verdadeiro se a multiplicidade for 2.
  • so reduz a junção para um único booleano.
Sean
fonte
5

J , 10 bytes

[:*/2=#/.~

Experimente online!

Galen Ivanov
fonte
3
também 10 bytes: [:*/2=1#.=eu realmente quero remover esse limite, mas não consigo descobrir como.
cole
1
@ cole quando tentei isso, eu tenho a sua solução. Se você realmente deseja remover a tampa, você também pode fazer 2*/@:=1#.=10 bytes
Conor O'Brien
alternativa agradável @cole!
Galen Ivanov
@ ConorO'Brien Sim, também @:é útil aqui.
Galen Ivanov
1
@GalenIvanov tem que amar o monádico =, tão estranhamente útil em cenários de nicho de golfe
cole
4

MS SQL Server 2017 , 152 150 146 bytes

CREATE FUNCTION f(@ NVARCHAR(MAX))RETURNS
TABLE RETURN SELECT IIF(2=ALL(SELECT
COUNT(*)FROM STRING_SPLIT(@,',')GROUP BY
PARSE(value AS INT)),1,0)r

A versão legível:

CREATE FUNCTION f(@ NVARCHAR(MAX)) RETURNS TABLE RETURN
  SELECT IIF(2 = ALL(SELECT COUNT(*)
                     FROM STRING_SPLIT(@, ',')
                     GROUP BY PARSE(value AS INT)), 1, 0) AS r

Experimente no SQL Fiddle !

-2 bytes graças a Kevin Cruijssen

Andrei Odegov
fonte
1
Como você não usa o alias, ele não pode cser removido após o COUNT(*)?
Kevin Cruijssen 08/07
@KevinCruijssen, você está certo, obrigado.
Andrei Odegov 08/07
4

Haskell , 61 45 bytes

import Data.List
all((2==).length).group.sort

Experimente online!

Obrigado a @KevinCruijssen por 12 bytes e a @nimi por mais 4.

Primeira resposta de Haskell, mas foi surpreendentemente fácil de fazer. Provavelmente pode ser muito jogado. Caso em questão...

J. Sallé
fonte
3
Eu não sei Haskell, mas eu tenho certeza que all(True==).map(2==)pode ser all(2==). :)
Kevin Cruijssen
4
... e movimento lengthpara all: all((2==).length).group.sort. Não é necessário dar um nome à função, ou seja, largar o f=.
nimi
Na verdade, eu negligenciei o all(2==)quando estava testando no GHCi. Obrigado Kevin e Nimi, vou atualizar a resposta.
J. Sallé 08/07
4
... ah e para uso futuro: all(True==)é and.
nimi
4

JavaScript (ES6), 37 bytes

Retorna false para Noah ou true para não Noah.

a=>a.some(v=>a.map(x=>t-=v==x,t=2)|t)

Experimente online!

Comentado

a =>               // a[] = input
  a.some(v =>      // for each value v in a[]:
    a.map(x =>     //   for each value x in a[]:
      t -= v == x, //     decrement t if v is equal to x
                   //     (i.e. if v appears exactly twice, t is decremented twice)
      t = 2        //     start with t = 2
    )              //   end of map()
    | t            //   yield t, which is supposed to be equal to 0
  )                // end of some()
Arnauld
fonte
3

APL (Dyalog Unicode) , 8 bytes SBCS

Função de prefixo tácito anônimo. Retorna 0/ 1.

∧/2=⊢∘≢⌸

Experimente online!

 Para cada valor como argumento à esquerda e índices de ocorrências desse valor como argumento à direita, chame:

 conte o argumento certo (as ocorrências) e
 depois
 retorne isso, ignorando o argumento esquerdo

2= Lista booleana indicando quais as notas são 2

∧/ Redução de AND (ou seja, todas são verdadeiras?)

Adão
fonte
3

PowerShell , 66 37 26 bytes

-11 bytes graças ao mazzy

!(($args|group|% c*t)-ne2)

Experimente online!

Agrupa $le obtém todas as contagens de valores correspondentes. Em seguida, filtra todas as contagens de 2 dessa lista. Se a lista estiver vazia, é um número de Noah; caso contrário, ainda será preenchido com contagens diferentes de 2. A não observação da lista será exibida Truese estiver vazia e Falsese for preenchida

Veskah
fonte
1
Falha se os valores se equilibrarem .. ou seja, [1,2,1,1] para que a contagem seja 4, a contagem de exclusivo é 2 e, portanto, será resolvida como noé, apesar de não ser noé.
Data de
@ExpiredData Heck
Veskah
Eu tentei essa abordagem em outro idioma antes de perceber que simplesmente não funcionaria ...
Data expirada
1
¯ \ _ (ツ) _ / ¯ 26
mazzy 08/07
1
@mazzy Obrigado. Esqueceu tudo sobre groupser uma coisa que existe
Veskah 08/07
3

PHP , 60 bytes

function($a){return!array_diff(array_count_values($a),[2]);}

Experimente online!

O PHP tem ótimos recursos embutidos para isso, embora com 20 caracteres, array_count_values()não é muito bom.

640KB
fonte
O PHP sempre tem ótimos built-ins, com nomes longos, suspiro!
Night2
3

Mathematica, 25 24 bytes

MatchQ[{{_,2}..}]@*Tally

Experimente online!

A Tallyfunção retorna uma lista do formulário , que é comparada com um padrão que verifica se todas as contagens são 2.{{element, count}, ...}

Maçaneta da porta
fonte
3

Anexo , 16 bytes

${All&x!{_~x=2}}

Experimente online!

Explicação

${All&x!{_~x=2}}
${             }    lambda with input x
  All&x!{     }     over each element _ of x:
         _~x            check that the number of occurrences of _ in x
            =2          is 2

Alternativas

17 bytes: {All&_!`=&2@`~&_}

18 bytes: {All[`=&2@`~&_,_]}

23 bytes: Same@2&`'@Sum@Table[`=]

25 bytes: Same«2'Sum@Table[`=,_]»

25 bytes: Same<~2'Sum@Table[`=,_]~>

25 bytes: {Same[2'Sum@Table[`=,_]]}

35 bytes: {Commonest@_==Unique@_and _[0]~_=2}

Conor O'Brien
fonte
3

TI-Basic, 47 bytes

Input(L1
SortA(L1
not(remainder(dim(L1,2)) and prod(not(△List(L1))=seq(remainder(I,2),I,1,-1+dim(L1

Sou um grande fã do TI-Basic. Não é uma linguagem excelente para qualquer finalidade, mas eu gosto de programar (e jogar golfe) nela.

Como esse código funciona?

Primeiro, ele classifica a lista.

Segundo, ele usa a função △ Lista para gerar outra lista, que é a diferença entre os elementos da lista classificada. (Por exemplo, △ Lista ({1,3,7,8}) renderia {2,4,1}). Aplica-se não a esta lista, que converte todos os elementos diferentes de zero da lista em zero e todos os zero em um.

Em seguida, o programa verifica se a lista resultante se encaixa no padrão {1, 0, 1, 0, ...}, o que só será verdadeiro se a lista original for uma lista de Noé.

Há também uma verificação adicional de que o comprimento da lista é uniforme, para capturar alguns casos extremos.

Aqui estão algumas capturas de tela dos casos de teste:

Alguns casos de teste Mais alguns casos de teste

mprogrammer
fonte
3

Julia 1.0 , 32 bytes

l->sum(isone,l./l')/length(l)==2

Experimente online!

Divide cada elemento da matriz de entrada lpela transposição, l'fornecendo uma matriz. A soma dessa matriz ao aplicar isonea cada elemento fornece o dobro do comprimento de lse cada elemento aparecer exatamente duas vezes.

TimD
fonte
3

K (oK) , 9 bytes

Solução:

&/2=#:'.=

Experimente online!

Explicação:

&/2=#:'.= / the solution
        = / group
       .  / value
    #:'   / count (length of) each
  2=      / equal to 2?
&/        / take minimum
rua
fonte
3

Julia , 30 caracteres 26 bytes

!a=all(x->2==sum(a.==x),a)

Obrigado, H.PWiz por este truque!

Experimente online!

user3263164
fonte
1
Você pode ter !a=all(x->2==sum(a.==x),a)26 bytes. NB que eu recomendo contar em bytes neste site
H.PWiz
Muito obrigado! Eu não sabia que você poderia (ab) usar !para funções anônimas
user3263164
2

Gelatina , 5 bytes

ĠẈ=2Ạ

Experimente online!

Um link monádico que pega uma lista de números inteiros e retorna 1 se uma lista de Noé e 0 se não.

Nick Kennedy
fonte
2

VDM-SL , 64 bytes

f(a)==forall y in set inds a&card{x|x in set inds a&a(x)=a(y)}=2

Explicação

O VDM funciona predominantemente como instruções lógicas de segunda ordem.

forall y in set inds a                //Bind y to each of the indices of a

{x|x in set inds a&a(x)=a(y)}         //build a set of the indices of a who have the same
                                      //value as the value at y

card {...} = 2                        //and check the cardinality of that set is 2

Como você não pode TIO VDM, aqui está a saída de uma sessão de depuração

Dados expirados
fonte
Sei que provavelmente não existe nenhum compilador on-line, mas você poderia adicionar algumas capturas de tela (alguns) dos casos de teste como verificação? :)
Kevin Cruijssen
O @KevinCruijssen salvou alguns bytes corrigindo o erro, o que provavelmente facilitou a compreensão do código. Vou adicionar uma explicação também :)
Data de
2

Excel, 45 bytes

=SUM(IF(FREQUENCY(A:A,A:A)=2,1))=COUNT(A:A)/2

Assume dados na coluna A, com isso inserido em qualquer célula que não seja uma na coluna A. Retorna VERDADEIRO se houver pares e FALSO se não forem pares correspondentes

        FREQUENCY(A:A,A:A)                     Counts how many of each value there is
     IF(                  =2,1)                If this is 2, add value of 1 to array otherwise 0
=SUM(                          )               Sum the count in that array that have a exactly 2
                                 COUNT(A:A)/2  Count how many total values in column
                                =              If this is equal, return TRUE else FALSE

Tentei remover o / 2 e adicionar 0,5 para a soma, mas isso não funcionou.
Tentei contar as frequências que são <> 2 e isso não retornou a quantidade certa.

Keeta
fonte
2

Oitava / MATLAB, 22 21 bytes

@(x)any(sum(x==x')-2)

Função anônima que insere um vetor numérico e gera 0 se o vetor satisfaz a condição ou1 não.

Experimente online! Ou verifique todos os casos de teste .

Explicação

@(x)                   % define anonymous function with input x
            x          % x
               x'      % x transposed and conjugated
             ==        % equality comparison, element-wise with broadcast. Gives a
                       % square matrix
        sum(     )     % sum of each column
                  -2   % subtract 2, element-wise
    any(            )  % true if and only if any value is not zero
Luis Mendo
fonte