Elenchi interi di Noè


25

Introduzione:

Penso che ne abbiamo sentito parlare tutti, ma qui un breve riassunto: Noè raccolse due di ogni specie di animale sul pianeta, maschio e femmina, per salvare nella sua Arca durante una grande alluvione. La citazione reale dalla Bibbia è:

Genesi 7: 2-3
Devi portare con te sette di ogni tipo di animale pulito, il maschio e il suo compagno, due di ogni tipo di animale impuro, il maschio e il suo compagno, e anche sette di ogni tipo di uccello nel cielo , maschio e femmina, per preservare la loro prole sulla faccia della terra.
fonte

Ma per il bene di questa sfida ignoreremo la parte pulita / impura e la parte in cui ha preso sette di ogni animale. Questa sfida riguarda solo questa parte:

due di ogni tipo di animale impuro , il maschio e il suo compagno

Sfida:

Ingresso:

Viene fornito un elenco di numeri interi positivi (in ordine casuale).

Produzione:

Due valori distinti che indicano se si tratta di un 'Elenco di Noè' o no. Questo non deve necessariamente essere un valore di verità / falsità , quindi potrebbe anche essere 0/ 1in Java / C #, o 'A'/ 'B'in qualsiasi lingua, per fare alcuni esempi.

Quando un elenco è un 'Elenco di Noè'? Quando ci sono esattamente due di ogni numero intero nell'elenco.

Regole della sfida:

  • L'I / O è flessibile. L'input può essere un elenco / array / flusso di numeri interi / float / stringhe o leggere uno a uno da STDIN. L'output può essere qualsiasi due valori distinti , restituito da una funzione o output in STDOUT / un file.
  • Gli interi nell'elenco di input sono in ordine casuale e sono garantiti positivi nell'intervallo 1n100000 .
  • L'elenco di input è garantito non vuoto.
  • Avere un numero intero un multiplo di due volte presente sopra 2 (cioè 4, 6, 8, ecc.) Sarà falso. Vale a dire [6,4,4,6,4,7,4,7]è Falsey, anche se si potrebbe ancora creare coppie uguali come questo: [[4,4],[4,4],[6,6],[7,7]].

Regole generali:

  • Questo è , quindi vince la risposta più breve in byte.
    Non lasciare che le lingue di code-golf ti scoraggino dal pubblicare risposte con lingue non codegolfing. Prova a trovare una risposta il più breve possibile per "qualsiasi" linguaggio di programmazione.
  • Per la tua risposta valgono regole standard con regole I / O predefinite , quindi puoi usare STDIN / STDOUT, funzioni / metodo con i parametri corretti e tipo di ritorno, programmi completi. La tua chiamata.
  • Sono vietate le scappatoie predefinite .
  • Se possibile, aggiungi un link con un test per il tuo codice (ad es. TIO ).
  • Inoltre, si consiglia vivamente di aggiungere una spiegazione per la risposta.

Casi test:

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]

12
E anche nel Corano; Sura Al-Mumenoon, Verso 27: Così lo abbiamo ispirato (con questo messaggio): "Costruisci l'Arca alla nostra vista e sotto la nostra guida: quando verrà il nostro Comando e le fonti della terra sgorgheranno, prendi a bordo coppie di ogni specie, maschio e femmina, e della tua famiglia, tranne quelli contro i quali la Parola è già uscita: e non rivolgermi a favore di coloro che hanno commesso il male, poiché saranno annegati (nel Diluvio). (Yusuf Ali)
Ishaq Khan

Risposte:



13

05AB1E , 4 byte

¢<PΘ

Provalo online! o come una suite di test

Spiegazione

¢      # count all occurrences of each element in the input list
 <     # decrement each
  P    # product
   Θ   # is equal to 1

Ah, mi ero preparato ¢2QP, ma usare Θè anche una bella alternativa. :)
Kevin Cruijssen l'

Pensavo di avere un 3 con {ιË, ma ovviamente fallisce quando gli interi si verificano 4 volte.
Grimmy,

9

Brachylog , 4 byte

ọtᵛ2

Provalo online!

Spiegazione

ọ           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

8

R , 20 byte

-6 byte grazie a digEmAll modificando il metodo di input

any(table(scan())-2)

Provalo online!

Emette FALSEse è un elenco di Noè e in caso TRUEcontrario. Funziona con qualsiasi tipo di input, non solo con numeri interi.

Calcola il conteggio di ciascun valore nell'elenco e verifica se uno dei conteggi è diverso da 2.


Potresti ricevere input dallo stdin salvando 6 byte: provalo online!
digEmAll

@digEmAll Grazie; Ho letto male le regole della sfida e ho pensato che non fosse permesso.
Robin Ryder,



6

Haskell , 33 byte

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

Provalo online!

Per ogni elemento dell'input assicuriamo che appaia due volte nell'elenco di input.

sum[1|b<-x,b==a]è solo una versione più golfista di length(filter(==a)x).


6

Perl 6 , 18 byte

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

Provalo online!

  • .Bagconverte l'elenco di input in un Bagset --a con molteplicità.
  • {*} estrae tutte le molteplicità.
  • .all crea una giunzione e delle giunzioni.
  • == 2 risulta in un'altra e-giunzione di booleani, ciascuno vero se la molteplicità è 2.
  • so comprime la giunzione in un singolo booleano.

5

J , 10 byte

[:*/2=#/.~

Provalo online!


3
anche 10 byte: [:*/2=1#.=voglio davvero rimuovere quel limite ma non riesco a capire come.
Cole

1
@cole quando ho provato questo, ho ottenuto la tua soluzione. Se volessi davvero rimuovere il tappo che potresti fare 2*/@:=1#.=, anche 10 byte
Conor O'Brien

@cole Bella alternativa!
Galen Ivanov,

@ ConorO'Brien Sì, @:è utile anche qui.
Galen Ivanov,

1
@GalenIvanov devo amare il monadico =, quindi stranamente utile in scenari di nicchia del golf
Cole

4

MS SQL Server 2017 , 152 150 146 byte

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 versione leggibile:

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

Provalo su SQL Fiddle !

-2 byte grazie a Kevin Cruijssen


1
Dato che non usi l'alias, non puoi crimuoverlo dopo il COUNT(*)?
Kevin Cruijssen, l'

@KevinCruijssen, hai ragione, grazie.
Andrei Odegov

4

Haskell , 61 45 byte

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

Provalo online!

Grazie a @KevinCruijssen per 12 byte e @nimi per altri 4.

Prima risposta di Haskell, ma è stato sorprendentemente facile da fare. Probabilmente può essere giocato a golf molto. Caso in questione ...


3
Non conosco Haskell, ma sono abbastanza sicuro che all(True==).map(2==)possa esserlo all(2==). :)
Kevin Cruijssen

4
... e spostare lengtha all: all((2==).length).group.sort. Non è necessario assegnare un nome alla funzione, ovvero rilasciare f=.
nimi,

In effetti, ho ignorato all(2==)quando stavo testando su GHCi. Grazie Kevin e Nimi, aggiornerò la risposta.
J. Sallé,

4
... oh e per un uso futuro: all(True==)è and.
nimi,

4

JavaScript (ES6), 37 byte

Restituisce false per Noah o true per non Noah.

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

Provalo online!

Commentate

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

3

APL (Dyalog Unicode) , 8 byte SBCS

Funzione prefisso tacito anonimo. Restituisce 0/ 1.

∧/2=⊢∘≢⌸

Provalo online!

...  per ogni valore come argomento a sinistra e gli indici di occorrenze di quel valore come argomento a destra, chiama:

 calcola l'argomento giusto (le occorrenze)
 quindi
 restituiscilo, ignorando l'argomento sinistro

2= Elenco booleano che indica quali conteggi sono 2

∧/ Riduzione AND (cioè sono tutti veri?)


3

PowerShell , 66 37 26 byte

-11 byte grazie a mazzy

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

Provalo online!

Raggruppa $le prende tutti i conteggi dei valori corrispondenti. Filtra quindi tutti i conteggi di 2 da questo elenco. Se l'elenco è vuoto, è un numero Noah; in caso contrario, verrà popolato ancora con conteggi diversi da 2. La mancata visualizzazione dell'elenco produrrà Truese è vuoto e Falsese è popolato


1
Non riesce se i valori si bilanciano a vicenda .. vale a dire [1,2,1,1], quindi il conteggio è 4, il conteggio di unico è 2 e quindi si risolverà come noah nonostante non sia noah.
Dati scaduti l'

@ExpiredData Heck
Veskah

Ho provato questo approccio in un'altra lingua prima di rendermi conto che non funzionerà ...
Data scaduta

1
¯ \ _ (ツ) _ / ¯ 26
mazzy

1
@ Grazie grazie. Dimenticato tutto di groupessere una cosa che esiste
Veskah


3

PHP , 60 byte

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

Provalo online!

PHP ha degli ottimi built-in per questo, anche se a 20 caratteri, array_count_values()non è molto golfoso.


PHP ha sempre ottimi incorporati, con nomi lunghi, sospiro!
Night2

3

Mathematica, 25 24 byte

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

Provalo online!

La Tallyfunzione restituisce un elenco del modulo , che viene quindi confrontato con un modello che controlla se tutti i conteggi sono 2.{{element, count}, ...}


3

Attache , 16 byte

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

Provalo online!

Spiegazione

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

alternative

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

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

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

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

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

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

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


3

TI-Basic, 47 byte

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

Sono un grande fan di TI-Basic. Non è un linguaggio eccezionale per qualsiasi scopo, ma mi piace programmare (e giocare a golf).

Come funziona questo codice?

Innanzitutto, ordina l'elenco.

In secondo luogo, utilizza la funzione △ Elenco per generare un altro elenco, che è la differenza tra gli elementi dell'elenco ordinato. (Ad esempio, △ Elenco ({1,3,7,8}) produrrebbe {2,4,1}). Non si applica a questo elenco, che converte ogni elemento diverso da zero dell'elenco in zero e ogni zero in uno.

Quindi, il programma verifica che l'elenco risultante si adatti al modello {1, 0, 1, 0, ...}, il che sarà vero solo se l'elenco originale è un elenco Noah.

C'è anche un controllo aggiuntivo che la lunghezza dell'elenco è pari, per individuare alcuni casi limite.

Ecco alcuni screenshot dei casi di test:

Alcuni casi di test Alcuni altri casi di test


3

Julia 1.0 , 32 byte

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

Provalo online!

Divide ogni elemento dell'array di input lper la trasposizione l'dando una matrice. Sommando questa matrice mentre si applica isonea ciascun elemento, si ottiene una lunghezza doppia rispetto a lse ogni elemento appare esattamente due volte.


3

K (oK) , 9 byte

Soluzione:

&/2=#:'.=

Provalo online!

Spiegazione:

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

3

Julia , 30 caratteri 26 byte

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

Grazie, H.PWiz per questo trucco!

Provalo online!


1
È possibile avere !a=all(x->2==sum(a.==x),a)per 26 byte. NB. che consiglio di contare in byte su questo sito
H.Pwiz

Grazie mille! Non sapevo che potessi (ab) utilizzare !per funzioni anonime
user3263164


2

VDM-SL , 64 byte

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

Spiegazione

VDM funziona principalmente come le istruzioni logiche del secondo ordine.

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

Dal momento che non puoi TIO VDM ecco l'output di una sessione di debug


So che probabilmente non esiste un compilatore online per questo, ma potresti forse aggiungere alcuni screenshot di (alcuni) dei casi di test come verifica? :)
Kevin Cruijssen l'

@KevinCruijssen ha salvato alcuni byte risolvendo il bug, il che probabilmente ha reso il codice stesso più facile da capire. Aggiungerò anche una spiegazione :)
Dati scaduti l'




2

Excel, 45 byte

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

Presuppone i dati nella colonna A, con questo immesso in qualsiasi cella diversa da una nella colonna A. Restituisce VERO se sono presenti coppie e FALSO se non corrispondono a coppie

        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

Ho provato a rimuovere il / 2 e aggiungendo .5 per il riepilogo, ma questo non ha funzionato.
Ho provato a contare le frequenze <> 2 e questo non ha restituito la giusta quantità.


2

Octave / MATLAB, 22 21 byte

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

Funzione anonima che immette un vettore numerico e genera 0se il vettore soddisfa la condizione o 1meno.

Provalo online! Oppure verifica tutti i casi di test .

Spiegazione

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.