รองเท้าสำหรับม้าน้ำ


30

แน่นอนว่าม้าน้ำจำเป็นต้องมีรองเท้า อย่างไรก็ตามม้าน้ำที่มีเพียงหางเดียวต้องการเพียงรองเท้าเดียว น่าเสียดายที่รองเท้ามาเป็นคู่เท่านั้น เงินนั้นเข้มงวดสำหรับรัฐบาลซีฮอร์ดังนั้นพวกเขาจึงจำเป็นต้องซื้อคู่ให้น้อยที่สุด ม้าน้ำแต่ละตัวมีขนาดรองเท้าxโดยที่xเป็นจำนวนเต็มบวก อย่างไรก็ตามม้าน้ำสามารถสวมรองเท้าขนาดx - 1หรือx + 1หากจำเป็น

งานของคุณคือส่งออกจำนวนคู่ต่ำสุดที่รัฐบาลซีฮอร์สต้องซื้อเพื่อใส่รองเท้าให้กับม้านำ้าทั้งหมด

คุณสามารถป้อนข้อมูลตามที่คุณต้องการช่องโหว่มาตรฐาน ฯลฯ

เช่นนี้คือรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

กรณีทดสอบ

2 4 6 6 8 14 ->        4
2 1 3 1 1 ->           3
4 1 4 9 1 8 9 1 8 4 -> 6
1 2 3 5 7 8 10 12 ->   4

สิ่งนี้สามารถทำได้เล็กน้อยโดยการจัดเรียงอาร์เรย์และวนลูปผ่าน แต่ฉันต้องการเห็นสิ่งที่สร้างสรรค์ (ไม่มีผลต่อการให้คะแนนจริงฉันแค่คิดว่ามันน่าสนใจที่จะเห็นวิธีอื่น)
rigged

1
ผมไม่เห็นว่ามันสามารถทำได้นิด ...
รั่วนูน

5
@ bushdid911 ฉันคิดว่าฉันไม่สามารถอธิบายได้ว่า Jelly ทำงานอย่างไรในความคิดเห็น
Leaky Nun

1
@CodyGray คุณสามารถมีขนาด 3 คู่ซึ่งครอบคลุม 2 และ 4
Zgarb

2
ศักยภาพชื่อเรื่องการแก้ไข: Sea-horseshoes
CraigR8806

คำตอบ:


5

05AB1E , 13 ไบต์

ใช้วิธีการ OP ที่อธิบายไว้ในความคิดเห็น

{¥3‹J0¡€gÌ2÷O

ลองออนไลน์!

คำอธิบาย

{¥3‹J0¡€gÌ2÷O   Argument l
{               Sort l
 ¥              Push deltas
  3‹            Map to lower than 3 (1 for true, 0 for false)
    J0¡         Join and split on 0
       €g       Map to length
         Ì      Each + 2
          2÷    Integer division by 2
            O   Sum

8

Husk , 15 14 ไบต์

Γ0(→₀?tI↑<+3)O

ใช้อัลกอริทึมโลภ: จัดเรียงและจับคู่จากด้านซ้าย ลองออนไลน์!

ขอบคุณ Leo ที่ช่วยประหยัด 1 ไบต์

คำอธิบาย

นี่เป็นคำตอบแบบ Husk แรกที่ใช้Γฟังก์ชันสำหรับรูปแบบที่ตรงกับรายการ ในกรณีที่ใช้งานนี้ถ้าaเป็นค่าและgเป็นฟังก์ชั่นแล้วΓagสอดคล้องกับฟังก์ชั่นที่fกำหนดโดยตัวอย่าง Haskell

f [] = a
f (x:xs) = g x xs

ฉันกำหนดเคสฐานเป็นa = 0และ

g x xs = 1 + line0 (if head xs < x+3 then tail xs else xs)

โดยที่line0อ้างถึงทั้งบรรทัด ในโค้ดแกลบxและxsข้อโต้แย้งนัยฟังก์ชั่นแลมบ์ดาและเป็นline0 รายการจะถูกจัดเรียงอีกครั้งในการโทรแบบเรียกซ้ำแต่ละครั้ง แต่นั่นไม่สำคัญสำหรับการแข่งขันกอล์ฟ

Γ0(→₀?tI↑<+3)O
             O  Sort
Γ               and pattern match
 0              giving 0 for an empty list
  (         )   and applying this function to a non-empty list:
          +3     Add 3 to first argument (x),
         <       make a "test function" for being less than that,
        ↑        take values from second argument (xs) while they pass the test.
     ?           If that prefix is nonempty (next value can be paired),
      t          take tail of xs,
       I         otherwise take xs as is.
    ₀            Apply the main function (line0) to this list
   →             and add 1 for the singleton/pair we just processed.

ทุกคนที่ใช้ภาษาของตัวเองทำให้ฉันต้องการสร้างของตัวเอง ก่อนอื่นฉันต้องคิดชื่อ: P
rigged

5

Python 3 , 69 66 60 ไบต์

9 ไบต์ขอบคุณ xnor

f=lambda a:a[1:a.sort()]and-~f(a[1+(a[1]-a[0]<3):])or len(a)

ลองออนไลน์!


a.sort()ผมคิดว่าคุณสามารถทำได้
xnor

@xnor เสร็จแล้วขอบคุณ
Leun Nun

การเรียงลำดับสามารถติดเป็นlambda:f=lambda a:a[1:a.sort()]and-~f(a[1+(a[1]-a[0]<3):])or len(a)
XNOR

or[]<aบันทึก 3 ไบต์
Felipe Nardi Batista

4

เยลลี่ , 20 18 ไบต์

ṢLµIḢ<3+2⁸ṫß‘µLỊ$?

ลองออนไลน์!

ส้อมของฉันคำตอบหลาม


-4 ไบต์: IḢ<3+2⁸ṫß‘µLḊ?(พื้นผมไม่เห็นเหตุผลที่จะดำเนินการใด ๆก่อนLและจะกลับมา[]ถ้ารายการถ้าความยาว 1 หรือ 0 แล้วฉันจะลบµจากLµḊ?)
เอริก Outgolfer

แต่คุณไม่ได้เรียงลำดับได้ทุกที่ ...
รั่วนูน

ตอนนี้ฉันสับสนเล็กน้อย tbf ... ฉันคิดว่าความตั้งใจของคุณแตกต่างจากรหัสของคุณจริงหรือ คุณอาจต้องการเสริมสนามกอล์ฟของฉันถ้าฉันเข้าใจถูกต้อง
Erik the Outgolfer

บางสิ่งบางอย่างที่ไร้สาระกับการจัดเรียงของคุณ [1, 1, 1, 1, 4, 4, 4, 8, 8, 9, 9] ทำงานได้ แต่ [4,1,4,9,1,8,9,1,8,9,1,8,1] doesn ' เสื้อ
หัวเรือใหญ่

@ bushdid911 พวกเขาทั้งคู่ทำงาน คุณสามารถแสดงให้เห็น?
Leun Nun

4

Python 2 , 49 ไบต์

f=lambda a:a>[a.sort()]and-~f(a[[3+a.pop(0)]>a:])

ลองออนไลน์!

ขึ้นอยู่กับวิธีการแก้ปัญหา recursive รั่วของแม่ชี


Python 2 , 59 ไบต์

p=c=0
for x in sorted(input()):c+=x>p;p=(x>p)*(x+2)
print c

ลองออนไลน์!

วนซ้ำตามขนาดที่xเรียงลำดับ จดจำขีด จำกัด สูงสุดpสำหรับขนาดปัจจุบันเป็นคู่กับขนาดก่อนหน้านี้ หากเป็นเช่นนั้นให้x>pรีเซ็ตขีด จำกัด เป็น0เพื่อให้ไม่สามารถจับคู่เกณฑ์ถัดไปได้ ถ้าไม่เพิ่มจำนวนการส่งออกcและการตั้งค่าเกณฑ์ถัดไปpx+2

ขีด จำกัด ใหม่p=(x>p)*(x+2)เป็นนิพจน์ที่ป่อง ฉันต้องการหาวิธีย่อให้สั้นลง


2

C #, 111 108 137 102 ไบต์

สิ่งนี้จะไม่มีวันชนะ แต่ฉันต้องการแก้ไขการออกกำลังกายต่อไป:

Array.Sort(a);var c=0;for(var i=0;i<a.Length;i++){c++;i+=a.Length-i>1&&a[i+1]-a[i]<3?1:0;}Console.WriteLine(c);

ขอบคุณที่คอมเม้นท์ของ @grabthefish ทำให้ฉันสามารถตอดไบต์เพิ่มได้อีกไม่กี่:

Array.Sort(a);int c=0,i=0;for(;i<a.Length;i++){c++;i+=a.Length-i>1&&a[i+1]-a[i‌​]<3?1:0;}Console.Wri‌​teLine(c);

การปฏิบัติตามกฎ C # พิเศษของ PC&G:

class P{static void Main(){Array.Sort(a);int c=0,i=0;for(;i<a.Length;i++){c++;i+=a.Length-i>1&&a[i+1]-a[i]<3?1:0;}Console.WriteLine(c);}}

การใช้ฟังก์ชั่นแลมบ์ดา:

a=>{System.Array.Sort(a);int c=0,i=0;for(;i<a.Length;c++)i+=a.Length-i>1&&a[i+1]-a[i]<3?2:1;return c;}

ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Dennis

ขอบคุณสำหรับการรักษาความก้าวหน้าด้วยคำตอบนั่นเป็นสิ่งที่น่าสนใจพอ ๆ กับคำตอบสุดท้าย
Criggie

2

Perl, 113 ไบต์

say sub{for(1..$#_){$x{$i}++;$i++if$_[$_]-$_[$_-1]>2}$x{$i}++;$-+=$_/2+$_%2for values%x;$-}->(sort{$a<=>$b}@ARGV)

รับรายการอาร์กิวเมนต์จากบรรทัดคำสั่ง (ตาม@ARGV) พิมพ์STDOUTโดยค่าเริ่มต้น

ในซีฮอร์สวิลล์ ...

เขตเป็นลำดับของเพื่อนบ้านขนาดรองเท้า เมื่อจัดเรียงซีฮอร์สแต่ละตัวจะมีเพื่อนบ้านใกล้เคียงที่สามารถแชร์ขนาดรองเท้าเดียวกันได้ อาจมีหลายเพื่อนบ้านในละแวกใกล้เคียงและเพื่อนบ้านไม่สามารถมีค่าแตกต่างกันมากกว่าสอง:

เช่น3 3 4 5 5 6เป็นย่านเดียวเช่นเดียวกับ2 4 6 6และ1 2 3 5 7 8 10 12

เช่น1 1 1 4 5 6มีสองละแวกใกล้เคียง: และ1 1 14 5 6

พื้นฐานของอัลกอริทึม

พื้นที่ใกล้เคียงมีสองประเภท:

  • แม้ขนาด

    สำหรับn/2คู่นี้เพียงพอเสมอ:

    เช่น3 3 4 5 5 6ต้องสามคู่3 3, 4 5และ5 6

  • แปลกขนาด

    สำหรับceil(n/2)คู่นี้เพียงพอเสมอ:

    เช่น12 13 13 14 15ต้องสามคู่12 13, 13 14และ15คนเดียว

โค้ดที่ไม่ได้รับการทดสอบเพื่อทดสอบอัลกอริทึม

sub pairs {
    @_ = sort { $a <=> $b } @_;
    my @hood;
    my $i = 0;
    for (1..$#_) {
        push @{$hood[$i]}, $_[$_-1];
        $i++ if $_[$_]-$_[$_-1]>2
    }
    push @{$hood[$i]}, $_[$#_];
    my $pairs;
    $pairs += int(@{$hood[$_]} / 2) + @{$hood[$_]} % 2 for 0..$#hood;
    return "$pairs : @{[map qq([@$_]), @hood]}\n";
}

ตัวอย่างผลลัพธ์

(ย่านที่อยู่ในนั้น [ ] )

4 : [2 4 6 6 8] [14]
3 : [1 1 1 2 3]
6 : [1 1 1] [4 4 4] [8 8 9 9]
4 : [1 2 3 5 7 8 10 12]
17 : [1 2 3] [6 8 9 11 13 13 15 17 19 20 21] [27 28 29 30 32 33 35 35] [38 38 40] [43 45 45 46] [49]
18 : [3 3 3] [8 10 11 11 11 12 14] [18] [21 22 23] [29] [32 33 34 34 34 35 37 38 39 41] [44 46 48 49 49]
18 : [1 2 3] [6] [9] [12 13 15 17 18 19 20 21 21 23 24 25 25] [35 36] [40 41 41 41 43 45 46 46 46] [49]
16 : [1 3] [6 6 6 6] [11 12 14 14 15 17 19 20 20 21 21 22] [25 25 27 29 31 32 33] [38 39] [44 45] [49]
16 : [2 4] [7 7 8 10 12 13 15 16] [22 22 24 24] [27 29 31 31 33 34] [37 38 39] [42 43 43 44 45 46 47]
17 : [2 4 5 6 7] [11 11 13 13 14 15 16 17 17 17 19] [29] [34 35 36] [39 39 41 41 41 42 44 46] [49 49]
18 : [3 4 5 7 7] [10 10 12 12 12 14 15 15 17 18] [21] [24 24] [28] [32] [39 40 41 42 43 44 44] [47 47] [50]
16 : [2 4] [7 7 8 8] [11 11] [14 16 17 17 18 19] [22 24 26 26] [30 31 33 34 34 35] [38 38 39] [42 43] [50]
16 : [1 3 4 5] [11 11] [15 15 17 18 19 21 22 23 23 25 27 27 27 27 28 29 30 30] [33 34] [41 41] [45] [48]
17 : [2 2 3 4 6 6 7] [10 10] [13 14 15 16 17 19] [23 25] [28 30 31 32 33 34 36 37 38] [42] [48 49 50]
17 : [2] [7 9 9 9 9 10 10 12] [16 16] [19 21 21 22 24] [27 27 27] [36 36 36 37 39 39 40 40 40 41] [46]
18 : [1] [5 6 6 8] [11 11 12] [19 19 20 21 22 24 26 26] [29 30 31 32 34 35 35] [38] [42] [45] [48 48 49 49]
16 : [2 4 4 6] [11 12 13 13 13] [21 21 21 23] [30 31 31 33 35] [41 41 41 43 45 46 47 48 48 49 49 50]
16 : [2 2] [8 10 12] [15 15 15 15 16 16] [19 20] [23 24] [28 28 29] [32 34 36 36 36 37 39 41] [44 45 47 48]
17 : [3 3] [6] [9 10 11] [17 18] [21 23 23] [27 28 29 29 30 31 31 33] [37 37 39 39 39 40] [43 44] [47 48 49]
17 : [4] [7 9 10 10] [14 14 14] [17] [21] [25 25 27 27 28 30] [33 35 37 37 38 40 41 43 44 45 47 48 49 50]
18 : [3 4 5 6 7] [10 11 12 12 14 15 16 17] [20] [23 24 25 25 26 26] [31] [35] [38 40 41 42] [45 46 47] [50]
17 : [1 3] [8 10] [16 16 18 19 20 20] [23 23] [26] [30 31 33 34 35] [39 39 39 40 41 42 43] [46 46 47 47 49]
18 : [2 4 4 4 4 6 7 8 8 10 10] [13] [16 17] [20 22 23 25 25] [29 29 29] [33] [39 40 42] [48 48 49 49]
16 : [1 1 3 4] [7 8 10 10] [18 18 20 21] [24 25 26 27 29 31 33 33 34 34] [37 37 39] [45 46 48 49 49]
17 : [1] [4 4] [7 9 9 11 12] [15 16 17 17 18 19 21 21 21 22 23] [27 28 30 31] [37 39] [42] [48 49 49 50]
17 : [3 4 6 7 7 8 9 10 10 11 13 14 14] [21 21 23] [26 27] [31 32] [35 36] [39 40 41 41 41] [44 44] [49]
16 : [1] [4 6 6 8 10 12 13 15] [20 20 21 21] [29 29 30] [34 36 36 37 37 38 38 40] [44 45 46 47 47 48]
17 : [3 4 4 6] [12 14 15 16 17] [20 21 22 22 22 23 24 26 26] [29 30 32] [35 37 37 37 38 39 41 42] [48]
19 : [1] [5] [8 9] [14 14 14 16 16 17 17 17 17] [21] [24 24 24] [30] [34 35 36 37 39 40 40] [45 46 46 47 48]

1

Mathematica, 67 ไบต์

Length@Flatten[Partition[#,UpTo@2]&/@Split[Sort@#,Abs[#-#2]<3&],1]&

ลองในวุลแฟรม Sandbox


ทางใดเราสามารถทดสอบ ชอบสิ่ง Wolfram หรือไม่?
LiefdeWen

@LiefdeWen คุณสามารถลองออนไลน์ได้! ในวิชาคณิตศาสตร์ Mathics ไม่รองรับฟังก์ชั่นทั้งหมดของภาษา Wolfram แต่ฟังก์ชั่นที่ใช้ในรายการนี้มีการใช้งานทั้งหมดดังนั้น Mathics จึงเสียหรือวิธีการแก้ไขนี้ไม่ถูกต้อง
Pavel

มันทำงานบนsandbox.open.wolframcloud.comจึงเป็นปัญหาในด้าน Mathics'
OVS

1
@Phoenix ไม่คิดว่าคณิตศาสตร์รองรับUpTo
มาร์ติน

0

Perl, 103 ไบต์

say sub{for(1..$#_+1){$x{$i}++;$i++if$_[$_]-$_[$_-1]>2}@_/2+.5*grep$_%2,values%x}->(sort{$a<=>$b}@ARGV)

รับรายการอาร์กิวเมนต์จากบรรทัดคำสั่ง (ตาม@ARGV) พิมพ์STDOUTโดยค่าเริ่มต้น

นี่เป็นวิธีการทางเลือกโดยยึดตามความสัมพันธ์ต่อไปนี้:

Minimum pairs = ( Population size + # Odd neighbourhoods ) / 2

(ดูคำตอบนี้สำหรับวิธีการกำหนดย่านที่คุ้นเคย)


0

Javascript, 67 ไบต์

a=>(a=a.sort((a,b)=>a-b)).filter((n,i)=>m=!m|n-a[i-1]>2,m=0).length

ตัวอย่างข้อมูลโค้ด:

f=
a=>(a=a.sort((a,b)=>a-b)).filter((n,i)=>m=!m|n-a[i-1]>2,m=0).length

v=[[2,4,6,6,8,14],[2,1,3,1,1],[4,1,4,9,1,8,9,1,8,4],[1,2,3,5,7,8,10,12]]
for(k=0;k<4;k++)
  console.log(`f([${v[k]}])=${f(v[k])}`)

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