タツノオトシゴの靴


30

もちろん、タツノオトシゴには靴が必要です。ただし、尾が1つしかないタツノオトシゴには、靴が1つだけ必要です。残念ながら、靴はペアでしかありません。タツノオトシゴ政府にとってはお金が不足しているため、できるだけ少ないペアを購入する必要があります。各タツノオトシゴは、靴のサイズ持つ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

これは、配列をソートし、それをループによって自明行うことができますが、私は創造的な何かを見たいのですが(これは実際のスコアリングとは関係ありません、私はちょうど別のアプローチを見るのは興味深いことだと思う)
不正

1
私はそれが...自明行うことができますどのように表示されない
漏れ修道女

5
@ bushdid911私はゼリーコメントでどのように機能するかを説明することはできません仮定
漏れ修道女

1
@CodyGray 2と4をカバーするサイズ3のペアを持つことができます。
Zgarb17年

2
タイトル編集の可能性:
タツノオトシゴ

回答:


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

ハスク15 14バイト

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

欲張りアルゴリズムを使用します。左から並べ替えてペアにします。 オンラインでお試しください!

1バイトを節約してくれたLeoに感謝します。

説明

これは、Γリストをパターンマッチングするための関数を使用する最初のHuskの回答です。このユースケースでaは、が値でgあり、関数である場合、Haskellスニペットで定義されたΓag関数に対応しますf

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)

where line0は行全体を指します。Huskコードでは、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
不正

5

Pythonの369の 66 60バイト

xnorのおかげで9バイト。

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

オンラインでお試しください!


できると思いますa.sort()
-xnor

@xnor完了、ありがとう。
リーキー修道女

ソートがに貼り付けることができるlambdaf=lambda a:a[1:a.sort()]and-~f(a[1+(a[1]-a[0]<3):])or len(a)
XNOR

or[]<a3バイトを保存するには
フェリペナルディバティスタ

4

ゼリー20 18バイト

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

オンラインでお試しください!

私のPythonの答えのフォーク。


-4バイト:(IḢ<3+2⁸ṫß‘µLḊ?基本的に、前に行う理由はありません。長さが1または0の場合はリストを返し、その後from を削除できます)L[]µLµḊ?
Erik the Outgolfer

しかし、あなたは、ソートどこにも...しませんでした
漏れ修道女

今、私は少し混乱していますtbf ...あなたの意図はあなたのコードが実際に行うものとは少し異なると思いますか?私が正しく理解しているなら、私のゴルフの前に付け加えたいかもしれません。
エリックアウトゴルファー

あなたのソートには何か奇妙なことがあります。[1、1、1、1、4、4、4、8、8、9、9]は機能しますが、[4,1,4,9,1,8,9,1,8,4,1]は機能しませんt。
リグ

@ bushdid911彼らは両方とも動作します。デモしてもらえますか?
リーキー修道女

4

Python 2、49バイト

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

オンラインでお試しください!

Leaky Nunの再帰的ソリューションに基づいています


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、次のしきい値pをに設定しx+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);

PC&Gの特別なC#ルールに従います:

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

コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
デニス

回答の進行を維持していただきありがとうございます。これは最終回答と同じくらい興味深いものです。
クリギー

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 3 4 5 5 6、単一の近隣である場合2 4 6 6、および1 2 3 5 7 8 10 12

たとえば1 1 1 4 5 6、2つの近傍が含まれます:1 1 14 5 6

アルゴリズムの基礎

エリアには次の2つのタイプがあります。

  • Even-sized

    For these, n/2 pairs is always sufficient:

    e.g. 3 3 4 5 5 6 requires three pairs for 3 3, 4 5 and 5 6

  • Odd-sized

    For these, ceil(n/2) pairs is always sufficient:

    e.g. 12 13 13 14 15 requires three pairs for 12 13, 13 14, and 15 alone.

Ungolfed code to test the algorithm

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

Sample Results

(Neighbourhoods enclosed in [ ] )

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 bytes

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

Try in Wolfram sandbox.


Any way we can test? Like the Wolfram thing?
LiefdeWen

@LiefdeWen You could Try it online! in Mathics. Mathics doesn't support all the functions of the Wolfram language, but the ones used in this entry are all implemented, so either Mathics is broken or this solution is invalid.
Pavel

It works on sandbox.open.wolframcloud.com, so the problem is on Mathics' side
ovs

1
@Phoenix don't think Mathics supports UpTo
martin

0

Perl, 103 bytes

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

Takes list of arguments from command line (as @ARGV), prints to STDOUT by default.

This is an alternative approach, based on the following relationship:

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

(See this answer for how neighbourhood is defined)


0

Javascript, 67 bytes

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

Example code snippet:

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.