Buty dla koników morskich


30

Koniki morskie oczywiście potrzebują butów. Jednak konik morski, mający tylko jeden ogon, potrzebuje tylko jednego buta. Niestety buty występują tylko w parach. Pieniądze są ograniczone dla rządu konika morskiego, więc muszą kupić jak najmniej par. Każdy konik morski ma rozmiar buta x, gdzie x jest dodatnią liczbą całkowitą. Konik morski może jednak w razie potrzeby nosić but o rozmiarze x -1 lub x + 1 .

Twoim zadaniem jest wyprowadzenie minimalnej liczby par, które rząd konika morskiego musi kupić, aby założyć buty na wszystkich swoich konikach morskich.

Możesz wprowadzać dane w dowolny sposób, standardowe luki itp.

Ponieważ jest to kod, wygrywa najkrótszy kod w bajtach.

Przypadki testowe

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

Można to zrobić w trywialny sposób, sortując tablicę i przechodząc przez nią, ale chciałbym zobaczyć coś kreatywnego (nie ma to wpływu na faktyczną punktację, myślę, że byłoby interesujące zobaczyć inne podejście)
sfałszowane

1
Nie rozumiem, jak można to zrobić trywialnie ...
Leaky Nun

5
@ bushdid911 Chyba nie potrafię wyjaśnić, jak działa Jelly w komentarzu
Leaky Nun

1
@CodyGray Możesz mieć parę w rozmiarze 3, która obejmuje 2 i 4.
Zgarb

2
Potencjalna edycja tytułu: Podkowy
morskie

Odpowiedzi:


5

05AB1E , 13 bajtów

Wykorzystuje podejście OP opisane w komentarzach.

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

Wypróbuj online!

Wyjaśnienie

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

Łuska , 15 14 bajtów

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

Używa chciwego algorytmu: sortuj i paruj od lewej. Wypróbuj online!

Dzięki Leo za oszczędność 1 bajtu.

Wyjaśnienie

To pierwsza odpowiedź Husk, która używa Γfunkcji dopasowania wzoru do listy. W tym przypadku użycia, jeśli ajest wartością i gjest funkcją, to Γagodpowiada funkcji fzdefiniowanej przez fragment kodu Haskell

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

Zdefiniuję przypadek podstawowy jako a = 0i

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

gdzie line0odnosi się do całej linii. W kodzie Husk xi xssą niejawnymi argumentami funkcji lambda, i line0jest . Lista jest sortowana ponownie przy każdym rekurencyjnym połączeniu, ale to nie ma znaczenia w wyzwaniu golfowym.

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

Wszyscy ci ludzie używający własnych języków sprawiają, że chcę tworzyć własne. Najpierw muszę wymyślić imię: P
sfałszowane


4

Galaretka , 20 18 bajtów

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

Wypróbuj online!

Widelec mojej odpowiedzi w języku Python .


-4 bajtów: IḢ<3+2⁸ṫß‘µLḊ?(w zasadzie nie widzę żadnego powodu, aby zrobić przed Li wróci []czy listy, jeśli o długości 1 lub 0, a następnie mogę wyjąć µz LµḊ?)
Eryk Outgolfer

Ale nigdzie nie posortowałeś ...
Leaky Nun

Teraz jestem trochę zdezorientowany tbf ... Myślę, że twoje zamiary są nieco inne niż to, co faktycznie robi twój kod? Jeśli dobrze rozumiem, możesz dołączyć do mojego golfa.
Erik the Outgolfer

Coś jest nie tak z twoim rodzajem. [1, 1, 1, 1, 4, 4, 4, 8, 8, 9, 9] działa, ale [4,1,4,9,1,8,9,1,8,4,1] nie ” t.
sfałszowano

@ bushdid911 Oba działają. Czy możesz to zademonstrować?
Leaky Nun

4

Python 2 , 49 bajtów

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

Wypróbuj online!

Oparty na rekurencyjnym rozwiązaniu Leaky Nun .


Python 2 , 59 bajtów

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

Wypróbuj online!

Powtarza rozmiary xwedług posortowanej kolejności. Zapamiętuje górny próg pdla bieżącego rozmiaru do sparowanego z poprzednim. Jeśli tak ( x>p), zresetuj próg, 0aby uniemożliwić sparowanie następnego. Jeśli nie, zwiększ liczbę wyjść ci ustaw następny próg pna x+2.

Nowy próg p=(x>p)*(x+2)jest nadęty. Chciałbym znaleźć sposób, aby to skrócić.


2

C #, 111 108 137 102 bajtów

To nigdy nie wygra, ale i tak chciałem rozwiązać to ćwiczenie:

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

Dzięki komentarzowi @grabthefish udało mi się skubnąć jeszcze kilka bajtów:

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

Zgodnie ze specjalnymi zasadami C # w 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);}}

Korzystanie z funkcji 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;}

Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Dennis

Dziękujemy za utrzymanie postępu w odpowiedziach - to jest tak samo interesujące jak ostateczna odpowiedź.
Criggie,

2

Perl, 113 bajtów

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

Pobiera listę argumentów z wiersza poleceń (as @ARGV), drukuje doSTDOUT domyślnie .

W Seahorseville ...

sąsiedztwo jest sekwencją sąsiednich rozmiarów obuwia. Po posortowaniu każdy konik morski ma bezpośrednich sąsiadów, którzy mogą dzielić ten sam rozmiar buta. W sąsiedztwie może znajdować się wielu sąsiadów i żaden z sąsiadów nie może różnić się wartością o więcej niż dwóch:

np. 3 3 4 5 5 6jest jednym sąsiedztwem, tak jak są 2 4 6 6, i1 2 3 5 7 8 10 12

np. 1 1 1 4 5 6zawiera dwie dzielnice: 1 1 1i 4 5 6.

Podstawa algorytmu

Istnieją dwa rodzaje sąsiedztwa:

  • Równej wielkości

    Dla nich n/2pary są zawsze wystarczające:

    np 3 3 4 5 5 6wymaga trzech parach 3 3, 4 5i5 6

  • Dziwne rozmiary

    Dla nich ceil(n/2)pary są zawsze wystarczające:

    np 12 13 13 14 15wymaga trzech parach 12 13, 13 14i 15sam.

Nieskluczony kod do testowania algorytmu

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

Przykładowe wyniki

(Zamknięte dzielnice [ ] )

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 bajtów

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

Wypróbuj w piaskownicy Wolfram .


W jakiś sposób możemy przetestować? Podoba Ci się Wolfram?
LiefdeWen

@LiefdeWen Możesz spróbować online! w matematyce. Matematyka nie obsługuje wszystkich funkcji języka Wolfram, ale wszystkie użyte w tym wpisie są zaimplementowane, więc albo Matematyka jest zepsuta, albo to rozwiązanie jest nieprawidłowe.
Pavel

Działa na sandbox.open.wolframcloud.com , więc problem leży po stronie
matematyki

1
@Phoenix nie sądzę, że Mathics obsługujeUpTo
martin

0

Perl, 103 bajty

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

Pobiera listę argumentów z wiersza poleceń (as @ARGV),STDOUT domyślnie drukuje .

Jest to alternatywne podejście oparte na następującej relacji:

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

(Zobacz tę odpowiedź, jak zdefiniowano sąsiedztwo )


0

JavaScript, 67 bajtów

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

Przykładowy fragment kodu:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.