찢어진 페이지 수는 몇 개입니까?


34

지난 달 나는 도서관에서 많은 책을 빌렸다. 그들은 모두 좋은 책이었고 감정과 음모를 꾸 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 형식이 필요 하지 않습니다. 귀하의 프로그램은 하나 이상의 책을 입력 할 수 있어야합니다. 즐기세요


3
출력 값이 정렬되지 않을 수 있습니까? (예컨대 4/55/4)
Arnauld

출력 순서가 모두 min/max또는 모두 일관되도록 지정하기 위해 문제를 업데이트하는 것을 잊지 마십시오 max/min. (개인적으로는 사양의 일부가 아닌 것을 선호합니다!)
Shaggy

2
programs must be able to take one or more books as input지배 해야 할 이유는 무엇입니까 ? 대부분의 경우 (모두는 아님) 단일 책을 루프 등으로 확인하기 위해 코드를 래핑합니다. IMHO는 도전에 거의 이익을 얻지 않고 답변에 오버 헤드를 추가합니다. 이 질문은 이미 많은 답변을 얻었으므로 그대로 유지하는 것이 좋습니다. 그러나 앞으로의 문제에 대해서는이 점을 명심하십시오.
로드

제안 된 테스트 케이스 (@Arnauld의 제공) : 1,3,5,7,9,11,13,15,17,18- 내장 언어의 이익을 위해 sort방법의 종류 전적으로 기본적으로 (지속적으로 정렬 된 출력의 요구 사항을 가정 한다 스펙에 추가).
얽히고 설킨

답변:


6

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 개로 챌린지를 업데이트했습니다. 또한 엄격한 I / O가 필요하지 않습니다.
arminb

Btw, 프로그램은 여러 책을 입력으로 사용하지 않습니다.
arminb

@Emigna 감사합니다. 이에 따라 내 대답을 편집했습니다.
Mr. Xcoder

@arminb 지금 수정해야합니다.
Mr. Xcoder

4

파이썬 2 , 72 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에 속하지 않습니까?
Rod

1
하나는 논쟁 할 수 있습니다.
arminb

책과 해당 페이지를 입력으로 가져 오는 방법 은 I / O 사양에서 다룹니다. 당신이하는 요구 사항 않는 입력 도전 사양의 일부로서 여러 권의 책을 가지고.
얽히고 설킨

4

자바 스크립트, 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>


역사


출력이 최소에서 최대로 정렬되어야한다는 기록은 어디에도 없습니다. 질문은 입력이 정렬 될 것이라고 말합니다.
Olivier Grégoire

@ OlivierGrégoire; 출력의 일관된 정렬이 현재 사양에 포함되어 있지 않다는 것이 사실이지만, arminb 실제로 요구 사항 임을 나타내는 몇 가지 솔루션에 대해 언급했습니다 . 나는 도전이 포함되도록 요구하고 그것에 대한 나의 선호도를 언급하는 도전에 대해 이미 언급했다 . 결국 그것은 나에게 엄격한 I / O에 해당된다.
얽히고 설킨

1
64 바이트에서 작동해야 한다고 생각 합니다. 그러나 콜백이없는 현재 정렬 방법에 결함이 있습니다. 예를 들어 실패합니다 [1,3,5,7,9,11,13,15,17,18].
Arnauld

감사합니다, @Arnauld. 귀하의 의견을 발견했을 때 [0,.5]사용 하는 대신 매핑 업데이트를 작성했습니다 g. 비트 연산자가 왜 그런 정신적 인 블록을 가지고 있는지 모르겠다! 출력 정렬이 요구 사항이 아니며 sort()그 동안 아무도 내 부서짐을 느끼지 않기를 바랐습니다 .) 어떤 작업을 수행해야하므로 업데이트하기 위해 다시 돌아올 것입니다.
얽히고 설킨

@Shaggy 원래 의도는 y/2무엇입니까? 이 알고리즘에 대해 페이지 번호를 반으로 나눈 이유는 무엇입니까?
MicFin

2

레티 나 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+
$.&

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


좋은 제출! 추가 입력 / 출력 라인 2 개로 챌린지를 업데이트했습니다. 또한 엄격한 I / O가 필요하지 않습니다. 지금까지는 모든 테스트 사례를 통과 한 유일한 프로그램 인 것 같습니다.
arminb

대신에 ,(?=.*/)¶1,뭔가가 될 수 없습니까 ,.*/¶1$&?
Ven

@Ven 아니요, 하나의 숫자 만 증가시킬 것이지만 모두 증가시켜야합니다.
Neil

겹치기를 사용하면 동일한 바이트 수로 되돌아갑니다. 따라서 공정한 Nuff
Ven

2

하스켈 , 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 )이 필요하기 때문에 이것이 기술적으로 타당하지 않다고 생각합니다
Οurous

@Ourous 맞아. 또한 2 개의 추가 입력 / 출력 라인으로 문제를 업데이트했습니다. 또한 엄격한 I / O가 필요하지 않습니다.
arminb

2

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

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


당신은 체인 수 sizeadd어쩌면 몇 바이트를 저장에 자바? 예를 들어, s.add(p/2).size.
얽히고 설킨

1
@Shaggy 아뇨 스트림 체인 물건을 할 수 있지만,이 것이 추가 하지, 바이트의 <의> 몇 </ S>을 많이 저장 ;-)
올리비에 그레 구 아르

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 Language (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
당신은 필요하지 않습니다 SplitBy: Length@Split@⌊#/2⌋&/@{#,#+1}&작동합니다. 그러나지도 전에 바닥을 만드는 것이 훨씬 짧습니다 Length@*Split/@⌊{#,#+1}/2⌋&. 원하는 경우 유니 코드없이 동일한 바이트 수를 얻을 수 있습니다.Length@*Split/@{#,#+1}~Floor~2&
Martin Ender

어, 도전에는 엄격한 I / O 형식이 필요하다고 생각합니다.
Erik the Outgolfer

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함께 사용해서는 안되는 모듈을 사용하여 돌아 다니는 추악한 해킹이라는 것을 알 수 있습니다. 과 GenLib에 따라 Data.Maybe대신 StdMaybe의 결과 인 또 다른 하스켈의 번역 라이브러리의 추악한 해킹 Data청소 자신의 라이브러리를 똑같이 완료하기 전에 기능을 얻을 수 있습니다.

명령 줄 인수를 통해 입력을받습니다.


좋은 제출. 추가 입력 / 출력 라인 2 개로 챌린지를 업데이트했습니다. 또한 엄격한 I / O가 필요하지 않습니다.
arminb

@arminb 감사합니다! 이 경우 내일 많이 줄일 수있을 것입니다.
OUurous

@arminb 새로운 경우에 유효하도록 업데이트했습니다. 사용한 I / O가 허용되지 않으면 아침에 다시 수정합니다.
OUurous

0

펄, 40 바이트

+1대한 inludesa

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

출력이 주문되지 않았습니다.

양의 페이지 번호를 가정합니다 (특히 페이지가 없음) 0 )를 가정합니다. 누락 된 페이지가 한 번만 언급되었다고 가정합니다. 입력이 주문되었는지 여부는 상관하지 않습니다.

한 번에 하나의 책만 처리하면 다음에 3대한 바이트가 절약 됩니다 37.

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.