Listas enteras de Noé

25

Introducción:

Creo que todos hemos oído hablar de él, pero aquí un resumen muy breve: Noé reunió dos de cada especie de animal en el planeta, machos y hembras, para salvar en su Arca durante una gran inundación. La cita real de la Biblia es:

Génesis 7: 2-3
Debes llevar contigo siete de cada tipo de animal limpio, el macho y su compañero, dos de cada tipo de animal inmundo, el macho y su compañero, y también siete de cada tipo de ave en el cielo , macho y hembra, para preservar su descendencia sobre la faz de la tierra.
fuente

Pero por el bien de este desafío, ignoraremos la parte limpia / sucia y la parte donde tomó siete de cada animal. Este desafío es solo sobre esta parte:

dos de cada tipo de animal inmundo , el macho y su compañero

Reto:

Entrada:

Se le da una lista de enteros positivos (en orden aleatorio).

Salida:

Dos valores distintos que indican si es una 'Lista de Noé' o no. Esto no necesariamente tiene que ser un valor verdadero / falso , por lo que también podría ser 0/ 1en Java / C #, o 'A'/ 'B'en cualquier lenguaje, para dar algunos ejemplos.

¿Cuándo es una lista una 'Lista de Noé'? Cuando hay exactamente dos de cada número entero en la lista.

Reglas de desafío:

  • I / O es flexible. La entrada puede ser una lista / matriz / secuencia de enteros / flotantes / cadenas, o leer uno por uno desde STDIN. La salida puede ser dos valores distintos , devueltos desde una función o salida a STDOUT / a file.
  • Los enteros en la lista de entrada están en orden aleatorio y se garantiza que son positivos dentro del rango 1n100000 .
  • Se garantiza que la lista de entrada no estará vacía.
  • Tener un entero un múltiplo de dos veces presente por encima de 2 (es decir, 4, 6, 8, etc.) será falso. Es decir, [6,4,4,6,4,7,4,7]es Falsey-, aunque aún se podía crear pares iguales como este: [[4,4],[4,4],[6,6],[7,7]].

Reglas generales:

  • Este es el , por lo que la respuesta más corta en bytes gana.
    No permita que los lenguajes de code-golf lo desanimen a publicar respuestas con lenguajes que no sean codegolf. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación.
  • Las reglas estándar se aplican a su respuesta con las reglas de E / S predeterminadas , por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados y programas completos de tipo retorno. Tu llamada.
  • Las lagunas predeterminadas están prohibidas.
  • Si es posible, agregue un enlace con una prueba para su código (es decir, TIO ).
  • Además, se recomienda agregar una explicación para su respuesta.

Casos de prueba:

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
fuente
12
Y en Corán también; Sura Al-Mumenoon, versículo 27: Entonces lo inspiramos (con este mensaje): "Construye el arca a la vista y bajo nuestra guía: luego, cuando venga nuestro mando y broten las fuentes de la tierra, toma a bordo pares de todas las especies, machos y hembras, y tu familia, excepto aquellos contra los cuales la Palabra ya ha salido: y no te dirijas a mí en favor de los malhechores, porque se ahogarán (en el diluvio). (Yusuf Ali)
Ishaq Khan

Respuestas:

19

Python 3 , 31 bytes

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

Pruébalo en línea!


Python 2 , 33 bytes

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

Pruébalo en línea!

TFeld
fuente
Genial, no sabía que el operador splat funcionaba dentro de los literales establecidos, si estoy interpretando esto correctamente.
ApproachingDarknessFish
13

05AB1E , 4 bytes

¢<PΘ

Pruébalo en línea! o como un conjunto de pruebas

Explicación

¢      # count all occurrences of each element in the input list
 <     # decrement each
  P    # product
   Θ   # is equal to 1
Emigna
fuente
Ah, me había preparado ¢2QP, pero usar Θtambién es una buena alternativa. :)
Kevin Cruijssen
Pensé que tenía un 3 con {ιË, pero por supuesto eso falla cuando los enteros ocurren 4 veces.
Grimmy
9

Brachylog , 4 bytes

ọtᵛ2

Pruébalo en línea!

Explicación

ọ           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
fuente
8

R , 20 bytes

-6 bytes gracias a digEmAll cambiando el método de entrada

any(table(scan())-2)

Pruébalo en línea!

Salidas FALSEsi es una lista de Noé, y de lo TRUEcontrario. Funciona para cualquier tipo de entrada, no solo enteros.

Calcula el recuento de cada valor en la lista y comprueba si alguno de los recuentos es diferente de 2.

Robin Ryder
fuente
Puede tomar la entrada de stdin guardando 6 bytes: ¡ Pruébelo en línea!
digEmAll
@digEmAll Gracias; Leí mal las reglas del desafío y pensé que esto no estaba permitido.
Robin Ryder
6

Haskell , 33 bytes

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

Pruébalo en línea!

Para cada elemento de la entrada, nos aseguramos de que aparezca dos veces en la lista de entrada.

sum[1|b<-x,b==a]es solo una versión más golfista de length(filter(==a)x).

Asistente de trigo
fuente
6

Perl 6 , 18 bytes

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

Pruébalo en línea!

  • .Bagconvierte la lista de entrada en un Bag--un conjunto con multiplicidad.
  • {*} extrae todas las multiplicidades.
  • .all crea una unión y de las multiplicidades.
  • == 2 da como resultado otra unión de booleanos, cada uno verdadero si la multiplicidad es 2.
  • so contrae la unión a un único booleano.
Sean
fuente
5

J , 10 bytes

[:*/2=#/.~

Pruébalo en línea!

Galen Ivanov
fuente
3
También 10 bytes: [:*/2=1#.=realmente quiero eliminar ese límite, pero no puedo entender cómo.
cole
1
@cole cuando probé esto, obtuve tu solución. Si realmente quería quitar la tapa se podría hacer 2*/@:=1#.=, también 10 bytes
Conor O'Brien
@cole ¡Buena alternativa!
Galen Ivanov
@ ConorO'Brien Sí, también @:es útil aquí.
Galen Ivanov
1
@GalenIvanov tiene que amar monádico =, tan extrañamente útil en escenarios de golf de nicho
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

La versión legible:

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

Pruébalo en SQL Fiddle !

-2 bytes gracias a Kevin Cruijssen

Andrei Odegov
fuente
1
Como no usas el alias, ¿no se cpuede eliminar después de COUNT(*)?
Kevin Cruijssen
@KevinCruijssen, tienes razón, gracias.
Andrei Odegov
4

Haskell , 61 45 bytes

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

Pruébalo en línea!

Gracias a @KevinCruijssen por 12 bytes, y @nimi por otros 4.

Primera respuesta de Haskell, pero fue sorprendentemente fácil de hacer. Puede probablemente ser golfed mucho. Caso en punto...

J. Sallé
fuente
3
No conozco a Haskell, pero estoy seguro de que all(True==).map(2==)puede serlo all(2==). :)
Kevin Cruijssen
44
... y se mueven lengtha all: all((2==).length).group.sort. No es necesario darle un nombre a la función, es decir, soltar el f=.
nimi
De hecho, pasé por alto el all(2==)cuando estaba probando en GHCi. Gracias Kevin y Nimi, actualizaré la respuesta.
J. Sallé
44
... ah y para uso futuro: all(True==)es and.
nimi
4

JavaScript (ES6), 37 bytes

Devuelve falso para Noah o verdadero para no-Noah.

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

Pruébalo en línea!

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
fuente
3

APL (Dyalog Unicode) , SBCS de 8 bytes

Función de prefijo tácito anónimo. Devoluciones 0/ 1.

∧/2=⊢∘≢⌸

Pruébalo en línea!

...  para cada valor como argumento izquierdo e índices de ocurrencias de ese valor como argumento derecho, llame a:

 cuenta el argumento correcto (las ocurrencias) y
 luego
 devuelve eso, ignorando el argumento izquierdo

2= Lista booleana que indica qué recuentos son 2

∧/ Reducción Y (es decir, ¿son todas ciertas?)

Adán
fuente
3

PowerShell , 66 37 26 bytes

-11 bytes gracias a mazzy

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

Pruébalo en línea!

Agrupa $ly toma todos los recuentos de valores coincidentes. Luego filtra todos los recuentos de 2 de esta lista. Si la lista está vacía, es un número de Noé; de lo contrario, se completará con recuentos que no sean 2. Si no está en la lista, aparecerá Truesi está vacío y Falsesi está lleno

Veskah
fuente
1
Falla si los valores se equilibran entre sí ... es decir, [1,2,1,1] por lo que el recuento es 4, el recuento de únicos es 2 y, por lo tanto, se resolverá como noah a pesar de no ser noah.
Datos
@ExpiredData Heck
Veskah
Probé este enfoque en otro idioma antes de darme cuenta de que simplemente no funcionará ...
Datos
1
¯ \ _ (ツ) _ / ¯ 26
mazzy
1
@mazzy Gracias. Olvidé todo acerca de groupser una cosa que existe
Veskah
3

PHP , 60 bytes

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

Pruébalo en línea!

PHP tiene excelentes características para esto, aunque con 20 caracteres, array_count_values()no es muy golfoso.

640 KB
fuente
PHP siempre tiene excelentes funciones integradas, con nombres largos, ¡suspiro!
Noche2
3

Mathematica, 25 24 bytes

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

Pruébalo en línea!

La Tallyfunción devuelve una lista del formulario , que luego se compara con un patrón que verifica si todos los recuentos son 2.{{element, count}, ...}

Pomo de la puerta
fuente
3

Adjunto , 16 bytes

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

Pruébalo en línea!

Explicación

${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
fuente
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

Soy un gran fanático de TI-Basic. No es un gran lenguaje para ningún propósito, pero disfruto programando (y jugando golf).

¿Cómo funciona este código?

Primero, ordena la lista.

En segundo lugar, utiliza la función △ Lista para generar otra lista, que es la diferencia entre los elementos de la lista ordenada. (Por ejemplo, △ Lista ({1,3,7,8}) produciría {2,4,1}). No se aplica a esta lista, que convierte cada elemento distinto de cero de la lista a cero y cada cero a uno.

Luego, el programa verifica que la lista resultante se ajuste al patrón {1, 0, 1, 0, ...} , lo que solo será cierto si la lista original es una lista de Noah.

También hay una comprobación adicional de que la longitud de la lista es uniforme, para detectar algunos casos extremos.

Aquí hay algunas capturas de pantalla de casos de prueba:

Algunos casos de prueba Algunos casos de prueba más

mprogrammer
fuente
3

Julia 1.0 , 32 bytes

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

Pruébalo en línea!

Divide cada elemento de la matriz de entrada lpor la transposición l'dando una matriz. Sumar sobre esta matriz mientras se aplica isonea cada elemento da el doble de longitud lsi cada elemento aparece exactamente dos veces.

TimD
fuente
3

K (oK) , 9 bytes

Solución:

&/2=#:'.=

Pruébalo en línea!

Explicación:

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

Julia , 30 caracteres 26 bytes

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

¡Gracias, H.PWiz por este truco!

Pruébalo en línea!

usuario3263164
fuente
1
Puede tener !a=all(x->2==sum(a.==x),a)para 26 bytes. NÓTESE BIEN. que recomiendo contar en bytes en este sitio
H.PWiz
¡Muchas gracias! No sabía que podría (ab) usar !para funciones anónimas
user3263164
2

Jalea , 5 bytes

ĠẈ=2Ạ

Pruébalo en línea!

Un enlace monádico que toma una lista de enteros y devuelve 1 si es una lista de Noah y 0 si no.

Nick Kennedy
fuente
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

Explicación

VDM funciona predominantemente como declaraciones lógicas de segundo orden.

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 no puede TIO VDM, aquí está la salida de una sesión de depuración

Datos caducados
fuente
Sé que probablemente no haya ningún compilador en línea para él, pero ¿podría agregar algunas capturas de pantalla de (algunos de) los casos de prueba como verificación? :)
Kevin Cruijssen
@KevinCruijssen guardó algunos bytes arreglando el error, lo que probablemente hizo que el código en sí fuera más fácil de entender. Agregaré una explicación también :)
Datos
2

Excel, 45 bytes

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

Asume datos en la columna A, con esto ingresado en cualquier celda que no sea una en la columna A. Devuelve VERDADERO si hay pares y FALSO si no son pares coincidentes

        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

Intenté eliminar el / 2 y agregar .5 para la suma, pero esto no funcionó.
Intenté contar las frecuencias que son <> 2 y esto no devolvió la cantidad correcta.

Keeta
fuente
2

Octava / MATLAB, 22 21 bytes

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

Función anónima que ingresa un vector numérico y emite 0si el vector cumple la condición o 1no.

Pruébalo en línea! O verificar todos los casos de prueba .

Explicación

@(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
fuente