Quante pagine ho strappato?


34

Il mese scorso ho preso in prestito molti libri dalla biblioteca. Erano tutti buoni libri, pieni di emozioni e colpi di scena. Sfortunatamente, ad alcuni punti sono diventato molto arrabbiato / triste / deluso, quindi ho strappato alcune pagine.

Ora la biblioteca vuole sapere quante pagine ho strappato per ogni libro.

Il tuo obiettivo è quello di scrivere un programma, che prende come input un elenco di numeri ordinati e delimitati da virgole e stampa il numero minimo e massimo possibile di pagine che avrei potuto strappare. Ogni riga rappresenta un libro, ogni numero rappresenta una pagina mancante dal libro.

Esempio di input:

7,8,100,101,222,223
2,3,88,89,90,103,177
2,3,6,7,10,11
1
1,2

Esempio di output:

4/5
5/6
3/6
1/1
1/2

4/5significa che potrei aver strappato 4 o 5 pagine, a seconda del lato da cui inizia la numerazione delle pagine del libro. Uno avrebbe potuto strappare pagina 6/7, pagina 8/9, pagina 100/101 e pagina 222/223 (4 pagine). In alternativa, si sarebbe potuto strappare pagina 7/8, pagina 99/100, pagina 101/102, pagina 221/222 e pagina 223/224 (5 pagine).

Ricorda che una pagina del libro ha sempre un lato anteriore e uno posteriore. Anche la numerazione delle pagine differisce da libro a libro. Alcuni libri hanno numeri di pagina pari sulla pagina di sinistra; alcuni sulla pagina giusta. Tutti i libri vengono letti da sinistra a destra.

Il codice più corto in byte vince. È formato I / O Strict non richiesto. I tuoi programmi devono essere in grado di accettare uno o più libri come input. Divertiti.


3
Sarebbe accettabile se non si garantisse che i valori di output fossero ordinati? (come 4/5e 5/4)
Arnauld il

Non dimenticare di aggiornare le sfide per specificare che l'ordine di output deve essere coerente, tutto min/maxo tutti max/min. (Anche se, personalmente, preferirei che non facesse parte delle specifiche!)
Shaggy

2
Quale sarebbe la ragione per programs must be able to take one or more books as inputgovernare? La maggior parte (se non tutto) semplicemente impacchetterà il codice per verificare un singolo libro in un ciclo o qualcosa del genere. IMHO aggiunge solo un sovraccarico alla risposta con guadagni poco o niente alla sfida. Queste domande hanno già ricevuto molte risposte, quindi è meglio tenerlo così com'è, ma tienilo a mente per le tue sfide future.
Rod

Caso di prova suggerito (per gentile concessione di @Arnauld): 1,3,5,7,9,11,13,15,17,18- a vantaggio delle lingue il cui sortmetodo integrato ordina lessicograficamente per impostazione predefinita (supponendo che il requisito di output coerente sia aggiunto alla specifica).
Shaggy,

Risposte:


6

05AB1E , 13 byte

εD>)ÅÈε€θγg}{

Provalo online!

Grazie a Emigna per l'heads-up sulle modifiche alle specifiche.

Spiegazione

εD>)ÅÈε€θγg}{ – Full program.
ε             – For each book...
 D            – Push two copies of it.
  >           – Increment all the elements of the second copy.
   )          – Wrap the whole stack into a list.
    ÅÈ        – Produces the lists of even natural numbers lower or equal to each element.
      ε       – For each (the modified copies of the book):
       €θ     – Get the last item of each.
         γg   – And split into chunks of equal adjacent elements.
           }  – Close the loop.
            { – Sort the resulting list.

Bella presentazione. Ho aggiornato la sfida con 2 linee di input / output aggiuntive. Inoltre, non è necessario un I / O rigoroso.
Arminb,

A proposito, il tuo programma non accetta più libri come input.
Arminb,

@Emigna Grazie per l'heads-up. Modificato la mia risposta di conseguenza.
Mr. Xcoder,

@arminb Ora dovrebbe essere risolto.
Mr. Xcoder,

4

Python 2 , 72 56 68 67 byte

lambda b:[map(len,map(set,zip(*[[p/2,-p/2]for p in t])))for t in b]

Provalo online!


Il tuo programma non accetta input di più righe (più libri). Ho aggiornato la sfida con 2 linee di input / output aggiuntive. Inoltre, non è necessario un I / O rigoroso.
Arminb,

1
Più ingressi per corsa non rientrerebbero in I / O rigoroso?
Rod

1
Si potrebbe discutere.
Arminb,

Il modo in cui prendi i libri e le loro pagine come input è coperto dalle specifiche I / O. Il requisito che non prende più libri come input è parte della specifica sfida.
Shaggy,

4

JavaScript, 104 93 92 85 80 79 74 byte

Sarebbe 57 byte se non per il requisito non necessario (secondo me) che ogni coppia di numeri nell'output fosse ordinata in modo coerente, o 47 byte se avessimo solo bisogno di prendere un libro come input.

Input e output sono entrambi una matrice di array.

a=>a.map(x=>[0,1].map(n=>new Set(x.map(y=>y+n>>1)).size).sort((x,y)=>x-y))
  • Inizialmente ispirato alla soluzione Java di Olivier e alla mia soluzione Japt (attualmente eliminata).
  • 2 byte salvati grazie ad Arnauld (più altri 3 rilevati entrambi contemporaneamente) e 10 byte aggiunti grazie a lui individuando l'ordinamento non funzionante che speravo che nessuno avrebbe notato mentre tale requisito era ancora in discussione!

Casi test

I casi di test sono suddivisi in singoli libri per una migliore leggibilità con l'ultimo caso (che include il [1,2]caso limite) che serve a illustrare che questa soluzione supporta più libri nell'input.

f=
a=>a.map(x=>[0,1].map(n=>new Set(x.map(y=>y+n>>1)).size).sort((x,y)=>x-y))
o.innerText=` Input                         | Output\n${`-`.repeat(31)}|${`-`.repeat(21)}\n`+[[[7,8,100,101,222,223]],[[2,3,88,89,90,103,177]],[[2,3,6,7,10,11]],[[1,3,5,7,9,11,13,15,17,18]],[[1],[1,2],[8,10]]].map(b=>` `+JSON.stringify(b).padEnd(30)+"| "+JSON.stringify(f(b))).join`\n`
<pre id=o></pre>


Storia


Da nessuna parte è scritto che l'output deve essere ordinato da min a max. La domanda dice solo che l'input verrà ordinato.
Olivier Grégoire,

@ OlivierGrégoire; mentre è vero che l'ordinamento coerente dell'output non è attualmente incluso nelle specifiche, arminb ha commentato un paio di soluzioni affermando che si tratta effettivamente di un requisito. Ho già commentato la sfida chiedendone l'inclusione e affermando la mia preferenza contro di essa - dopotutto, per me, rientrerebbe nel rigoroso I / O.
Shaggy,

1
Penso che questo dovrebbe funzionare per 64 byte. Tuttavia, il metodo di ordinamento corrente senza alcun callback è difettoso. Fallirebbe ad es [1,3,5,7,9,11,13,15,17,18].
Arnauld,

Grazie, @Arnauld. Avevo appena finito di scrivere un aggiornamento per mappare [0,.5]anziché utilizzare gquando ho notato il tuo commento. Non so perché ho un tale blocco mentale con operatori bit per bit! Speravo che l'ordinamento dell'output non diventasse un requisito e che nessuno avrebbe notato il mio errore sort()nel frattempo;) Ho bisogno di fare un po 'di lavoro, quindi torneremo tra poco per l'aggiornamento.
Shaggy,

@Shaggy Qual è l'intento originale di y/2? Qual è il ragionamento di dividere il numero di pagina a metà per questo algoritmo?
MicFin

2

Retina 0.8.2 , 60 byte

\d+
$*
.+
$&,/$&,
,(?=.*/)
1,
((11)+,)1\1|1+,
1
%O`1+
1+
$.&

Provalo online! Spiegazione:

\d+
$*

Converti i numeri di pagina in unario.

.+
$&,/$&,

Duplica l'elenco, interponendo a /.

,(?=.*/)
1,

Incrementa i numeri di pagina in una copia dell'elenco.

((11)+,)1\1|1+,
1

Conta il numero di pagine, ma i numeri pari e dispari consecutivi contano solo come una pagina.

%O`1+

Ordina i conteggi in ordine.

1+
$.&

Converti i conteggi in decimali.


Bella presentazione! Ho aggiornato la sfida con 2 linee di input / output aggiuntive. Inoltre, non è necessario un I / O rigoroso. Sembra che il tuo programma sia ormai l'unico a superare tutti i casi di test.
Arminb,

Non può ,(?=.*/)¶1,essere qualcosa di simile ,.*/¶1$&invece?
Ven

@Ven No, ciò incrementerebbe solo un numero, ma devo incrementarli tutti.
Neil,

Ok, e l'uso della sovrapposizione lo riporta allo stesso numero di byte, quindi discreto
Ven

2

Haskell , 62 byte

import Data.List
p t=sort[length$nub[div(p+o)2|p<-t]|o<-[0,1]]

Provalo online!


1
Non penso che questo sia tecnicamente valido, poiché la domanda richiede un programma completo ( Your goal is to write a program, which takes a sorted, comma-delimmited list of numbers as input )
Οurous

@Ourous che 'giusto. Inoltre ho aggiornato la sfida con 2 linee di input / output extra. Inoltre, non è necessario un I / O rigoroso.
Arminb,

2

Java (OpenJDK 9) , 163 byte

import java.util.*;
n->{for(int i=n.length;i-->0;){Set s=new HashSet(),t=new HashSet();for(int p:n[i]){s.add(p/2);t.add(++p/2);}n[i]=new int[]{s.size(),t.size()};}}

Provalo online!

spiegazioni

n->{                                   // Input-output of int[][]
 for(int i=n.length;i-->0;){           // Iterate on books
  Set s=new HashSet(),t=new HashSet(); // Create two hashsets
  for (int p:n[i]) {                   // Iterate over each page
   s.add(p/2);                         // Add the sheet-of-page of books [ even | odd ] to one set.
   t.add(++p/2);                       // Add the sheet-of-page of books [ odd | even ] to the other set.
  }
  n[i]=new int[] {                     // change the input to the number of sheets used.
   s.size(),
   t.size()
  };
 }
}

Nota: poiché non è richiesto, i numeri minimo e massimo di pagine non sono ordinati.


Puoi concatenarti sizecon addin Java per salvare forse qualche byte? ad es s.add(p/2).size.
Shaggy,

1
@Shaggy No. Potrei concatenare roba con flussi, ma ciò aggiungerebbe molti <s> pochi </s> molti byte, non salvare ;-)
Olivier Grégoire

2

APL (Dyalog Unicode) , 37 byte

{(≢⍵)≤2:⌽≢∘∪¨⌊⍵(1+⍵)÷2⋄≢∘∪¨⌊⍵(1+⍵)÷2}

Provalo online!

Questo può essere fatto per meno della metà del conteggio dei byte se l'ordine di output delle pagine non ha importanza:

{≢∘∪¨⌊⍵(1+⍵)÷2}

Come?

{(≢⍵)≤2:⌽≢∘∪¨⌊⍵(1+⍵)÷2⋄≢∘∪¨⌊⍵(1+⍵)÷2}⍝ Prefix dfn
{(≢⍵)≤2:                                If argument length 2 
                    ÷2                  Divide by 2
              ⍵(1+⍵)                    Both the argument and 1+argument
                                       Round down to the nearest integer
           ∪¨                           Get the unique values of each
                                       And then
                                       Get the tally of elements of each
                                       And reverse the result
                                       Else
                       ≢∘∪¨⌊⍵(1+⍵)÷2}  Same as above, without reverting the result.


2

Perl 5 , 95 + 1 ( -a) = 96 byte

@0=@1=0;map{$i=-1;$F[$i]+1==$F[$i+1]&&$F[$i]%2==$_&&$i++while++$i<@F&&++@{$_}[0]}0,1;say"@0/@1"

Provalo online!


In alcuni casi il programma non viene eseguito correttamente. Ho aggiornato la sfida con 2 linee di input / output aggiuntive. Inoltre, non è necessario un I / O rigoroso.
Arminb,

Non vedo dove nessuno dei tuoi casi di test sta fallendo. L'unica cosa che non funziona sono più casi, che hai aggiunto molto tempo dopo aver pubblicato la mia soluzione. In ogni caso, ho aggiornato la soluzione per gestire più test.
Xcali,

2

Wolfram Language (Mathematica) , 37 byte

Grazie @MartinEnder per 8 byte!

Sort[Length@*Split/@{#,#+1}~Floor~2]&

Provalo online!

Spiegazione

Nel: {3, 4, 5}

{#,#+1}

Prendi (input) e (input + 1). {{3, 4, 5}, {4, 5, 6}}

... ~Floor~2

Per ogni numero dall'alto, prendi il numero pari più grande meno. {{2, 4, 4}, {4, 4, 6}}

Length@*Split/@

Per ogni elenco dall'alto, dividere l'elenco per gli stessi elementi {{{2}, {4, 4}}, {{4, 4}, {6}}}

e prendere la lunghezza di ciascuno: {2, 2}

Sort[ ... ]

Ordina l'output.


1
Non hai bisogno di SplitBy: Length@Split@⌊#/2⌋&/@{#,#+1}&funziona. Ma allora è ancora più breve per fare il pavimento prima che la mappa: Length@*Split/@⌊{#,#+1}/2⌋&. E se vuoi, puoi ottenere lo stesso numero di byte senza Unicode:Length@*Split/@{#,#+1}~Floor~2&
Martin Ender,

Penso che la sfida richieda un formato I / O rigoroso.
Erik the Outgolfer,

1

Pulito , 222 210 204 196 byte

import StdEnv,ArgEnv,Data.Maybe,qualified GenLib as G
Start=tl[let(Just l)='G'.parseString i;?s=sum[1\\n<-[s,s+2..last(sort l)]|isAnyMember[n,n+1]l]in zip2(sort[?0,?1])['/\n']\\i<-:getCommandLine]

Provalo online!

I requisiti del programma completo uccidono assolutamente la capacità di Clean di competere.

Per coloro che hanno prestato attenzione alle mie risposte in Clean, noterai import qualifiedche è un brutto hack per spostarsi usando moduli che non dovrebbero essere usati insieme, che è necessario solo qui a causa di un altro brutto hack da fare a GenLibseconda di Data.Maybeinvece di StdMaybe, che è il risultato di un altro brutto hack nelle librerie tradotte da Haskell Dataper ottenere funzionalità prima che le librerie di Clean siano ugualmente complete.

Accetta input tramite argomenti della riga di comando.


Bella presentazione. Ho aggiornato la sfida con 2 linee di input / output aggiuntive. Inoltre, non è necessario un I / O rigoroso.
Arminb,

@arminb Grazie! Sarò in grado di accorciarlo molto domani in quel caso.
6uroso

@arminb L'ho aggiornato, quindi dovrebbe essere valido con i nuovi casi. Se l'I / O che ho usato non è accettabile, lo rivedrò di nuovo al mattino.
Οuroso

0

Perl, 40 byte

inludes +1pera

perl -aE 'say/$/*grep${$.}{$_*$`|1}^=1,@F for-1,1' <<< "7 8 100 101 222 223"

L'output non è ordinato.

Presuppone numeri di pagina positivi (in particolare nessuna pagina 0). Presuppone che le pagine mancanti siano menzionate una sola volta. Non importa se l'ingresso è ordinato o meno.

L'elaborazione di un solo libro per esecuzione consente di risparmiare 3byte per 37:

perl -aE 'say/$/*grep$z{$_*$`|1}^=1,@F for-1,1' <<< "7 8 100 101 222 223"
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.