Sepatu untuk kuda laut


30

Kuda laut, tentu saja, butuh sepatu. Namun, kuda laut, hanya memiliki satu ekor, hanya membutuhkan satu sepatu. Sayangnya, sepatu hanya datang berpasangan. Uang ketat untuk pemerintah kuda laut, sehingga mereka perlu membeli pasangan sesedikit mungkin. Setiap kuda laut memiliki ukuran sepatu x di mana x adalah bilangan bulat positif. Namun, kuda laut dapat mengenakan sepatu dengan ukuran x - 1 atau x +1 jika perlu.

Tugas Anda adalah menampilkan jumlah pasangan minimum yang harus dibeli pemerintah kuda laut untuk mengenakan sepatu di semua kuda laut mereka.

Anda dapat mengambil input apa pun yang Anda inginkan, celah standar, dll.

Karena ini adalah , kode terpendek dalam byte menang.

Uji kasus

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

Ini dapat dilakukan secara sepele dengan menyortir array dan mengulanginya, tetapi saya ingin melihat sesuatu yang kreatif (ini tidak ada hubungannya dengan skor aktual, saya hanya berpikir itu akan menarik untuk melihat pendekatan lain)
rigged

1
Saya tidak melihat bagaimana hal itu dapat dilakukan dengan sepele ...
Leaky Nun

5
@ bushdid911 Saya kira saya tidak bisa menjelaskan bagaimana Jelly bekerja dalam komentar
Leaky Nun

1
@CodyGray Anda dapat memiliki pasangan ukuran 3, yang mencakup 2 dan 4.
Zgarb

2
Potensi Judul sunting: Sea-horseshoes
CraigR8806

Jawaban:


5

05AB1E , 13 byte

Menggunakan pendekatan OP yang dijelaskan dalam komentar.

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

Cobalah online!

Penjelasan

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

Sekam , 15 14 byte

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

Menggunakan algoritma serakah: urutkan dan pasangkan dari kiri. Cobalah online!

Terima kasih kepada Leo karena telah menghemat 1 byte.

Penjelasan

Ini adalah jawaban Sekam pertama yang digunakan Γ, fungsi untuk pola yang cocok dengan daftar. Dalam kasus penggunaan ini, jika amerupakan nilai dan gfungsi, maka Γagsesuai dengan fungsi yang fdidefinisikan oleh cuplikan Haskell

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

Saya mendefinisikan kasus dasar sebagai a = 0dan

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

di mana line0mengacu pada seluruh baris. Dalam kode Husk, xdan xsargumen implisit untuk fungsi lambda, dan line0adalah . Daftar ini diurutkan lagi dalam setiap panggilan rekursif, tetapi itu tidak masalah dalam tantangan golf.

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

Semua orang ini menggunakan bahasa mereka sendiri membuat saya ingin membuat bahasa saya sendiri. Pertama saya harus datang dengan nama: P
kecurangan


4

Jelly , 20 18 byte

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

Cobalah online!

Fork dari jawaban Python saya .


-4 bytes: IḢ<3+2⁸ṫß‘µLḊ?(pada dasarnya saya tidak melihat alasan untuk melakukan sebelumnya L, dan akan kembali []jika daftar jika panjang 1 atau 0, dan kemudian saya dapat menghapus µdari LµḊ?)
Erik the Outgolfer

Tapi Anda tidak menyortir di mana pun ...
Leaky Nun

Sekarang saya agak bingung tbf ... Saya pikir niat Anda sedikit berbeda dari apa kode Anda sebenarnya? Anda mungkin ingin menambahkan ke golf saya jika saya mengerti dengan benar.
Erik the Outgolfer

Ada yang tidak beres dengan jenis Anda. [1, 1, 1, 1, 4, 4, 4, 8, 8, 9, 9] berfungsi tetapi [4,1,4,9,1,8,9,1,8,4,1] tidak berfungsi t.
dicurangi

@ bushdid911 Keduanya bekerja. Bisakah Anda menunjukkan?
Leaky Nun

4

Python 2 , 49 byte

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

Cobalah online!

Berdasarkan solusi rekursif Leaky Nun .


Python 2 , 59 byte

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

Cobalah online!

Iterasi melalui ukuran xdalam urutan diurutkan. Mengingat ambang atas puntuk ukuran saat ini untuk dipasangkan dengan yang sebelumnya. Jika demikian ( x>p), atur ulang ambang 0untuk membuatnya tidak mungkin untuk dipasangkan berikutnya. Jika tidak, tambahkan jumlah output cdan setel ambang berikutnya pke x+2.

Ambang baru p=(x>p)*(x+2)adalah ekspresi kembung. Saya ingin mencari cara untuk mempersingkatnya.


2

C #, 111 108 137 102 byte

Ini tidak akan pernah menang, tetapi saya ingin menyelesaikan latihan:

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

Berkat komentar @ grabthefish, saya bisa mengemil beberapa byte lagi:

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

Mengikuti aturan C # khusus 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);}}

Menggunakan fungsi lambda:

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;}

Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Dennis

Terima kasih telah menjaga perkembangan melalui jawaban - itu sama menariknya dengan jawaban akhir.
Criggie

2

Perl, 113 byte

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

Mengambil daftar argumen dari baris perintah (as @ARGV), dicetak STDOUTsecara default.

Di Seahorseville ...

Sebuah lingkungan adalah urutan tetangga ukuran sepatu. Saat disortir, masing-masing kuda laut memiliki tetangga langsung yang dapat berbagi ukuran sepatu yang sama. Mungkin ada beberapa tetangga di lingkungan dan tidak ada tetangga yang dapat berbeda nilainya dengan lebih dari dua:

mis. 3 3 4 5 5 6adalah satu lingkungan, seperti 2 4 6 6, dan1 2 3 5 7 8 10 12

misalnya 1 1 1 4 5 6berisi dua lingkungan: 1 1 1dan 4 5 6.

Dasar dari algoritma

Ada dua jenis lingkungan:

  • Berukuran genap

    Untuk ini, n/2pasangan selalu cukup:

    misalnya 3 3 4 5 5 6membutuhkan tiga pasangan untuk 3 3, 4 5dan5 6

  • Berukuran aneh

    Untuk ini, ceil(n/2)pasangan selalu cukup:

    misalnya 12 13 13 14 15membutuhkan tiga pasang untuk 12 13, 13 14dan 15sendirian.

Kode ungolf untuk menguji algoritma

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";
}

Hasil Sampel

(Lingkungan terlampir [ ] )

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 byte

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

Coba di kotak pasir Wolfram .


Adakah yang bisa kita uji? Seperti hal Wolfram?
LiefdeWen

@LiefdeWen Anda bisa mencobanya secara online! dalam Matematika. Matematika tidak mendukung semua fungsi bahasa Wolfram, tetapi yang digunakan dalam entri ini semuanya diimplementasikan, sehingga Matematika rusak atau solusi ini tidak valid.
Pavel

Ini bekerja di sandbox.open.wolframcloud.com , jadi masalahnya ada di pihak Mathics '
ovs

1
@Phoenix tidak berpikir dukungan MatematikaUpTo
martin

0

Perl, 103 byte

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

Mengambil daftar argumen dari baris perintah (as @ARGV), dicetak STDOUTsecara default.

Ini adalah pendekatan alternatif, berdasarkan pada hubungan berikut:

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

(Lihat jawaban ini untuk bagaimana lingkungan didefinisikan)


0

Javascript, 67 byte

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

Cuplikan kode contoh:

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])}`)

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.