Kaç sayfa çıkardım?


34

Geçen ay kütüphaneden bir sürü kitap ödünç aldım. Hepsi de duygularla ve arsa twistleriyle dolu iyi kitaplardı. Ne yazık ki, bazı noktalarda çok kızmış / üzgün / hayal kırıklığına uğradım, bu yüzden bazı sayfaları çıkarttım.

Şimdi kütüphane, her kitap için kaç sayfa çıkardığımı bilmek istiyor.

Amacınız, giriş olarak sıralanan, virgülle ayrılmış bir numara listesi alan ve çıkarabildiğim minimum ve maksimum sayfa sayısını yazdıran bir program yazmaktır. Her satır bir kitabı temsil eder, her sayı kitaptan eksik bir sayfayı gösterir.

Örnek giriş:

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

Örnek çıktı:

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

4/5bu, kitabın sayfa numaralandırmasının hangi tarafa başladığına bağlı olarak 4 veya 5 sayfa dağıttığım anlamına gelir. Biri sayfa 6/7, sayfa 8/9, sayfa 100/101 ve sayfa 222/223'ü (4 sayfa) parçalamış olabilir. Alternatif olarak, sayfa 7/8, sayfa 99/100, sayfa 101/102, sayfa 221/222 ve sayfa 223/224 (5 sayfa) yırtılmış olabilir.

Bir kitap sayfasının her zaman bir ön ve arka yüzü olduğunu unutmayın. Ayrıca sayfa numaralandırması kitaptan kitaba farklılık gösterir. Bazı kitapların sol sayfada bile sayfa numaraları var; bazıları sağ sayfada. Tüm kitaplar soldan sağa okunur.

Bayt cinsinden en kısa kod kazanır. Sıkı G / Ç formatı gerekli değildir . Programlarınız giriş olarak bir veya daha fazla kitap alabilmelidir. İyi eğlenceler.


3
Çıkış değerlerinin sıralanmasının garanti edilmemesi kabul edilebilir mi? (gibi 4/5ve 5/4)
Arnauld

Çıktı sırasının ya hep min/maxya da tamamı tutarlı olması gerektiğini belirten zorlukları güncellemeyi unutmayın max/min. (Her ne kadar kişisel olarak, bu özelliğin bir parçası olmamasını tercih ederim!)
Shaggy

2
Yönetme nedeni ne olurdu programs must be able to take one or more books as input? Çoğu (hepsi değilse), tek bir kitabı bir döngüye veya başka bir şeye doğrulamak için kodu saracaktır. IMHO, sadece zorlukla hiçbir kazanç elde edip etmeyecekleri cevabına bir ek yük ekler. Bu soruların zaten çok fazla cevabı var, bu yüzden bunu olduğu gibi tutmak daha iyi, ama bunu gelecekteki zorluklar için aklınızda bulundurun.
Rod,

Önerilen test durumu (@Arnauld nezaket): 1,3,5,7,9,11,13,15,17,18- yerleşik dil yararına sortyöntem türlü sözlük sırasında varsayılan olarak (sürekli sıralanmış çıktı gereksinimi varsayarak olan spec eklendi).
Shaggy

Yanıtlar:


6

05AB1E , 13 bayt

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

Çevrimiçi deneyin!

Spesifik değişikliklerle ilgili olarak kafaları için Emigna sayesinde .

açıklama

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

Güzel sunum. Bu sorunu 2 ekstra giriş / çıkış satırıyla güncelledim. Ayrıca katı G / Ç gerekli değildir.
arminb

Ancak, programınız girdi olarak birden fazla kitap almıyor.
arminb

@Emigna Heads-up için teşekkürler. Cevabımı buna göre düzenledi.
Bay Xcoder

@arminb Şimdi düzeltilmesi gerekiyor.
Bay Xcoder

4

Python 2 , 72 56 68 67 bayt

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

Çevrimiçi deneyin!


Programınız çoklu satır girişlerini kabul etmiyor (çoklu kitap). Bu sorunu 2 ekstra giriş / çıkış satırıyla güncelledim. Ayrıca katı G / Ç gerekli değildir.
arminb

1
Çalışma başına çoklu girişler katı G / Ç'ye girmez mi?
Rod,

1
Biri tartışabilir.
arminb

Kitapları ve sayfalarını girdi olarak nasıl aldığınız, G / Ç şartnamesi kapsamındadır. Yapmanız gereken şart giriş meydan spec parçası olarak birden fazla kitap almak.
Shaggy,

4

JavaScript, 104 93 92 85 80 79 74 bayt

Gereksizce (bence) çıktıdaki her bir sayı çiftinin tutarlı bir şekilde sıralanmasını gerektirmiyorsa 57 bayt olur, veya 47 bayt biz sadece girdi olarak bir kitap almak gerekirse.

Giriş ve çıkış hem bir dizi dizisidir.

a=>a.map(x=>[0,1].map(n=>new Set(x.map(y=>y+n>>1)).size).sort((x,y)=>x-y))
  • Başlangıçta ilham alan Olivier'in Java çözümünden ve kendi (şu anda silinmiş) Japt çözümümden ilham aldım.
  • Arnauld sayesinde 2 bayt kaydedildi (artı aynı anda tespit ettiğimiz 3 tane daha) ve 10 bayt da , bu gereksinim hala tartışılırken kimsenin fark etmeyeceğini umduğum kırılmış sıralamayı bulduğu için ekledi !

Test durumları

Test senaryoları [1,2], bu çözümün girdideki birden fazla kitabı desteklediğini göstermeye yarayan son vaka ile (daha fazla vaka içeren ) daha iyi okunabilmesi için ayrı kitaplara bölünmüştür .

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>


Tarihçe


Hiçbir yerde, çıktının min.-maks. Soru sadece girişin sıralanacağını söylüyor.
Olivier Grégoire

@ OlivierGrégoire; Çıktının tutarlı bir şekilde sıralanmasının şu anda spesifikasyonda yer almadığı doğru olsa da, arminb , gerçekten bir gereklilik olduğunu belirten bir kaç çözüm hakkında yorumda bulundu . Zaten dahil edilmesini istediğim ve buna karşı olan tercihimi belirttiğim konusundaki zorluğa zaten değinmiştim - sonuçta, bana göre bu katı bir G / Ç'ye düşecektir.
Shaggy

1
Bunun 64 bayt için çalışması gerektiğini düşünüyorum . Bununla birlikte, herhangi bir geri arama olmadan geçerli sıralama yönteminiz hatalı. Örneğin başarısız olur [1,3,5,7,9,11,13,15,17,18].
Arnauld,

@Arnauld, teşekkürler. Yorumunuzu gördüğümde [0,.5]kullanmak yerine harita üzerinde bir güncelleme yazmayı yeni bitmişti g. Neden bitsel operatörleri ile böyle bir zihinsel blok var bilmiyorum! Çıktı sıralamasının bir zorunluluk haline gelmeyeceğini ve hiç kimsenin bu sort()sırada kırıldığımı fark etmeyeceğini umuyordum ;) Bazı işleri bitirmeye ihtiyacım vardı, bu yüzden güncellemek için birazdan döneceğim.
Shaggy,

@Shaggy Orijinal amacı nedir y/2? Bu algoritma için sayfa numarasını ikiye bölmenin nedeni nedir?
MicFin

2

Retina 0.8.2 , 60 bayt

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

Çevrimiçi deneyin! Açıklama:

\d+
$*

Sayfa numaralarını unary'ye dönüştürün.

.+
$&,/$&,

Bir araya getirerek listeyi çoğaltın /.

,(?=.*/)
1,

Sayfa numaralarını listenin bir kopyasında artırın.

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

Sayfa sayısını sayın, ancak ardışık eşit ve tek sayılar yalnızca bir sayfa olarak sayılır.

%O`1+

Sayıları sıraya göre sıralayın.

1+
$.&

Sayıları tekrar ondalık sayıya dönüştürün.


Güzel sunum! Bu sorunu 2 ekstra giriş / çıkış satırıyla güncelledim. Ayrıca katı G / Ç gerekli değildir. Görünüşe göre programınız tüm sınav durumlarını geçen tek program.
arminb

Bunun ,(?=.*/)¶1,gibi bir şey olamaz ,.*/¶1$&mı?
Ven

@ Yok Hayır, bu sadece bir sayı artacaktır, ancak hepsini arttırmam gerekiyor.
Neil

Tamam, ve üst üste binmeyi kullanmak aynı bayt sayısına geri götürür, bu yüzden adil değil
Ven

2

Haskell , 62 bayt

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

Çevrimiçi deneyin!


1
Sorusu tam programı gerektirdiğinden bu, teknik olarak geçerli olduğunu sanmıyorum ( Your goal is to write a program, which takes a sorted, comma-delimmited list of numbers as input )
Οurous

@Ourous bu doğru. Ayrıca 2 ekstra giriş / çıkış hattı ile mücadeleyi güncelledim. Ayrıca katı G / Ç gerekli değildir.
arminb

2

Java (OpenJDK 9) , 163 bayt

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

Çevrimiçi deneyin!

açıklamalar

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

Not: Bu konuda bir gereklilik olmadığı için, minimum ve maksimum sayfa sayısı sipariş edilmez.


Eğer zincir Can sizeile addbelki birkaç bayt kaydetmek için Java? ör s.add(p/2).size.
Shaggy,

1
@Shaggy Hayır. Akışları olan şeyleri zincirleyebildim, ancak bu <s> birkaç </s> bayt ekler , kaydetmez ;-)
Olivier Grégoire

2

APL (Dyalog Unicode) , 37 bayt

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

Çevrimiçi deneyin!

Bu, sayfaların çıktı sırası önemli değilse, bayt sayısının yarısından daha azına yapılabilir:

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

Nasıl?

{(≢⍵)≤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 bayt

@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"

Çevrimiçi deneyin!


Programınızın düzgün çalışmaması durumunda bazı durumlar vardır. Bu sorunu 2 ekstra giriş / çıkış satırıyla güncelledim. Ayrıca katı G / Ç gerekli değildir.
arminb

Test vakalarından herhangi birinin nerede başarısız olduğunu anlamıyorum. İşe yaramayan tek şey, çözümümü yayınladıktan çok sonra eklemiş olduğunuz birden fazla vaka. Her durumda, birden fazla sınama işlemek için çözümü güncelleştirdim.
Xcali

2

Wolfram Dili (Mathematica) , 37 bayt

8 byte için @ Martininder teşekkürler!

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

Çevrimiçi deneyin!

açıklama

İçinde: {3, 4, 5}

{#,#+1}

(Giriş) ve (giriş + 1) al. {{3, 4, 5}, {4, 5, 6}}

... ~Floor~2

Yukarıdan gelen her numara için, en küçük olanı daha az alın. {{2, 4, 4}, {4, 4, 6}}

Length@*Split/@

Yukarıdaki her liste için listeyi aynı elemanlara bölün. {{{2}, {4, 4}}, {{4, 4}, {6}}}

ve her birinin uzunluğunu alın: {2, 2}

Sort[ ... ]

Çıktıyı sırala.


1
İhtiyacın yok SplitBy: Length@Split@⌊#/2⌋&/@{#,#+1}&çalışıyor. Fakat haritadan önce döşemeyi yapmak daha da kısa Length@*Split/@⌊{#,#+1}/2⌋&. Ve eğer istersen, aynı bayt sayısını Unicode olmadan da alabilirsin:Length@*Split/@{#,#+1}~Floor~2&
Martin Ender

Uh, zorluğun katı bir G / Ç formatı gerektirdiğini düşünüyorum.
Outgolfer Erik,

1

Temiz , 222 210 204 196 bayt

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]

Çevrimiçi deneyin!

Tam program gereksinimleri kesinlikle Clean'in rekabet edebilme yeteneğini öldürüyor.

Temiz'teki cevaplarıma dikkat edenler için import qualified, birlikte kullanılmaması gereken modülleri kullanmak için çirkin bir hack olduğunu fark edeceksiniz , birlikte - başka bir çirkin hack nedeniyle burada gerekli olan ile GenLibilgili olarak Data.Maybeyerine StdMaybesonucu olan, henüz başka Haskell çevrilmiş kütüphanelerde çirkin kesmek Dataclean kendi kütüphaneleri eşit tamamlandıktan önce işlevselliği elde etmek.

Komut satırı argümanları ile girdi alır.


Güzel sunum. Bu sorunu 2 ekstra giriş / çıkış satırıyla güncelledim. Ayrıca katı G / Ç gerekli değildir.
arminb

@arminb Teşekkürler! Bu durumda yarın onu çok kısaltabilirim.
1urous

@arminb Yeni vakalarda geçerli olması için güncelledim. Kullandığım G / Ç kabul edilebilir değilse, sabah tekrar gözden geçireceğim.
Euro

0

Perl, 40 bayt

inludes +1içina

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

Çıktı sipariş edilmedi.

Olumlu sayfa numaraları varsayar (özellikle sayfa yok 0). Eksik sayfaların yalnızca bir kez belirtildiğini varsayar. Girişin sipariş edilip edilmemesi önemli değil.

Her çalıştırmada yalnızca bir kitap işlemek, 3bayttan tasarruf sağlar 37:

perl -aE 'say/$/*grep$z{$_*$`|1}^=1,@F for-1,1' <<< "7 8 100 101 222 223"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.