찢어진 페이지 수는 몇 개입니까? 예 : 7,8,100,101,222,223 2,3,88,89,90,103,177 2,3,6,7,10,11 1 1,2 출력 예

지난 달 나는 도서관에서 많은 책을 빌렸다. 그들은 모두 좋은 책이었고 감정과 음모를 꾸 ists 다. 불행히도, 어떤 시점에서 나는 매우 화나고 / 슬픈 / 실망했다. 그래서 나는 약간의 페이지를 찢었다.

이제 도서관은 각 책마다 찢어진 페이지 수를 알고 싶어합니다.

당신의 목표는 입력으로 쉼표로 구분 된 정렬 된 숫자 목록을 가져 와서 내가 찢을 수있는 최소 및 최대 페이지 수를 인쇄하는 프로그램을 작성하는 것입니다. 각 줄은 책을 나타내고 각 숫자는 책에서 누락 된 페이지를 나타냅니다.

입력 예 :

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 형식이 필요 하지 않습니다. 귀하의 프로그램은 하나 이상의 책을 입력 할 수 있어야합니다. 즐기세요



답변

05AB1E , 13 바이트

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

온라인으로 사용해보십시오!

사양 변경에 대한 헤드 업을위한 Emigna 에게 감사합니다 .

설명

ε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 , 72 56 68 67 바이트

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

온라인으로 사용해보십시오!


답변

자바 스크립트, 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 바이트가 절약되었으며 (또한 3 개가 동시에 발견되었습니다.) 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>

역사

//104
a=>a.map(x=>x.map(y=>b.add(y/2|0)&c.add(++y/2|0),b=new Set,c=new Set)&&[b.size,c.size].sort((x,y)=>x-y)))
// 93
a=>a.map(x=>[new Set(x.map(y=>y/2|0)).size,new Set(x.map(y=>++y/2|0)).size].sort((x,y)=>x-y)))
// 92
a=>a.map(x=>[(g=z=>new Set(z).size)(x.map(y=>y/2|0)),g(x.map(y=>++y/2|0))].sort((x,y)=>x-y))
// 85
a=>a.map(x=>[(g=h=>new Set(x.map(h)).size)(y=>y/2|0),g(y=>++y/2|0)].sort((x,y)=>x-y))
// 80
a=>a.map(x=>[(g=n=>new Set(x.map(y=>(y+n)/2|0)).size)(0),g(1)].sort((x,y)=>x-y))
// 79
a=>a.map(x=>[(g=n=>new Set(x.map(y=>y/2+n|0)).size)(0),g(.5)].sort((x,y)=>x-y))
// 76
a=>a.map(x=>[0,.5].map(n=>new Set(x.map(y=>y/2+n|0)).size).sort((x,y)=>x-y))

답변

레티 나 0.8.2 , 60 바이트

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

온라인으로 사용해보십시오! 설명:

\d+
$*

페이지 번호를 단항으로 변환하십시오.

.+
$&,/$&,

a를 삽입하여 목록을 복제하십시오 /.

,(?=.*/)
1,

목록의 한 사본에서 페이지 번호를 증가시킵니다.

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

페이지 수를 세지 만 연속 짝수 및 홀수는 한 페이지로만 계산합니다.

%O`1+

카운트를 순서대로 정렬하십시오.

1+
$.&

카운트를 다시 십진수로 변환합니다.


답변

하스켈 , 62 바이트

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

온라인으로 사용해보십시오!


답변

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

참고 : 이에 대한 요구 사항이 없으므로 최소 및 최대 페이지 수가 주문되지 않습니다.


답변

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.