Nuh'un Tamsayı Listeleri


25

Giriş:

Sanırım hepimiz duyduk, ama burada çok kısa bir özet: Nuh, gezegendeki her hayvan türünden ikisini bir araya getirerek, erkek ve dişi, büyük bir sel sırasında Arkını kurtarmak için toplandı. İncil'den gerçek alıntı:

Yaratılış 7: 2-3 Yanınıza
her türlü temiz hayvandan yedisini, erkek ve eşini, her türlü kirli hayvandan ikisini, erkek ve eşini ve ayrıca gökyüzündeki her türden kuşu götürmelisiniz. , erkek ve dişi, dünyadaki yavrularını korumak için.
kaynak

Ancak bu zorluğun uğruna, temiz / kirli kısmı ve her bir hayvandan yedi tane aldığı kısmı görmezden geleceğiz. Bu zorluk sadece bu kısımla ilgilidir:

her türlü kirli hayvandan ikisi , erkek ve eşi

Meydan okuma:

Giriş:

Size pozitif tamsayıların bir listesi verilir (rastgele sırada)

Çıktı:

'Nuh Listesinin' olup olmadığını gösteren iki ayrı değer. Bunun bir gerçek / falsey değeri olması gerekmez , bu nedenle bazı örnekler vermek için 0/ 1Java / C # veya herhangi bir dilde 'A'/ olabilir 'B'.

Bir liste ne zaman 'Nuh'un Listesi'? Listede her tamsayıdan tam olarak ikisi olduğunda.

Meydan okuma kuralları:

  • G / Ç esnektir. Girdi, bir liste / dizi / tamsayı / float / dizge akışı olabilir veya STDIN'den birer birer okunabilir. Çıktı, bir işlevden veya çıkışın STDOUT / a dosyasına döndürülen herhangi iki farklı değer olabilir .
  • Giriş listesindeki tamsayılar rasgele ve aralığında pozitif olduğu garanti edilir . 1n100000
  • Giriş listesinin boş olmadığı garantilidir.
  • 2'nin üzerinde iki kez birden (1, 4, 6, 8 vb.) Bir tamsayıya sahip olmak falsey olacaktır. Yani [6,4,4,6,4,7,4,7]hala böyle eşit çiftleri oluşturmak her ne kadar, Falsey geçerli: [[4,4],[4,4],[6,6],[7,7]].

Genel kurallar:

  • Bu , bayt cinsinden en kısa cevap kazanır.
    Code-golf dillerinin, codegolfing olmayan dillerle cevap göndermekten vazgeçmesine izin vermeyin. Herhangi bir programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Standart G / Ç kurallarına cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT işlevlerini, uygun parametreleri içeren fonksiyonlar / yöntemleri ve dönüş tipini, tam programları kullanmanıza izin verilir. Senin çağrı.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuzu test eden bir bağlantı ekleyin (ör. TIO ).
  • Ayrıca, cevabınız için bir açıklama eklemek şiddetle tavsiye edilir.

Test durumları:

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
Kuran'da da; Suresi Mumen, 27. Ayet: O zaman ona ilham verdik (bu mesajla): "Görüşü İçimizdeki ve Rehberliğimizdeki Gemiyi İnşa Edin: sonra Komutanımız geldiğinde ve yeryüzündeki fıskiyeler, çiftler halinde üstünüze çıkar Her türden, erkek ve dişi ve aileniz - Sözü çoktan gitmiş olanlar aleyhine olanlar hariç: Ve Bana yanlış yapanların lehine değil, boğulacaklar (Sel'de). Ali)
İshaq Khan

Yanıtlar:



13

05AB1E , 4 bayt

¢<PΘ

Çevrimiçi deneyin! veya Test Paketi olarak

açıklama

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

Ah, hazırlanmıştım ¢2QPama kullanmak Θda güzel bir alternatif. :)
Kevin Cruijssen

Yanımda üç tane olduğunu düşündüm {ιË, ama elbette tamsayılar 4 kez meydana geldiğinde başarısız oluyor.
Grimmy

9

Brachylog , 4 bayt

ọtᵛ2

Çevrimiçi deneyin!

açıklama

ọ           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 bayt

Giriş yöntemini değiştirerek digEmAll sayesinde -6 bayt

any(table(scan())-2)

Çevrimiçi deneyin!

FALSENuh'un bir listesi ise çıktılar , TRUEaksi takdirde. Yalnızca tamsayılarla değil, herhangi bir giriş türüyle çalışır.

Listedeki her değerin sayısını hesaplar ve sayıların herhangi birinin 2'den farklı olup olmadığını kontrol eder.


Stdin kaydetme 6 bayttan girdi alabilirsiniz: Çevrimiçi deneyin!
digEmAll

@digEmAll Teşekkürler; Meydan okuma kurallarını yanlış okudum ve buna izin verilmediğini düşündüm.
Robin Ryder




6

Perl 6 , 18 bayt

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

Çevrimiçi deneyin!

  • .Baggiriş listesini Bagçokluğu olan bir a'ya dönüştürür .
  • {*} tüm çoklukları ayıklar.
  • .all ve çoklukların birleşme noktasını yaratır.
  • == 2 Çokluk 2 ise, her biri doğru olan Booleanların birleşme ve kavşağında sonuçlanır.
  • so kavşağı tek bir Boole'ye daraltır.

5

J , 10 bayt

[:*/2=#/.~

Çevrimiçi deneyin!


3
ayrıca 10 bayt: [:*/2=1#.=Gerçekten bu kapağı çıkarmak istiyorum ama nasıl yapılacağını çözemiyorum.
cole,

1
@cole bunu denediğimde, çözümünüzü aldım. Eğer gerçekten kapağı kaldırmak istiyorsa olabilir yapmak 2*/@:=1#.=, ayrıca 10 bayt
Conor O'Brien

@ cole Güzel bir alternatif!
Galen Ivanov

@ ConorO'Brien Evet, @:burada da kullanışlı olur.
Galen Ivanov

1
@GalenIvanov monadici =, niş golf senaryolarında çok garip bir şekilde faydalı olmalı
cole, 6

4

MS SQL Server 2017 , 152 150 146 bayt

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

Okunabilir versiyonu:

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

SQL Fiddle'da deneyin !

Kevin Cruijssen sayesinde -2 bayt


1
Takma adı kullanmadığınızdan csonra, kaldırılamaz COUNT(*)mı?
Kevin Cruijssen

@KevinCruijssen, haklısın, teşekkür ederim.
Andrei Odegov

4

Haskell , 61 45 bayt

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

Çevrimiçi deneyin!

12 bayt için @KevinCruijssen ve başka bir 4 için @nimi sayesinde.

İlk Haskell cevabı, ama yapmak şaşırtıcı derecede kolaydı. Can muhtemelen çok golfed edilecek. Konuşma konusu olan mesele...


3
Haskell'i tanımıyorum ama all(True==).map(2==)olabileceğinden çok eminim all(2==). :)
Kevin Cruijssen

4
... ve hareket lengthetmek all: all((2==).length).group.sort. İşleve bir isim vermenize gerek yok, yani bırak f=.
nimi

Gerçekten de, all(2==)GHCi'de ne zaman test yaptığımı göz ardı ettim. Teşekkürler Kevin ve Nimi, cevabı güncelleyeceğim.
J. Sallé

4
... oh ve ileride kullanılmak üzere: all(True==)olduğunu and.
nimi

4

JavaScript (ES6), 37 bayt

Nuh için yanlış veya Nuh olmayanlar için doğru olarak döndürür .

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

Çevrimiçi deneyin!

Yorumlananlar

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 bayt SBCS

Anonim zımni önek işlevi. Döndürür 0/ 1.

∧/2=⊢∘≢⌸

Çevrimiçi deneyin!

 Sol argüman olarak her bir değer ve o argümanın bu argüman olarak doğru argüman olarak göründüğü gibi:

 taklidi sağ argüman (olaylar)
 o zaman
 sol argümanı yok sayarak, onu döndür

2= Hangilerinin 2 olduğunu gösteren Boole listesi

∧/ AND-azaltma (yani hepsi doğru mu?)


3

PowerShell , 66 37 26 bayt

Mazzy sayesinde -11 bayt

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

Çevrimiçi deneyin!

Gruplar $lve eşleşen değerlerin tüm sayımlarını toplar. Daha sonra bu listedeki 2 sayının tümünü filtreler. Liste boşsa, bu bir Noah numarasıdır; Aksi takdirde, hala 2 olmayan sayılarla doldurulur. Listeyi not etmek, Trueboş ve Falsedoldurulması halinde verim sağlar


1
Değerler birbirlerini dengelerlerse başarısız olur, yani [1,2,1,1] böylece sayı 4, benzersiz sayısı 2'dir ve dolayısıyla noah olmasa da noah olarak çözülecektir.
Süresi Dolmuş Veriler

@ExpiredData Heck
Veskah

Ben ... sadece olmaz çalışmalarını gerçekleştirmek önce başka bir dilde bu yaklaşımı denedik
Veri Doldu

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

1
@mazzy Teşekkürler. group
Var

3

PHP , 60 bayt

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

Çevrimiçi deneyin!

PHP'nin bunun için harika özellikleri var, ancak 20 karakterde array_count_values()çok golf sahası değil.


PHP daima uzun isimlerle iç içe!
Gece2

3

Mathematica, 25 24 bayt

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

Çevrimiçi deneyin!

Tallyİşlev şeklinde bir listesini verir sonra tüm kontrol eder bir desen ile eşleştirilir, sayısı 2 bulunmaktadır.{{element, count}, ...}


3

Ataşesi , 16 bayt

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

Çevrimiçi deneyin!

açıklama

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

Alternatifler

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

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

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

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

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

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

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


3

TI-Basic, 47 Bayt

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

Ben TI-Basic hayranıyım. Gerçekten herhangi bir amaç için harika bir dil değil, ama içinde programlama yapmaktan ve golf oynamaktan zevk alıyorum.

Bu kod nasıl çalışır?

İlk önce listeyi sıralar.

İkincisi, sıralanan listenin öğeleri arasındaki fark olan başka bir liste oluşturmak için △ List işlevini kullanır. (Örneğin, △ Liste ({1,3,7,8}), {2,4,1} vericiydi). Listedeki sıfır olmayan her öğeyi sıfıra ve her sıfıra bire dönüştüren bu listeye uygulanmaz.

Ardından, program sonuç listesinin, desene uyduğunu kontrol eder {1, 0, 1, 0, ...}, bu yalnızca orijinal liste bir Noah listesiyse doğru olacaktır.

Ayrıca bazı kenar durumlarını yakalamak için listenin uzunluğunun eşit olup olmadığına dair ek bir kontrol vardır.

İşte test senaryolarının bazı ekran görüntüleri:

Bazı test durumları Biraz daha test vakası


3

Julia 1.0 , 32 bayt

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

Çevrimiçi deneyin!

Giriş dizisinin her bir elemanını bir matris vererek ltranspoze böler l'. isoneHer bir elemana uygulanırken bu matrisin toplanması, lher bir elementin tam olarak iki kez görünüp görünmediğinin iki katını verir.



3

Julia , 30 karakter 26 bayt

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

Bu numara için teşekkürler H.PWiz!

Çevrimiçi deneyin!


1
!a=all(x->2==sum(a.==x),a)26 bayt için olabilir . NB. bu sitede bayt saymayı tavsiye ediyorum
H.PWiz

Çok teşekkür ederim! (Ab) !adsız işlevler için kullanabileceğinizi bilmiyordum
user3263164


2

VDM-SL , 64 bayt

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

açıklama

VDM, ağırlıklı olarak ikinci dereceden mantık ifadeleri gibi çalışır.

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

TIO VDM yapamadığınız için burada hata ayıklama oturumundan çıktı


Muhtemelen bunun için herhangi bir çevrimiçi derleyici olmadığını biliyorum, ancak belki de test durumlarının ekran görüntüsünü doğrulama olarak ekleyebilir misiniz? :)
Kevin Cruijssen

@KevinCruijssen, hatayı düzeltmek için bazı baytlar kaydetti, bu da muhtemelen kodun kendisini daha kolay anlaşılmasını sağlamıştır. Ben de bir açıklama ekleyeceğim :)
Süresi dolmuş veriler





2

Excel, 45 bayt

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

A sütununda veri varsayar, bunun A sütununda bir hücre dışındaki herhangi bir hücreye girilmesi durumunda, çiftler varsa TRUE, çiftler eşleşmiyorsa FALSE döndürür.

        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

/ 2'yi çıkarmayı ve toplama için .5 eklemeye çalıştı, ancak bu işe yaramadı.
<> 2 olan frekansları saymaya çalıştım ve bu doğru miktarda geri dönmedi.


2

Octave / MATLAB, 22 21 bayt

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

Sayısal bir vektör girişini yapan 0ve vektör, koşulu yerine getirirse veya 1aksi takdirde çıktı verir.

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.