Berapa banyak halaman yang telah saya sobek?

34

Bulan lalu saya meminjam banyak buku dari perpustakaan. Mereka semua adalah buku yang bagus, penuh dengan emosi dan plot-twists. Sayangnya, pada beberapa titik saya menjadi sangat marah / sedih / kecewa, jadi saya merobek beberapa halaman.

Sekarang perpustakaan ingin tahu berapa banyak halaman yang telah saya buat untuk setiap buku.

Tujuan Anda adalah untuk menulis sebuah program, yang mengambil daftar angka yang diurutkan, dibatasi koma sebagai input dan mencetak jumlah halaman minimum dan maksimum yang mungkin bisa saya singkirkan. Setiap baris mewakili buku, setiap nomor mewakili halaman yang hilang dari buku.

Input contoh:

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

Contoh output:

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

4/5berarti, bahwa saya mungkin telah merobek 4 atau 5 halaman, tergantung pada sisi mana penomoran halaman buku dimulai. Seseorang bisa saja merobek halaman 6/7, halaman 8/9, halaman 100/101, dan halaman 222/223 (4 halaman). Atau, seseorang dapat merobek halaman 7/8, halaman 99/100, halaman 101/102, halaman 221/222, dan halaman 223/224 (5 halaman).

Ingat bahwa halaman buku selalu memiliki sisi depan dan belakang. Penomoran halaman juga berbeda dari buku ke buku. Beberapa buku bahkan memiliki nomor halaman di halaman kiri; beberapa di halaman kanan. Semua buku dibaca dari kiri ke kanan.

Kode terpendek dalam byte menang. Format I / O yang ketat tidak diperlukan. Program Anda harus dapat mengambil satu atau lebih buku sebagai masukan. Selamat bersenang-senang.

arminb
sumber
3
Apakah bisa diterima jika nilai output tidak dijamin akan diurutkan? (seperti 4/5dan 5/4)
Arnauld
Jangan lupa untuk memperbarui ke tantangan untuk menentukan bahwa urutan output harus konsisten, baik semua min/maxatau semua max/min. (Meskipun, secara pribadi, saya lebih suka itu tidak menjadi bagian dari spec!)
Shaggy
2
Apa yang menjadi alasan untuk programs must be able to take one or more books as inputmemerintah? Sebagian besar (jika tidak semua) hanya akan membungkus kode untuk memverifikasi satu buku menjadi satu lingkaran atau sesuatu. IMHO itu hanya menambah overhead untuk jawaban dengan sedikit atau tidak ada keuntungan dari tantangan. Pertanyaan-pertanyaan ini sudah mendapat banyak jawaban, jadi lebih baik tetap seperti ini, tetapi ingatlah ini untuk Anda di masa depan.
Rod
Kasus menyarankan test (courtesy of @Arnauld): 1,3,5,7,9,11,13,15,17,18- untuk kepentingan bahasa yang built-in sortmetode macam leksikografis secara default (dengan asumsi kebutuhan output konsisten diurutkan adalah ditambahkan ke spec).
Shaggy

Jawaban:

6

05AB1E , 13 byte

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

Cobalah online!

Terima kasih kepada Emigna untuk informasi perubahan spec.

Penjelasan

ε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.
Tuan Xcoder
sumber
Pengiriman yang bagus. Saya memperbarui tantangan dengan 2 jalur input / output ekstra. I / O yang ketat juga tidak diperlukan.
arminb
Btw, program Anda tidak menerima banyak buku sebagai input.
arminb
@Emigna Terima kasih atas bantuannya. Sunting jawaban saya sesuai dengan itu.
Tn. Xcoder
@arminb Ini harus diperbaiki sekarang.
Tn. 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]

Cobalah online!

tongkat
sumber
Program Anda tidak menerima beberapa input baris (banyak buku). Saya memperbarui tantangan dengan 2 jalur input / output ekstra. I / O yang ketat juga tidak diperlukan.
arminb
1
Bukankah beberapa input per run jatuh ke I / O yang ketat?
Rod
1
Orang bisa berdebat.
arminb
Cara Anda mengambil buku dan halamannya sebagai input dicakup oleh spesifikasi I / O. Persyaratan bahwa Anda tidak mengambil beberapa buku sebagai masukan adalah bagian dari tantangan spec.
Shaggy
4

JavaScript, 104 93 92 85 80 79 74 byte

Akan menjadi 57 byte jika bukan untuk persyaratan yang tidak perlu (menurut saya) bahwa setiap pasangan angka dalam output secara konsisten diurutkan, atau 47 byte jika kita hanya perlu mengambil satu buku sebagai input.

Input dan output keduanya array array.

a=>a.map(x=>[0,1].map(n=>new Set(x.map(y=>y+n>>1)).size).sort((x,y)=>x-y))
  • Awalnya terinspirasi oleh solusi Java Olivier dan solusi Japt saya sendiri (saat ini dihapus).
  • 2 byte disimpan berkat Arnauld (ditambah 3 lainnya yang kami temukan pada saat yang sama) dan 10 byte ditambahkan berkat dia melihat penyortiran yang rusak saya berharap tidak ada yang akan memperhatikan sementara persyaratan itu masih dalam diskusi!

Uji kasus

Kasing uji dibagi menjadi masing-masing buku untuk keterbacaan yang lebih baik dengan kasing terakhir (yang mencakup [1,2]kasing tepi) berfungsi untuk menggambarkan bahwa solusi ini mendukung banyak buku dalam 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>


Sejarah

Shaggy
sumber
Tidak ada tertulis bahwa output harus diurutkan dari min ke max. Pertanyaannya hanya mengatakan bahwa input akan diurutkan.
Olivier Grégoire
@ OlivierGrégoire; sementara benar bahwa pemilahan konsisten output saat ini tidak termasuk dalam spec, arminb telah berkomentar tentang beberapa solusi yang menyatakan bahwa itu adalah memang suatu kebutuhan. Saya sudah mengomentari tantangan memintanya untuk dimasukkan dan menyatakan preferensi saya terhadapnya - setelah semua, bagi saya, itu akan jatuh di bawah I / O yang ketat.
Shaggy
1
Saya pikir ini harus bekerja untuk 64 byte. Namun, metode pengurutan Anda saat ini tanpa panggilan balik apa pun cacat. Itu akan gagal misalnya [1,3,5,7,9,11,13,15,17,18].
Arnauld
Terima kasih, @Arnauld. Baru saja selesai menulis pembaruan untuk dipetakan alih- [0,.5]alih menggunakan gketika saya melihat komentar Anda. Tidak tahu mengapa saya memiliki mental block dengan operator bitwise! Saya berharap bahwa penyortiran output tidak menjadi persyaratan dan tidak ada yang akan melihat saya rusak sort()sementara itu;) Perlu menyelesaikan beberapa pekerjaan sehingga akan segera kembali untuk memperbarui.
Shaggy
@ Shaggy Apa tujuan asli y/2? Apa alasan membagi nomor halaman menjadi dua untuk algoritma ini?
MicFin
2

Retina 0.8.2 , 60 byte

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

Cobalah online! Penjelasan:

\d+
$*

Ubah nomor halaman menjadi unary.

.+
$&,/$&,

Gandakan daftar, menempatkan a /.

,(?=.*/)
1,

Tambahkan nomor halaman dalam satu salinan daftar.

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

Hitung jumlah halaman, tetapi nomor genap dan ganjil berturut-turut hanya dihitung sebagai satu halaman.

%O`1+

Urutkan hitungan ke dalam urutan.

1+
$.&

Konversi penghitungan kembali ke desimal.

Neil
sumber
Pengiriman yang bagus! Saya memperbarui tantangan dengan 2 jalur input / output ekstra. I / O yang ketat juga tidak diperlukan. Tampaknya program Anda adalah satu-satunya sekarang yang lulus semua kasus uji.
arminb
Tidak ,(?=.*/)¶1,bisa seperti itu ,.*/¶1$&?
Ven
@Ven Tidak, itu hanya akan menambah satu nomor, tapi saya harus menambah semuanya.
Neil
Ok, dan menggunakan tumpang tindih membawanya kembali ke jumlah byte yang sama, begitu adil
Ven
2

Haskell , 62 byte

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

Cobalah online!

Roman Czyborra
sumber
1
Saya tidak berpikir ini secara teknis valid, karena pertanyaannya memerlukan program lengkap ( Your goal is to write a program, which takes a sorted, comma-delimmited list of numbers as input )
Feburous
@Ourous itu benar. Saya juga memperbarui tantangan dengan 2 jalur input / output ekstra. I / O yang ketat juga tidak diperlukan.
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()};}}

Cobalah online!

Penjelasan

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

Catatan: karena tidak ada persyaratan tentang itu, jumlah halaman minimum dan maksimum tidak dipesan.

Olivier Grégoire
sumber
Bisakah Anda terhubung sizedengan adddi Jawa untuk menyimpan beberapa byte? misalnya s.add(p/2).size,.
Shaggy
1
@Shaggy Tidak. Saya bisa mengaitkan hal-hal dengan stream, tapi itu akan menambahkan <s> beberapa </s> banyak byte, tidak menyimpan ;-)
Olivier Grégoire
2

APL (Dyalog Unicode) , 37 byte

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

Cobalah online!

Ini dapat dilakukan untuk kurang dari setengah jumlah byte jika urutan output halaman tidak masalah:

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

Bagaimana?

{(≢⍵)≤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.
J. Sallé
sumber
21 byte
dzaima
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"

Cobalah online!

Xcali
sumber
Ada beberapa kasus yang tidak dijalankan dengan baik oleh program Anda. Saya memperbarui tantangan dengan 2 jalur input / output ekstra. I / O yang ketat juga tidak diperlukan.
arminb
Saya tidak melihat di mana kasus uji Anda gagal. Satu-satunya hal yang tidak berfungsi adalah banyak kasus, yang Anda tambahkan lama setelah saya memposting solusi saya. Bagaimanapun, saya telah memperbarui solusi untuk menangani beberapa tes.
Xcali
2

Bahasa Wolfram (Mathematica) , 37 byte

Terima kasih @MartinEnder selama 8 byte!

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

Cobalah online!

Penjelasan

Di: {3, 4, 5}

{#,#+1}

Ambil (input) dan (input +1). {{3, 4, 5}, {4, 5, 6}}

... ~Floor~2

Untuk setiap angka dari atas, ambil angka genap terbesar dikurangi. {{2, 4, 4}, {4, 4, 6}}

Length@*Split/@

Untuk setiap daftar dari atas, bagi daftar dengan elemen yang sama {{{2}, {4, 4}}, {{4, 4}, {6}}}

dan ambil masing-masing panjang: {2, 2}

Sort[ ... ]

Sortir hasilnya.

JungHwan Min
sumber
1
Anda tidak perlu SplitBy: Length@Split@⌊#/2⌋&/@{#,#+1}&bekerja. Tapi kemudian itu bahkan lebih pendek untuk melakukan lantai sebelum peta: Length@*Split/@⌊{#,#+1}/2⌋&. Dan jika Anda suka, Anda bisa mendapatkan jumlah byte yang sama tanpa Unicode:Length@*Split/@{#,#+1}~Floor~2&
Martin Ender
Eh, saya pikir tantangannya membutuhkan format I / O yang ketat.
Erik the Outgolfer
1

Bersih , 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]

Cobalah online!

Persyaratan program penuh benar-benar membunuh kemampuan Clean untuk bersaing.

Bagi mereka yang telah memperhatikan jawaban saya di Bersihkan, Anda akan melihat import qualified, yang merupakan peretasan jelek untuk berkeliling menggunakan modul yang tidak boleh digunakan bersama-sama, bersama-sama - yang hanya diperlukan di sini karena peretasan jelek lain untuk dilakukan dengan GenLibbergantung pada Data.Maybealih-alih StdMaybe, yang merupakan hasil dari peretasan jelek lainnya di perpustakaan yang diterjemahkan dari Haskell'sData untuk mendapatkan fungsionalitas sebelum perpustakaan Clean sendiri sama-sama lengkap.

Mengambil input melalui argumen baris perintah.

Suram
sumber
Pengiriman yang bagus. Saya memperbarui tantangan dengan 2 jalur input / output ekstra. I / O yang ketat juga tidak diperlukan.
arminb
@arminb Terima kasih! Saya akan dapat mempersingkat banyak besok dalam hal itu.
Kamis
@arminb Saya sudah memperbaruinya jadi itu harus valid dengan kasus-kasus baru. Jika I / O yang saya gunakan tidak dapat diterima, saya akan merevisinya lagi di pagi hari.
Kamis
0

Perl, 40 byte

Termasuk +1untuka

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

Output tidak dipesan.

Diasumsikan nomor halaman positif (terutama tanpa halaman) 0 ). Anggap halaman yang hilang hanya disebutkan satu kali. Tidak peduli apakah inputnya dipesan atau tidak.

Memproses hanya satu buku per jalan menghemat 3byte untuk 37:

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