Scarpe per cavallucci marini


30

I cavallucci marini, ovviamente, hanno bisogno di scarpe. Tuttavia, un cavalluccio marino, con una sola coda, ha bisogno di una sola scarpa. Sfortunatamente, le scarpe vengono solo in coppia. Il denaro è limitato per il governo dei cavallucci marini, quindi devono acquistare il minor numero possibile di coppie. Ogni cavalluccio marino ha un numero di scarpe x dove x è un numero intero positivo. Tuttavia, un cavalluccio marino può indossare una scarpa delle dimensioni x - 1 o x + 1 se necessario.

Il tuo compito è quello di produrre il numero minimo di coppie che il governo dei cavallucci marini deve acquistare per mettere le scarpe su tutti i loro cavallucci marini.

Puoi prendere input come vuoi, scappatoie standard, ecc.

Dato che si tratta di , vince il codice più corto in byte.

Casi test

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

Questo può essere fatto in modo banale ordinando l'array e eseguendo il looping attraverso di esso, ma vorrei vedere qualcosa di creativo (questo non ha alcun impatto sul punteggio effettivo, penso solo che sarebbe interessante vedere un altro approccio)
truccato il

1
Non vedo come si possa fare in modo banale ...
Leaky Nun,

5
@ bushdid911 Suppongo di non poter spiegare come funziona Jelly in un commento
Leaky Nun

1
@CodyGray Puoi avere una coppia taglia 3, che copre 2 e 4.
Zgarb

2
Modifica potenziale del titolo:
Ferri di

Risposte:


5

05AB1E , 13 byte

Utilizza l'approccio OP descritto nei commenti.

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

Provalo online!

Spiegazione

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

Buccia , 15 14 byte

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

Utilizza l'algoritmo goloso: ordina e abbina da sinistra. Provalo online!

Grazie a Leo per aver salvato 1 byte.

Spiegazione

Questa è la prima risposta Husk che utilizza Γ, la funzione per il pattern che corrisponde a un elenco. In questo caso d'uso, if aè un valore ed gè una funzione, quindi Γagcorrisponde alla funzione fdefinita dallo snippet di Haskell

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

Definisco il caso base come a = 0e

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

dove si line0riferisce all'intera riga. Nel codice Husk, xe xssono argomenti impliciti della funzione lambda, ed line0è . L'elenco viene nuovamente ordinato in ogni chiamata ricorsiva, ma non importa in una sfida di 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.

Tutte queste persone che usano la propria lingua mi fanno venire voglia di crearne una mia. Prima devo trovare un nome: P
truccato il


4

Gelatina , 20 18 byte

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

Provalo online!

Fork of my risposta Python .


-4 byte: IḢ<3+2⁸ṫß‘µLḊ?(fondamentalmente non vedo alcun motivo per fare prima L, e ritornerei []se lista se di lunghezza 1 o 0, e quindi posso rimuovere un µda LµḊ?)
Erik the Outgolfer

Ma non hai ordinato da nessuna parte ...
Leaky Nun,

Ora sono un po 'confuso tbf ... Penso che il tuo intento sia un po' diverso da quello che fa il tuo codice? Potresti voler anteporre un mio golf se ho capito bene.
Erik the Outgolfer,

Qualcosa è traballante con il tuo tipo. [1, 1, 1, 1, 4, 4, 4, 8, 8, 9, 9] funziona ma [4,1,4,9,1,8,9,1,8,4,1] non funziona t.
truccato il

@ bushdid911 Entrambi funzionano. Potresti dimostrarlo?
Leaky Nun,

4

Python 2 , 49 byte

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

Provalo online!

Basato sulla soluzione ricorsiva di Leaky Nun .


Python 2 , 59 byte

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

Provalo online!

Scorre le dimensioni xin ordine ordinato. Ricorda la soglia superiore pper la dimensione corrente a quella abbinata a quella precedente. In tal caso ( x>p), reimpostare la soglia su 0per rendere impossibile il successivo abbinamento. In caso contrario, incrementare il conteggio delle uscite ce impostare la soglia successiva psu x+2.

La nuova soglia p=(x>p)*(x+2)è un'espressione gonfia. Vorrei trovare un modo per accorciarlo.


2

C #, 111 108 137 102 byte

Questo non vincerà mai, ma volevo comunque risolvere l'esercizio:

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

Grazie al commento di @grabthefish, sono stato in grado di sgranocchiare qualche byte in più:

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

Seguendo le regole speciali per 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);}}

Utilizzando una funzione 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;}

I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Dennis,

Grazie per mantenere la progressione attraverso le risposte - è interessante quanto la risposta finale.
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)

Prende un elenco di argomenti dalla riga di comando (as @ARGV), stampa per STDOUTimpostazione predefinita.

A Seahorseville ...

Un quartiere è una sequenza di taglie di scarpe vicine. Se ordinati, ogni cavalluccio marino ha vicini immediati che possono condividere la stessa misura di scarpe. Possono esserci più vicini nel vicinato e nessun vicino può differire di valore per più di due:

ad es. 3 3 4 5 5 6è un singolo quartiere, come lo sono 2 4 6 6, e1 2 3 5 7 8 10 12

ad esempio 1 1 1 4 5 6contiene due quartieri: 1 1 1e 4 5 6.

Base dell'algoritmo

Esistono due tipi di quartiere:

  • Anche IMPRESE

    Per questi, le n/2coppie sono sempre sufficienti:

    es. 3 3 4 5 5 6richiede tre coppie per 3 3, 4 5e5 6

  • Odd-size

    Per questi, le ceil(n/2)coppie sono sempre sufficienti:

    es 12 13 13 14 15richiede tre accoppiamenti per 12 13, 13 14e 15solo.

Codice non golfato per testare l'algoritmo

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

Risultati del campione

(Quartieri chiusi 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 byte

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

Prova nella sandbox Wolfram .


In che modo possiamo testare? Ti piace la cosa di Wolfram?
Liefde:

@LiefdeWen Puoi provarlo online!in matematica. La matematica non supporta tutte le funzioni del linguaggio Wolfram, ma quelle utilizzate in questa voce sono tutte implementate, quindi o la matematica è rotta o questa soluzione non è valida.
Pavel,

Funziona su sandbox.open.wolframcloud.com , quindi il problema è da parte di Mathics
ovs,

1
@Phoenix non pensa che la matematica supportiUpTo
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)

Prende un elenco di argomenti dalla riga di comando (as @ARGV), stampa suSTDOUTimpostazione predefinita.

Questo è un approccio alternativo, basato sulla seguente relazione:

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

(Vedi questa risposta per come viene definito il vicinato )


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

Esempio di frammento di codice:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.