รายชื่อจำนวนเต็มของ Noah


25

บทนำ:

ฉันคิดว่าเราทุกคนเคยได้ยิน แต่ที่นี่สรุปโดยย่อ: โนอาห์รวบรวมสัตว์สองชนิดทุกชนิดในโลกทั้งชายและหญิงเพื่อช่วยในเรือของเขาในช่วงน้ำท่วมใหญ่ คำพูดที่แท้จริงจากพระคัมภีร์คือ:

ปฐมกาล 7: 2-3
คุณต้องนำสัตว์ที่สะอาดเจ็ดชนิดทั้งตัวผู้และตัวเมียกับสัตว์ที่ไม่สะอาดสองชนิดสัตว์ที่เป็นมลทินทั้งตัวผู้และตัวคู่กับนกทุกชนิดในท้องฟ้าเจ็ดใบ ทั้งชายและหญิงเพื่อรักษาลูกหลานไว้บนพื้นพิภพ
แหล่ง

แต่เพื่อความท้าทายนี้เราจะไม่สนใจส่วนที่สะอาด / ไม่สะอาดและส่วนที่เขารับสัตว์แต่ละตัวเจ็ดตัว ความท้าทายนี้เกี่ยวกับส่วนนี้เท่านั้น:

สัตว์โสโครกทุกชนิดสองตัวคือตัวผู้และตัวเมีย

ท้าทาย:

การป้อนข้อมูล:

คุณจะได้รับรายการจำนวนเต็มบวก (ตามลำดับแบบสุ่ม)

เอาท์พุท:

สองค่าที่แตกต่างระบุว่าเป็น 'รายการของโนอาห์' หรือไม่ สิ่งนี้ไม่จำเป็นต้องเป็นค่าความจริง / ความเท็จดังนั้นจึงอาจเป็น0/ 1ใน Java / C # หรือ'A'/ 'B'ในภาษาใดก็ได้เพื่อให้ตัวอย่าง

เมื่อใดที่รายการ 'รายชื่อของโนอาห์'? เมื่อมีจำนวนเต็มสองตัวทุกตัวในรายการ

กฏท้าทาย:

  • I / O ยืดหยุ่นได้ อินพุตสามารถเป็นรายการ / อาร์เรย์ / สตรีมของจำนวนเต็ม / ลอย / สตริงหรืออ่านทีละตัวจาก STDIN เอาต์พุตสามารถเป็นสองค่าที่ต่างกันซึ่งส่งคืนจากฟังก์ชันหรือเอาต์พุตไปยังไฟล์ STDOUT / a
  • จำนวนเต็มในการป้อนข้อมูลรายชื่ออยู่ในลำดับแบบสุ่มและมีการรับประกันเป็นบวกในช่วง1n100000 100000
  • รายการอินพุตรับประกันว่าไม่ว่างเปล่า
  • การมีจำนวนเต็มคูณสองครั้งที่มีอยู่ด้านบน 2 (เช่น 4, 6, 8, ฯลฯ ) จะเป็นเท็จ คือ[6,4,4,6,4,7,4,7]เป็น falsey [[4,4],[4,4],[6,6],[7,7]]ถึงแม้ว่าคุณจะยังคงสามารถสร้างคู่เท่ากันเช่นนี้

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ
    อย่าปล่อยให้ภาษาโค้ดกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานใช้สำหรับคำตอบของคุณด้วยกฎ I / O เริ่มต้นดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชั่น / วิธีการที่มีพารามิเตอร์ที่เหมาะสมและประเภทผลตอบแทนโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงค์พร้อมทดสอบรหัสของคุณ (เช่นTIO )
  • นอกจากนี้ขอแนะนำให้เพิ่มคำอธิบายสำหรับคำตอบของคุณ

กรณีทดสอบ:

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
และในอัลกุรอานด้วย Surah Al-Mumenoon, ข้อ 27: ดังนั้นเราจึงเป็นแรงบันดาลใจให้เขา (พร้อมข้อความนี้): "สร้างหีบภายในสายตาของเราและภายใต้การแนะนำของเรา: จากนั้นเมื่อเราออกคำสั่งและน้ำพุบนโลกก็ไหลออกมา ทุกเผ่าพันธุ์ตัวผู้และตัวเมียและครอบครัวของเจ้า - ยกเว้นพวกที่ต่อต้านพระวจนะแล้ว: และกล่าวว่าฉันไม่อยู่ในความโปรดปรานของบรรดาผู้อธรรมเพราะพวกเขาจะจมน้ำตาย (น้ำท่วม) (ยูซุฟ) อาลี)
Ishaq Khan

คำตอบ:



13

05AB1E , 4 ไบต์

¢<PΘ

ลองออนไลน์! หรือเป็นชุดทดสอบ

คำอธิบาย

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

อาฉันได้เตรียมไว้¢2QPแล้ว แต่การใช้Θก็เป็นทางเลือกที่ดีเช่นกัน :)
Kevin Cruijssen

คิดว่าฉันมี 3 ด้วย{ιËแต่แน่นอนว่าล้มเหลวเมื่อจำนวนเต็มเกิดขึ้น 4 ครั้ง
Grimmy


8

R , 20 ไบต์

-6 ไบต์ขอบคุณ digEmAll โดยการเปลี่ยนวิธีการป้อนข้อมูล

any(table(scan())-2)

ลองออนไลน์!

เอาท์พุท FALSEถ้ามันเป็นรายการของโนอาห์และTRUEอื่น ๆ ใช้งานได้กับอินพุตทุกประเภทไม่เพียง แต่จำนวนเต็มเท่านั้น

คำนวณการนับของแต่ละค่าในรายการและตรวจสอบว่าการนับใด ๆ นั้นแตกต่างจาก 2 หรือไม่


คุณสามารถรับอินพุตจาก stdin ประหยัดได้ 6 ไบต์: ลองออนไลน์!
digEmAll

@digEmAll ขอบคุณ; ฉันอ่านผิดกฎการท้าทายและคิดว่าไม่อนุญาต
Robin Ryder



6

Haskell , 33 ไบต์

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

ลองออนไลน์!

สำหรับแต่ละองค์ประกอบของอินพุตเราตรวจสอบให้แน่ใจว่าปรากฏขึ้นสองครั้งในรายการอินพุต

sum[1|b<-x,b==a]เป็นเพียงรุ่น golfier length(filter(==a)x)ของ


6

Perl 6 , 18 ไบต์

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

ลองออนไลน์!

  • .Bagแปลงรายการอินพุตเป็นBagชุด --a ด้วยหลายหลาก
  • {*} แยกหลายหลากทั้งหมด
  • .all สร้างและแยกของหลายหลาก
  • == 2 ส่งผลให้อีกและแยกของบูลีนแต่ละจริงถ้าหลายหลากเป็น 2
  • so ยุบจุดเชื่อมต่อไปยังบูลีนเดียว

5

J , 10 ไบต์

[:*/2=#/.~

ลองออนไลน์!


3
ยัง 10 ไบต์: [:*/2=1#.=ฉันต้องการลบหมวกที่ แต่ไม่สามารถหาวิธี
โคล

1
@ โคลเมื่อฉันลองสิ่งนี้ฉันได้วิธีแก้ปัญหาของคุณ หากคุณต้องการที่จะถอดฝาครอบออกคุณสามารถทำได้เช่น2*/@:=1#.=กัน 10 ไบต์
Conor O'Brien

@cole ทางเลือกที่ดี!
Galen Ivanov

@ ConorO'Brien ใช่@:มีประโยชน์ด้วยที่นี่เช่นกัน
Galen Ivanov

1
@ GalenIvanov ต้องรัก monadic =ดังนั้นมีประโยชน์แปลกในสถานการณ์กอล์ฟโพรง
โคล

4

MS SQL Server 2017 , 152 150 146 ไบต์

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

รุ่นที่อ่านได้:

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 !

-2 ไบต์ขอบคุณ Kevin Cruijssen


1
เนื่องจากคุณไม่ได้ใช้นามแฝงจึงไม่cสามารถลบออกหลังจากCOUNT(*)?
Kevin Cruijssen

@KevinCruijssen คุณพูดถูกขอบคุณ
Andrei Odegov

4

Haskell , 61 45 ไบต์

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

ลองออนไลน์!

ขอบคุณ @KevinCruijssen 12 ไบต์และ @nimi อีก 4 คน

คำตอบแรกของ Haskell แต่เป็นเรื่องง่ายที่จะทำ สามารถอาจจะแข็งแรงเล่นกอล์ฟมาก กรณีในจุด ...


3
ผมไม่ทราบว่า Haskell แต่ผมค่อนข้างมั่นใจว่าจะสามารถall(True==).map(2==) all(2==):)
Kevin Cruijssen

4
... และย้ายlengthไปที่all: all((2==).length).group.sort. f=ไม่จำเป็นต้องให้ฟังก์ชั่นชื่อคือวาง
nimi

แน่นอนฉันมองข้ามไปall(2==)เมื่อตอนที่ฉันกำลังทดสอบใน GHCi ขอบคุณเควินและนิมิฉันจะอัพเดทคำตอบ
J. Sallé

4
... โอ้และสำหรับการใช้งานในอนาคตคือall(True==) and
nimi

4

JavaScript (ES6), 37 ไบต์

ส่งคืนค่าเท็จสำหรับโนอาห์หรือจริงสำหรับผู้ที่ไม่ใช่โนอาห์

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

ลองออนไลน์!

แสดงความคิดเห็น

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 ไบต์SBCS

ฟังก์ชันนำหน้าเงียบโดยไม่ระบุชื่อ ผลตอบแทน/01

∧/2=⊢∘≢⌸

ลองออนไลน์!

 สำหรับแต่ละค่าเป็นอาร์กิวเมนต์ด้านซ้ายและดัชนีที่เกิดขึ้นของค่านั้นเป็นอาร์กิวเมนต์ที่ถูกต้องให้โทร:

 นับอาร์กิวเมนต์ที่เหมาะสม (เหตุการณ์ที่เกิดขึ้น)
 จากนั้น
 ส่งคืนโดยละเว้นอาร์กิวเมนต์ซ้าย

2= รายการบูลีนที่ระบุว่ามีความสูง 2

∧/ และการลด (เช่นพวกเขาทั้งหมดเป็นความจริง?)


3

PowerShell , 66 37 26 ไบต์

-11 ไบต์ขอบคุณที่มาซี่

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

ลองออนไลน์!

จัดกลุ่ม$lและคว้าจำนวนการจับคู่ทั้งหมด จากนั้นจะกรองจำนวนทั้งหมด 2 จากรายการนี้ หากรายการว่างเปล่ามันเป็นหมายเลขของโนอาห์ มิฉะนั้นจะถูกเติมด้วยการนับที่ไม่ใช่ 2 การไม่ไอเท็มจะทำให้เกิดรายการTrueหากยังว่างอยู่และFalseหากมีรายการอยู่


1
ล้มเหลวหากค่าสมดุลกันออกมา .. เช่น [1,2,1,1] ดังนั้นการนับเป็น 4 การนับที่ไม่ซ้ำกันคือ 2 และดังนั้นจึงจะแก้ไขเป็นโนอาห์แม้จะไม่ใช่โนอาห์
ข้อมูลที่หมดอายุ

@ExpiredData Heck
Veskah

ฉันลองวิธีนี้เป็นภาษาอื่นก่อนที่จะรู้ตัวว่ามันจะไม่ทำงาน ...
ข้อมูลหมดอายุ

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

1
@ mazzy ขอบคุณ ลืมทุกอย่างเกี่ยวกับgroupการเป็นสิ่งที่มีอยู่
เวสซาห์

3

PHP , 60 ไบต์

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

ลองออนไลน์!

PHP มีคุณสมบัติในตัวที่ยอดเยี่ยมสำหรับเรื่องนี้แม้ว่าจะอยู่ที่ 20 ตัวอักษร แต่array_count_values()ก็ไม่ได้เป็นเรื่องที่ยากนัก


PHP มีบิวด์อินที่ยอดเยี่ยมเสมอพร้อมถอนชื่อยาว
กลางคืน 2


3

ทูตขนาด 16 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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

ทางเลือก

17 ไบต์: {All&_!`=&2@`~&_}

18 ไบต์: {All[`=&2@`~&_,_]}

23 ไบต์: Same@2&`'@Sum@Table[`=]

25 ไบต์: Same«2'Sum@Table[`=,_]»

25 ไบต์: Same<~2'Sum@Table[`=,_]~>

25 ไบต์: {Same[2'Sum@Table[`=,_]]}

35 ไบต์: {Commonest@_==Unique@_and _[0]~_=2}


3

TI-Basic, 47 ไบต์

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

ฉันเป็นแฟนตัวยงของ TI-Basic มันไม่ใช่ภาษาที่ยอดเยี่ยมสำหรับวัตถุประสงค์ใด ๆ แต่ฉันสนุกกับการเขียนโปรแกรม (และการเล่นกอล์ฟ) ในนั้น

รหัสนี้ทำงานอย่างไร

ครั้งแรกมันเรียงลำดับรายการ

สองใช้ฟังก์ชัน△ List เพื่อสร้างรายการอื่นซึ่งเป็นความแตกต่างระหว่างองค์ประกอบของรายการที่เรียงลำดับ (ตัวอย่างเช่น△รายการ ({1,3,7,8}) จะให้ผลตอบแทน {2,4,1}) ใช้ไม่ได้กับรายการนี้ซึ่งแปลงองค์ประกอบที่ไม่ใช่ศูนย์ของรายการให้เป็นศูนย์และทุกศูนย์ให้เป็นหนึ่ง

จากนั้นโปรแกรมจะตรวจสอบว่ารายการผลลัพธ์สอดคล้องกับรูปแบบหรือไม่ {1, 0, 1, 0, ...}ซึ่งจะเป็นจริงถ้ารายการเดิมคือรายการโนอาห์

นอกจากนี้ยังมีการตรวจสอบเพิ่มเติมว่าความยาวของรายการจะเท่ากันเพื่อจับกรณีขอบบางอย่าง

ต่อไปนี้เป็นภาพหน้าจอของกรณีทดสอบ:

บางกรณีทดสอบ บางกรณีทดสอบเพิ่มเติม


3

Julia 1.0 , 32 ไบต์

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

ลองออนไลน์!

หารแต่ละองค์ประกอบของอาร์เรย์ข้อมูลเข้าlด้วยการแปลงl'ให้เมทริกซ์ การรวมเมทริกซ์นี้ขณะที่ใช้isoneกับแต่ละองค์ประกอบจะให้ความยาวเป็นสองเท่าlหากแต่ละองค์ประกอบปรากฏขึ้นสองเท่า



3

จูเลีย , 30 ตัวอักษร 26 ไบต์

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

ขอบคุณ H.PWiz สำหรับเคล็ดลับนี้!

ลองออนไลน์!


1
คุณสามารถมี!a=all(x->2==sum(a.==x),a)26 ไบต์ NB ฉันขอแนะนำให้นับเป็นไบต์บนเว็บไซต์นี้
H.PWiz

ขอบคุณมาก! ฉันไม่รู้ว่าคุณสามารถใช้!ฟังก์ชั่นนิรนามได้
user3263164


2

VDM-SL , 64 ไบต์

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

คำอธิบาย

VDM ทำงานเป็นส่วนใหญ่เช่นคำสั่งตรรกะลำดับที่สอง

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 ที่นี่มีเอาต์พุตจากเซสชันดีบัก


ฉันรู้ว่าอาจไม่มีคอมไพเลอร์ออนไลน์สำหรับมัน แต่คุณสามารถเพิ่มภาพหน้าจอของ (บางส่วน) กรณีทดสอบเป็นการตรวจสอบได้หรือไม่? :)
Kevin Cruijssen

@KevinCruijssen บันทึกบางส่วนเพื่อแก้ไขข้อผิดพลาดซึ่งอาจทำให้โค้ดนั้นง่ายต่อการเข้าใจ ฉันจะเพิ่มคำอธิบายด้วย :)
ข้อมูลที่หมดอายุ


2

MATL , 6 ไบต์

8#uqqa

ลองออนไลน์!

0 สำหรับความจริง 1 สำหรับความเท็จ พอร์ตคำตอบโรบินไรเดอร์

MATL , 6 ไบต์

&=s2=A

ลองออนไลน์!

1 สำหรับความจริง 0 สำหรับความเท็จ พอร์ตคำตอบที่หลุยส์ Mendo ของ




2

Excel, 45 ไบต์

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

ถือว่าข้อมูลในคอลัมน์ A โดยสิ่งนี้จะถูกป้อนในเซลล์ใด ๆ ที่ไม่ใช่หนึ่งในคอลัมน์ A ส่งคืน TRUE หากมีคู่และเป็นเท็จถ้าพวกเขาไม่ได้จับคู่

        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 และเพิ่ม. 5 เพื่อหาข้อสรุป แต่ไม่ได้ผล
พยายามนับความถี่ที่ <> 2 และนี่ไม่ได้คืนจำนวนที่ถูกต้อง


2

อ็อกเทฟ / MATLAB, 22 21 ไบต์

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

ฟังก์ชั่นไม่ระบุชื่อที่ป้อนเวกเตอร์ตัวเลขและเอาท์พุท0ถ้าเวกเตอร์เป็นไปตามเงื่อนไขหรือ1อย่างอื่น

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.