Daftar Integer Nuh

25

Pengantar:

Saya pikir kita semua pernah mendengarnya, tetapi di sini ringkasan yang sangat singkat: Nuh mengumpulkan dua dari setiap spesies hewan di planet ini, jantan dan betina, untuk menyelamatkan Tabutnya saat banjir besar. Kutipan sebenarnya dari Alkitab adalah:

Kejadian 7: 2-3
Anda harus membawa tujuh dari setiap jenis binatang yang bersih, laki-laki dan pasangannya, dua dari setiap jenis binatang yang tidak bersih, laki-laki dan pasangannya, dan juga tujuh dari setiap jenis burung di langit. , pria dan wanita, untuk memelihara keturunan mereka di muka bumi.
sumber

Tetapi demi tantangan ini kita akan mengabaikan bagian bersih / najis dan bagian di mana ia mengambil tujuh dari setiap hewan. Tantangan ini hanya tentang bagian ini:

dua dari setiap jenis binatang najis , jantan dan pasangannya

Tantangan:

Memasukkan:

Anda diberi daftar bilangan bulat positif (dalam urutan acak).

Keluaran:

Dua nilai berbeda yang menunjukkan apakah itu 'Daftar Nuh' atau tidak. Ini tidak perlu harus menjadi nilai true / falsey , jadi bisa juga 0/ 1di Java / C #, atau 'A'/ 'B'dalam bahasa apa pun, untuk memberikan beberapa contoh.

Kapan daftar 'Daftar Nuh'? Ketika ada tepat dua dari setiap bilangan bulat dalam daftar.

Aturan tantangan:

  • I / O fleksibel. Input dapat berupa daftar / larik / aliran bilangan bulat / mengapung / string, atau membaca satu per satu dari STDIN. Output dapat berupa dua nilai berbeda , dikembalikan dari fungsi atau output ke STDOUT / file.
  • Bilangan bulat dalam daftar input dalam urutan acak, dan dijamin positif dalam kisaran . 1n100000
  • Daftar input dijamin tidak kosong.
  • Memiliki bilangan bulat kelipatan dua kali hadir di atas 2 (yaitu 4, 6, 8, dll.) Akan menjadi falsey. Yaitu [6,4,4,6,4,7,4,7]adalah falsey, meskipun Anda masih bisa membuat pasangan yang sama seperti ini: [[4,4],[4,4],[6,6],[7,7]].

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'.
  • Aturan standar berlaku untuk jawaban Anda dengan aturan I / O standar , sehingga Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda (yaitu TIO ).
  • Juga, menambahkan penjelasan untuk jawaban Anda sangat dianjurkan.

Kasus uji:

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
sumber
12
Dan dalam Quran juga; Surah Al-Mumenoon, Ayat 27: Maka Kami menginspirasinya (dengan pesan ini): "Bangunlah Bahtera itu di bawah penglihatan Kami dan di bawah bimbingan Kami: kemudian ketika datanglah Perintah Kami, dan air mancur di bumi menyembur maju, bawalah kamu berpasangan dari setiap spesies, jantan dan betina, dan keluargamu - kecuali dari mereka yang menentang Firman telah keluar: Dan janganlah kamu berpihak kepada orang yang berbuat salah, karena mereka akan ditenggelamkan (dalam air bah). (Yusuf Ali)
Ishaq Khan

Jawaban:

19

Python 3 , 31 byte

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

Cobalah online!


Python 2 , 33 byte

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

Cobalah online!

TFeld
sumber
Keren, tidak tahu operator percikan bekerja di dalam himpunan literal, jika saya menafsirkan ini dengan benar.
ApproachingDarknessFish
13

05AB1E , 4 byte

¢<PΘ

Cobalah online! atau sebagai Test Suite

Penjelasan

¢      # count all occurrences of each element in the input list
 <     # decrement each
  P    # product
   Θ   # is equal to 1
Emigna
sumber
Ah, saya sudah siap ¢2QP, tetapi menggunakan Θjuga merupakan alternatif yang bagus. :)
Kevin Cruijssen
Pikir saya punya 3 dengan {ιË, tetapi tentu saja itu gagal ketika bilangan bulat terjadi 4 kali.
Grimmy
9

Brachylog , 4 byte

ọtᵛ2

Cobalah online!

Penjelasan

ọ           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
Fatalisasi
sumber
8

R , 20 byte

-6 byte terima kasih kepada digEmAll dengan mengubah metode input

any(table(scan())-2)

Cobalah online!

Keluaran FALSEjika daftar Nuh, dan TRUEsebaliknya. Bekerja untuk semua tipe input, tidak hanya integer.

Menghitung jumlah setiap nilai dalam daftar, dan memeriksa apakah ada hitungan yang berbeda dari 2.

Robin Ryder
sumber
Anda dapat mengambil input dari penghematan stdin 6 byte: Cobalah online!
digEmAll
@digEmAll Terima kasih; Saya salah membaca aturan tantangan dan berpikir ini tidak diizinkan.
Robin Ryder
6

Haskell , 33 byte

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

Cobalah online!

Untuk setiap elemen input, kami memastikannya muncul dua kali dalam daftar input.

sum[1|b<-x,b==a]adalah versi golf length(filter(==a)x).

Wisaya Gandum
sumber
6

Perl 6 , 18 byte

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

Cobalah online!

  • .Bagmengubah daftar input menjadi Bag--a set dengan multiplisitas.
  • {*} ekstrak semua multiplisitas.
  • .all menciptakan dan-junction dari multiplisitas.
  • == 2 menghasilkan persimpangan lain dari Boolean, masing-masing bernilai true jika multiplisitasnya 2.
  • so menghancurkan persimpangan ke Boolean tunggal.
Sean
sumber
5

J , 10 byte

[:*/2=#/.~

Cobalah online!

Galen Ivanov
sumber
3
juga 10 byte: [:*/2=1#.=Saya benar-benar ingin menghapus topi itu tetapi tidak tahu caranya.
cole
1
@cole ketika saya mencoba ini, saya mendapatkan solusi Anda. Jika Anda benar-benar ingin menghapus tutup yang bisa Anda lakukan 2*/@:=1#.=, juga 10 byte
Conor O'Brien
@cole Alternatif yang bagus!
Galen Ivanov
@ ConorO'Brien Ya, @:berguna juga di sini.
Galen Ivanov
1
@GalenIvanov harus menyukai monadik =, yang anehnya bermanfaat dalam skenario golf khusus
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

Versi yang dapat dibaca:

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

Cobalah di SQL Fiddle !

-2 byte terima kasih kepada Kevin Cruijssen

Andrei Odegov
sumber
1
Karena Anda tidak menggunakan alias, tidak cdapat dihapus setelah COUNT(*)?
Kevin Cruijssen
@KevinCruijssen, Anda benar, terima kasih.
Andrei Odegov
4

Haskell , 61 45 byte

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

Cobalah online!

Terima kasih kepada @KevinCruijssen untuk 12 byte, dan @nimi untuk 4 lainnya.

Pertama-tama Haskell menjawab, tetapi ternyata sangat mudah dilakukan. Dapat mungkin akan golfed banyak. Inti masalah...

J. Sallé
sumber
3
Saya tidak tahu Haskell, tapi saya yakin all(True==).map(2==)bisa all(2==). :)
Kevin Cruijssen
4
... dan pindah lengthke all: all((2==).length).group.sort. Tidak perlu memberi fungsi nama, yaitu drop the f=.
nimi
Memang, saya mengabaikan all(2==)ketika saya menguji di GHCi. Terima kasih Kevin dan Nimi, saya akan memperbarui jawabannya.
J. Sallé
4
... oh dan untuk penggunaan di masa depan: all(True==)adalah and.
nimi
4

JavaScript (ES6), 37 byte

Mengembalikan nilai false untuk Noah atau true untuk non-Noah.

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

Cobalah online!

Berkomentar

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

APL (Dyalog Unicode) , 8 byte SBCS

Fungsi awalan diam-diam anonim. Pengembalian 0/ 1.

∧/2=⊢∘≢⌸

Cobalah online!

...  untuk setiap nilai sebagai argumen kiri dan indeks kemunculan nilai tersebut sebagai argumen benar, panggil:

 tally argumen yang benar (kejadian)
 kemudian
 mengembalikannya, mengabaikan argumen kiri

2= Daftar Boolean yang menunjukkan penghitungan 2

∧/ DAN-reduksi (yaitu apakah semua itu benar?)

Adám
sumber
3

PowerShell , 66 37 26 byte

-11 byte berkat mazzy

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

Cobalah online!

Kelompokkan $ldan ambil semua jumlah nilai yang cocok. Kemudian filter semua jumlah 2 dari daftar ini. Jika daftar itu kosong, itu adalah nomor Nuh; jika tidak, itu akan diisi dengan jumlah non-2. Tidak mencatat daftar akan menghasilkan Truejika kosong dan Falsediisi

Veskah
sumber
1
Gagal jika nilai-nilai menyeimbangkan satu sama lain .. yaitu [1,2,1,1] sehingga hitungannya adalah 4, hitungan uniknya adalah 2 dan karenanya akan diselesaikan sebagai Nuh meskipun tidak menjadi Nuh.
Data Kedaluwarsa
@ExpiredData Heck
Veskah
Saya mencoba pendekatan ini dalam bahasa lain sebelum menyadarinya tidak akan berhasil ...
Data Kedaluwarsa
1
¯ \ _ (ツ) _ / ¯ 26
mazzy
1
@ Mazzy Terima kasih. Lupa semua tentang groupmenjadi sesuatu yang ada
Veskah
3

Elixir , 52 byte

fn v->Enum.all?v,fn x->2==Enum.count v,&x==&1end end

Cobalah online!

Lengkap Elixir noob di sini :-D.

Tuan Xcoder
sumber
3

PHP , 60 byte

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

Cobalah online!

PHP memiliki built-in yang bagus untuk ini, meskipun pada 20 karakter, array_count_values()bukan yang sangat golf.

640KB
sumber
PHP selalu memiliki built-in yang hebat, dengan nama yang panjang, desah!
Night2
3

Mathematica, 25 24 byte

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

Cobalah online!

The Tallyfungsi mengembalikan daftar dari bentuk , yang kemudian dicocokkan pola yang memeriksa apakah semua hitungan 2.{{element, count}, ...}

Gagang pintu
sumber
3

Attache , 16 byte

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

Cobalah online!

Penjelasan

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

Alternatif

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}

Conor O'Brien
sumber
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

Saya penggemar berat TI-Basic. Ini bukan bahasa yang bagus untuk tujuan apa pun, tetapi saya menikmati pemrograman (dan bermain golf) di dalamnya.

Bagaimana cara kerja kode ini?

Pertama, itu mengurutkan daftar.

Kedua, ia menggunakan fungsi Daftar to untuk menghasilkan daftar lain, yang merupakan perbedaan antara elemen daftar yang diurutkan. (Misalnya, △ Daftar ({1,3,7,8}) akan menghasilkan {2,4,1}). Berlaku untuk daftar ini, yang mengubah setiap elemen yang bukan nol dari daftar menjadi nol dan setiap nol menjadi satu.

Kemudian, program memeriksa bahwa daftar yang dihasilkan sesuai dengan pola {1, 0, 1, 0, ...}, yang hanya akan benar jika daftar asli adalah daftar Nuh.

Ada juga pemeriksaan tambahan bahwa panjang daftar genap, untuk menangkap beberapa kasus tepi.

Berikut adalah beberapa tangkapan layar dari kasus uji:

Beberapa test case Beberapa lagi kasus uji

mprogrammer
sumber
3

Julia 1.0 , 32 byte

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

Cobalah online!

Membagi setiap elemen dari array input loleh transpose yang l'memberikan matriks. Menjumlahkan lebih dari matriks ini sambil menerapkan isoneke setiap elemen memberikan dua kali panjang ljika setiap elemen muncul tepat dua kali.

TimD
sumber
3

K (oK) , 9 byte

Larutan:

&/2=#:'.=

Cobalah online!

Penjelasan:

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

Julia , 30 karakter 26 byte

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

Terima kasih, H.PWiz untuk trik ini!

Cobalah online!

pengguna3263164
sumber
1
Anda dapat memiliki !a=all(x->2==sum(a.==x),a)26 byte. NB. yang saya sarankan menghitung dalam byte di situs ini
H.PWiz
Terima kasih banyak! Saya tidak tahu Anda bisa (ab) gunakan !untuk fungsi anonim
user3263164
2

Jelly , 5 byte

ĠẈ=2Ạ

Cobalah online!

Tautan monadik yang mengambil daftar bilangan bulat dan mengembalikan 1 jika daftar Nuh dan 0 jika tidak.

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

Penjelasan

VDM bekerja terutama seperti pernyataan logika orde kedua.

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

Karena Anda tidak dapat TIO VDM inilah keluaran dari sesi debug

Data Kedaluwarsa
sumber
Saya tahu mungkin tidak ada kompiler online untuk itu, tetapi dapatkah Anda menambahkan tangkapan layar (sebagian) kasus uji sebagai verifikasi? :)
Kevin Cruijssen
@KevinCruijssen menyimpan beberapa byte untuk memperbaiki bug, yang mungkin membuat kode itu sendiri lebih mudah dimengerti. Saya akan menambahkan penjelasan juga :)
Expired Data
2

Excel, 45 byte

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

Asumsikan data dalam kolom A, dengan ini dimasukkan dalam sel apa pun selain dari satu di kolom A. Mengembalikan BENAR jika ada pasangan dan SALAH jika mereka tidak cocok pasangan

        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

Mencoba menghapus / 2 dan menambahkan 0,5 untuk penjumlahan, tetapi ini tidak berhasil.
Mencoba menghitung frekuensi yang <> 2 dan ini tidak mengembalikan jumlah yang tepat.

Keeta
sumber
2

Oktaf / MATLAB, 22 21 byte

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

Fungsi anonim yang input vektor numerik, dan output 0jika vektor memenuhi kondisi atau 1sebaliknya.

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

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