いくつのページを削除しましたか?


34

先月、私は図書館からたくさんの本を借りました。それらはすべて、感情と陰謀を満載した良い本でした。残念ながら、ある時点で私は非常に怒り/悲しみ/失望したので、いくつかのページを引き裂きました。

今、図書館は私が各本で何ページを切り取ったかを知りたがっている。

あなたの目標は、ソートされたコンマ区切りの数字のリストを入力として取り、取り除いた可能性のある最小および最大のページ数を出力するプログラムを書くことです。各行は本を表し、各番号は本の欠落ページを表します。

入力例:

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

出力例:

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

4/5つまり、本のページ番号がどちら側から始まるかに応じて、4ページまたは5ページを切り取った可能性があります。6/7ページ、8/9ページ、100/101ページ、222/223ページ(4ページ)を切り捨てた可能性があります。あるいは、ページ7/8、ページ99/100、ページ101/102、ページ221/222、およびページ223/224(5ページ)を切り取ることができます。

本のページには常に表面と裏面があることに注意してください。また、ページ番号は本ごとに異なります。一部の書籍では、左側のページに偶数のページ番号があります。一部は右側のページにあります。すべての本は左から右に読みます。

バイト単位の最短コードが勝ちます。厳密なI / O形式は必要ありません。プログラムは、入力として1つ以上の本を取得できる必要があります。楽しむ。


3
出力値の並べ替えが保証されていない場合は受け入れられますか?(4/5andなど5/4
アーナルド

チャレンジに更新して、出力順序がall min/maxまたはallのいずれかで一貫している必要があることを指定することを忘れないでくださいmax/min。(個人的には、仕様に含まれない方がいいと思います!)
シャギー

2
programs must be able to take one or more books as input支配する理由は何でしょうか?ほとんどの(すべてではないにしても)コードをラップして、単一の本をループまたは何かに検証します。私見では、チャレンジにほとんど利益を得ることなく、答えにオーバーヘッドを追加するだけです。この質問にはすでに多くの回答がありました。そのため、これをそのままにしておくことをお勧めしますが、今後の課題に留意してください。
ロッド

推奨されるテストケース(@Arnauld提供):1,3,5,7,9,11,13,15,17,18-組み込みsortメソッドがデフォルトで辞書式にソートされる言語のために(一貫してソートされた出力の要件が仕様に追加されている仮定)。
シャギー

回答:


6

05AB1E、13バイト

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

オンラインでお試しください!

仕様の変更に関するヘッズアップについてエミニャに感謝します。

説明

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

いいね。2つの追加の入力/出力行でチャレンジを更新しました。また、厳密なI / Oは必要ありません。
arminb

ところで、あなたのプログラムは入力として複数の本を取りません。
arminb

@Emignaヘッズアップをありがとう。それに応じて私の答えを編集しました。
ミスターXcoder

@arminb今修正する必要があります。
Mr Xcoder

4

パイソン272の 56 68 67バイト

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

オンラインでお試しください!


プログラムは、複数の行入力(複数の書籍)を受け入れません。チャレンジを2つの追加の入力/出力行で更新しました。また、厳密なI / Oは必要ありません。
-arminb

1
実行ごとに複数の入力が厳密なI / Oに該当しませんか?
ロッド

1
議論することができます。
arminb

入力としての本とそのページの取りは、I / O仕様でカバーされています。あなたがいることを要件入力がチャレンジ仕様の一部であるように、複数本を取ります。
シャギー

4

JavaScript、104 93 92 85 80 79 74バイト

だろう57のバイト出力の番号の各ペアが一貫ソートすることでない場合(私の意見では)不必要な要件について、または47バイト我々は唯一の入力として一冊の本を取るために必要な場合。

入力と出力は両方とも配列の配列です。

a=>a.map(x=>[0,1].map(n=>new Set(x.map(y=>y+n>>1)).size).sort((x,y)=>x-y))
  • 最初はOlivierのJavaソリューションと私自身の(現在削除されている)Japtソリューションに触発されました。
  • Arnauldのおかげで2バイトが節約され(さらに同時に2人が同時に見つけた)、壊れた並べ替えを見つけた彼のおかげで10バイトが追加されました。

テストケース

最後のケース([1,2]エッジケースを含む)は読みやすさのためにテストケースを個々のブックに分割し、このソリューションが入力で複数のブックをサポートすることを示しています。

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>


歴史


出力をminからmaxにソートする必要があることはどこにも書かれていません。質問は、入力がソートされることだけを言っています。
オリビエグレゴワール

@OlivierGrégoire; 現在、出力の一貫した並べ替えが仕様に含まれていないこと事実ですが、arminbは、それ実際に要件であることを示すいくつかのソリューションについてコメントしています。私はすでに、チャレンジを含めることを要求し、それに対する私の好みを述べてコメントしています-結局のところ、それは厳密なI / Oに該当します。
シャギー

1
私が思うに、これは動作するはず 64バイトのために。ただし、コールバックのない現在のソート方法には欠陥があります。たとえば、失敗し[1,3,5,7,9,11,13,15,17,18]ます。
アーナルド

ありがとう、@ Arnauld。あなたのコメントを見つけたときに[0,.5]使用する代わりに、マップするための更新プログラムの書き込みを終了しましたg。なぜ私はビット単位の演算子でこのような精神的なブロックを持っているのか分かりません!出力の並べ替えが要件にならずsort()、その間に誰も私の破損に気付かないことを望んでいました;)作業を完了する必要があるため、しばらくして更新する必要があります。
シャギー

@Shaggy元の意図はy/2何ですか?このアルゴリズムのページ番号を半分に分割する理由は何ですか?
MicFin

2

Retina 0.8.2、60バイト

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

オンラインでお試しください!説明:

\d+
$*

ページ番号を単項に変換します。

.+
$&,/$&,

を挿入してリストを複製します/

,(?=.*/)
1,

リストの1つのコピーでページ番号を増やします。

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

ページ数をカウントしますが、連続する偶数と奇数は1ページとしてカウントされます。

%O`1+

カウントを順番に並べ替えます。

1+
$.&

カウントを10進数に変換します。


素敵な投稿!2つの追加の入力/出力行でチャレンジを更新しました。また、厳密なI / Oは必要ありません。現在、すべてのテストケースに合格したプログラムはプログラムだけであるようです。
-arminb

代わり,(?=.*/)¶1,に何かできません,.*/¶1$&か?
ヴェン

@Venいいえ、それは1つの数値だけを増分しますが、すべてを増分する必要があります。
ニール

[OK]を、重複を使用すると、同じバイト数に戻ってそう公正途切れるそれを取る
ヴェン

2

Haskell、62バイト

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

オンラインでお試しください!


1
質問には完全なプログラム(Your goal is to write a program, which takes a sorted, comma-delimmited list of numbers as input
18

@Ourousそうです。また、チャレンジを2つの追加の入力/出力行で更新しました。また、厳密なI / Oは必要ありません。
-arminb

2

Java(OpenJDK 9)、163バイト

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

オンラインでお試しください!

説明

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

注:これに関する要件はないため、ページの最小数と最大数は順序付けられていません。


Javaでチェーンsizeしてadd、おそらく数バイト節約できますか?例えば、s.add(p/2).size
シャギー

1
@Shaggyいいえ。ストリームで何かをつなげることができますが、それは多くのバイトを追加し保存しませ ;-)
OlivierGrégoire18年

2

APL(Dyalog Unicode)、37バイト

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

オンラインでお試しください!

これは、ページの出力順序が重要でない場合、バイトカウントの半分未満で実行できます。

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

どうやって?

{(≢⍵)≤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バイト

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

オンラインでお試しください!


プログラムが正しく実行されない場合があります。2つの追加の入力/出力行でチャレンジを更新しました。また、厳密なI / Oは必要ありません。
arminb

あなたのテストケースがどこで失敗しているかわかりません。動作しない唯一のことは複数のケースであり、私がソリューションを投稿してからずっと後に追加しました。いずれにせよ、複数のテストを処理するためにソリューションを更新しました。
Xcali

2

Wolfram言語(Mathematica)、37バイト

8バイトありがとう@MartinEnder!

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

オンラインでお試しください!

説明

に: {3, 4, 5}

{#,#+1}

(入力)と(入力+ 1)を取ります。 {{3, 4, 5}, {4, 5, 6}}

... ~Floor~2

上記の各数値について、それより小さい最大の偶数を取ります。 {{2, 4, 4}, {4, 4, 6}}

Length@*Split/@

上記の各リストについて、同じ要素でリストを分割します {{{2}, {4, 4}}, {{4, 4}, {6}}}

そしてそれぞれの長さを取ります: {2, 2}

Sort[ ... ]

出力をソートします。


1
必要ありませんSplitByLength@Split@⌊#/2⌋&/@{#,#+1}&動作します。ただし、マップの前にフローリングを行う方がさらに短くなりますLength@*Split/@⌊{#,#+1}/2⌋&。あなたが好きなら、あなたは、Unicodeせずに同じバイト数を取得することができます:Length@*Split/@{#,#+1}~Floor~2&
マーティン・エンダー

ええと、この課題には厳密なI / O形式が必要だと思います。
エリックアウトゴルファー

1

クリーン222の 210 204 196バイト

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]

オンラインでお試しください!

フルプログラム要件は、Cleanの競争力を完全に殺します。

Cleanでの私の答えに注意を払っている人にとってはimport qualified、一緒に使用すべきではないモジュールを一緒に使用して回避するためのugいハックであることに気付くでしょう。の代わりににGenLib依存しData.MaybeますStdMaybe。これは、Haskellから翻訳されたライブラリのさらに別ハックの結果でありDataClean自身のライブラリが同様に完成する前に機能を取得します。

コマンドライン引数を介して入力を受け取ります。


いいね。2つの追加の入力/出力行でチャレンジを更新しました。また、厳密なI / Oは必要ありません。
-arminb

@arminbありがとう!その場合、明日はかなり短くすることができます。
18

@arminb新しいケースで有効になるように更新しました。使用したI / Oが受け入れられない場合は、午前中に再度修正します。
Οurous

0

Perl、40バイト

Inludes +1a

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

出力は順序付けされていません。

正のページ番号(特にpageなし0)を想定しています。欠落しているページは一度しか言及されていないと仮定します。入力が順序付けられているかどうかは気にしません。

実行ごとに1冊の本のみを処理すると337次のバイト数が節約されます。

perl -aE 'say/$/*grep$z{$_*$`|1}^=1,@F for-1,1' <<< "7 8 100 101 222 223"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.