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]

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:



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

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

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.


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


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.

5

J , 10 byte

[:*/2=#/.~

Cobalah online!


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


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...


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

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


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


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

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.


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}, ...}


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}


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


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.


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

3

Julia , 30 karakter 26 byte

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

Terima kasih, H.PWiz untuk trik ini!

Cobalah online!


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

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


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.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.