Advent Challenge 5 : 선물을 운송 도크로 옮기십시오!


9

<< 이전 다음 >>

PPCG 커뮤니티 덕분에 산타는 자신의 모든 선물을 재 제조 할 수 있었으며 조립 라인 후에 선물을 운송 도크로 옮길 준비가되었습니다!

운송용 썰매는 특정 크기에 특화되어 있기 때문에 산타의 운송 도크마다 현재 크기의 범위 만 보유하고 있습니다 (가벼우 며 낭비가 많고 더 무겁고 썰매가 적재물을 처리 할 수 ​​없음). 따라서, 그는 당신이 그의 선물을 가지고 올바른 수송 부두로 분류 할 수 있도록 도와 주어야합니다.

도전

목록과 운송 도크 범위가 주어지면 선물을 올바른 순서로 안정적으로 구성하십시오.

예를 들어 보자. 선물은 [5, 3, 8, 6, 2, 7]도킹 범위입니다 [[1, 5] and [6, 10]].

선물은 5, 3그리고 2첫 번째 도크와 선물에 가서 8, 6그리고 7두 번째 도크로 이동합니다. 이것은로 표시 될 수 있습니다 [[5, 3, 2], [8, 6, 7]]. 이 목록은 입력보다 정렬하기에 더 가깝지만 stably각 도크 내에서 선물 순서는 입력 순서와 동일해야합니다 (그렇지 않으면 전체 목록을 정렬 할 수 있음).

이 경우의 최종 결과는 [5, 3, 2, 8, 6, 7](평평한 목록으로) 나타납니다.

포맷 사양

당신은 정수의 단순 목록과 합리적인 범위 형식 목록과 같은 입력을 설명한다 (예를 들어, 상기 경우의 범위로 제공 될 수있는 [[1, 5], [6, 10]], [1, 5, 6, 10]또는 [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]). 출력은 합리적인 형식의 정수 목록이어야합니다.

입력은 중복 값을 포함 할 수 있습니다. 이 경우 모든 인스턴스를 반환해야합니다. 모든 현재 크기는 정확히 하나의 크기 범위에 있으며 범위가 겹치지 않을 것이라고 가정 할 수 있습니다. 현재의 모든 크기가 적용되는 한 범위에 차이가있을 수 있습니다.

규칙

  • 표준 허점 적용
  • 이것은 바이트 단위의 최단 답변이 이깁니다.
  • 응답이 없습니다
  • 빈 범위가 없다고 가정 할 수 있습니다 ( [7, 4]범위가 올라가서 유효하지 않습니다)

테스트 사례

[1, 2, 3, 4, 5, 6, 7] ; [[1, 3], [4, 7]] => [1, 2, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 6, 7] ; [[4, 7], [1, 3]] => [4, 5, 6, 7, 1, 2, 3]
[7, 3, 5, 4, 6, 1, 2] ; [[1, 3], [4, 5], [6, 7]] => [3, 1, 2, 5, 4, 7, 6]
[4, 7, 6, 3, 5, 2, 1] ; [[1, 4], [5, 7]] => [4, 3, 2, 1, 7, 6, 5]
[1, 1, 3, 3, 6, 4, 7] ; [[1, 4], [6, 7]] => [1, 1, 3, 3, 4, 6, 7]

참고 : Advent Of Code 에서이 챌린지 시리즈에 대한 영감을 얻었습니다 . 이 사이트와 관련이 없습니다

여기서 첫 번째 도전 과제의 '링크 된'섹션을 보면 시리즈의 모든 도전 과제 목록을 볼 수 있습니다 .


항상 2 개만?
LiefdeWen

범위가 겹칠 수 있습니까?
RamenChef

@LiefdeWen 세 번째 테스트 사례를 참조하십시오.
Mr. Xcoder

부두 쌍은 항상 {small, big}
입니까?

@RamenChef No ..
HyperNeutrino

답변:



4

젤리 , 4 바이트

fЀẎ

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

현재 목록, 전체 범위로 입력을받습니다.


yaay 내가 기대 젤리 솔루션이다 그 : DDD
HyperNeutrino

@HyperNeutrino Hehe 예상 솔루션이 가장 짧지 않은 것으로 나타났습니다. 05ab1e의 외부 제품이 작동하는 방식을 찾아서 fþFJelly에서도 3 바이트 작동 한다는 것을 알았 습니다 . 크레딧은 Adnan으로 갑니다 .
Mr. Xcoder

@ Mr.Xcoder 귀하 또는 Adnan이 게시해야합니다.
Erik the Outgolfer

@ Mr.Xcoder 조금 기다렸다가 : P를 볼 수 있지만 게시가 끝나면 다른 답변을 게시 할 것입니다.
Erik the Outgolfer


3

Pyth , 5 바이트

s@Rvz

여기 사용해보십시오!

Pyth , 10 바이트

s.gx}LkQ1E

여기 사용해보십시오!

어떻게 작동

s @ Rvz | 전체 프로그램.

  R | 올바른지도 ...
 @ | ... 교차로 사용.
   vz | 두 번째 입력의 첫 번째 입력.
s | 한 레벨 씩 평평하게하십시오.
s.gx} LkQ1E | 전체 프로그램.

 .g E | 두 번째 입력에서 항목을 그룹화하여 ...
    } LkQ | 첫 번째 입력 위에 맵핑하고 현재 항목이 목록에 있는지 확인하십시오.
   x 1 | 첫 번째 truthy 요소의 인덱스를 가져 가라.
s | 반음 낮추다.

도크를 먼저 가져 와서 범위의 모든 정수와 함께 새 줄에 표시합니다.



3

05AB1E , 3 바이트

δØ

온라인으로 사용해보십시오! ( Adnan 에게 δ-1 바이트가 있음을 알려 주셔서 감사합니다 )

작동 원리

δà ~ | 전체 프로그램.

δ | 다음 명령을 두 번 벡터화하십시오 (외부 제품과 같은 것).
 Ã | 교차로를 나열하십시오. 이것이 dyad이므로 첫 번째 입력은 자동으로
     | 누락 된 인수를 채우는 데 사용됩니다 (아는 한).
  ~ | 반음 낮추다.

글쎄, €Ã˜작동하지 않는 것 같습니다.
Erik the Outgolfer

아닙니다. BTW 이유 €Ã˜때문에 실패는 Ã두 개의 인수를, 그리고 그것을 반환, 그래서 하나 개의 인자를 가진 함수를 기대하고 [[]]대신에 (내가 그 버그라고 생각) 그럼 ˜반환, 평평하게됩니다 []. ε그러나 다르게 작동합니다. 최상위 항목의 각 요소에 대해 새 스택을 만든 다음 각 새 스택의 상단을 반환하므로 함수에 대한 항목이 충분하지 않으면 암시 적 입력이 대신 사용됩니다.
Erik the Outgolfer

아직 테스트하지는 않았지만 δØ찾고 계십니까?
Adnan

@ Mr.Xcoder 나는 그것이 Pyth가 가지고있는 정확히 이차원 적 인지도라고 생각하지 않습니다.
Erik the Outgolfer

3

망막 , 37 36 바이트

O$`(\d+)(?=.*¶(.*)\[.*\b\1\b)
$2
G1`

온라인으로 사용해보십시오! 첫 번째 행의 선물 목록과 두 번째 행의 범위 목록으로 입력을받습니다. 링크에는 테스트 케이스를 원하는 형식으로 분할하기위한 헤더가 포함되어 있습니다. 편집 : @MartinEnder 덕분에 1 바이트가 절약되었습니다. 설명 : 첫 번째 단계는 선물과 일치하고 일치하는 도크를 찾습니다. 선물은 행의 시작 부분에서.까지의 하위 문자열을 기준으로 정렬 [되므로 선물을 독별로 그룹화합니다. 두 번째 단계는 도크를 삭제합니다.


2

참여 , 3 바이트

f₱Ẏ

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

작동 원리

f ₱ Ẏ | 전체 프로그램.

 ₩ | 올바른 논증에 대한지도.
f | 목록 교차를 사용하여 다중성을 계산합니다.
  Ẏ | 조입니다 (1 단계 평평하게).

1
P : D 입대 잊어되지 않았습니다 : D 사실은 좀 그냥 사회가 아니라 :( 내게로했다
HyperNeutrino

2

APL + WIN, 29 바이트

(,⍉<\p←n∘.≤∊¯1↑¨⎕)/(×/⍴p)⍴n←⎕

정수와 범위 모두에 대한 화면 입력 프롬프트. 플랫리스트로서의 정수 및 중첩 된 벡터로서의 범위 (예 : 사례 3)

(1 3) (4 5) (6 7)

설명:

(×/⍴p)⍴n←⎕ prompt for screen input of integers and replicate by the number of ranges 

∊¯1↑¨⎕ prompt for screen input of ranges and select the top of each

p←n∘.≤ create a boolean matrix using outer product with less than the top of each range

,⍉<\ identify the first range which each element fits in and ravel into a partition vector

(.....)/.... use the partition vector to select the elements in each range in order

2

C ++, 127 바이트

포인터 쌍으로 표시되는 두 개의 배열로 입력을 가져옵니다 [start, end).

#import<algorithm>
[](int*A,int*x,int*B,int*y){for(;B!=y;B+=2)A=std::stable_partition(A,x,[&](int a){return a>=*B&&a<=B[1];});}

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


음, C ++에는 모든 것이 내장되어 있습니다. / 입력 범위에 0이 포함되어 있지 않으면 부정 행위로 간주 될 수 있지만 null로 끝나는 배열 B를 사용하여 일부 바이트를 골프 다운 할 수 있습니다. 불행히도 / [&](int a)->int{a=a>=대신 [&](int a){return a>=바이트를 저장하지 않습니다. / #import<algorithm>#import<regex>적어도 TIO 일 수 있습니다 . 검색 후이 페이지에 나열된 모든 헤더 와이 헤더 가 가장 짧은 것을 발견했습니다 ( "수동 이진 검색") . / 또한 +1합니다.
user202729

2

J, 15 바이트

[/:[:I.e.&>"0 1

입력을 왼쪽 인수로, 범위를 오른쪽 인수로 사용합니다. 범위는 전체 범위의 박스 목록입니다.

예를 들어 첫 번째 범위의 경우 :

   NB. This produces the range
   (1 2 3 ; 4 5 6 7)
┌─────┬───────┐
│1 2 3│4 5 6 7│
└─────┴───────┘

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

설명

[/:[:I.e.&>”0 1
          >”0 1  Pair each element on the left with each range on the right
       e.        Is the element in the range?
     I.          Indices of ones
[/:              Sort the elements by this array

2

J , 26 24 바이트

콜 덕분에 2 바이트

[:;]<@#~1=-&1 0"1@[I."1]

작동 방식 :

왼쪽 인수는 범위를 보유합니다.

-&1 0"1@[ 각 범위의 하한을 1 씩 줄입니다.

I."1] 각 범위에 맞는 범위를 확인

1= 올바른 범위에 있습니까?

]<@#~ 현재 범위에있는 선물을 복사하고 상자에 넣습니다.

; -Raze (unboxing)

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


1
입력이 통합되어 있기 때문에 0을 제거 할 수 없다고 확신합니다 (예 :이 테스트 사례 실패 (0 4,:_3 _1) f _2 _1 0 1 2)
cole

@ Cole Hm, 나는이 사건을 완전히 무시했습니다. 그들에 대해 생각해야합니다.
Galen Ivanov

1
네, 가장 쉬운 방법은 아마 상자를 치고 나서는 것이라고 생각합니다. 그런 식으로 24 바이트.
cole

@cole 감사합니다! 짧을뿐만 아니라 0으로 문제를 쉽게 해결할 수 있습니다.
Galen Ivanov

2

R , 113 48 55 41 바이트

도크의 순서가 증가하지 않았을 때 이전 버전에서는 객체가 올바르게 정렬되지 않았습니다.

function(P,D)for(d in D)cat(P[P%in%d],"")

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

소요 D범위의 벡터의 목록으로, 즉 list(4:7,1:3)것이다 [[4, 7], [1, 3]].

아마 나이가 들었을 때의 순진한 대답 일 것입니다. stdout으로 인쇄합니다.


2

Japt , 6 바이트

ñ@VbøX

시도 해봐


설명

배열 U(현재)과 2 차원 배열 V(전체 범위) 의 암시 적 입력 현재 선물 ( ) 을 포함 하는 첫 번째 요소 ( ) 의 색인을 가져 오는 ñ함수 ( @)를 통해 선물을 정렬 ( )합니다 .bVøX


1

파이썬 2, 97 85 바이트

l,d=input()
k=lambda i,j=0:-~j*(d[j][0]<=i<=d[j][1])or k(i,j+1)
print sorted(l,key=k)

ovs 에서 -11 바이트

Mr. Xcoder 에서 -1 바이트

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

재귀 람다를 키로 사용하여 목록을 정렬합니다. 아래 에서 곧 설명 하겠습니다.

설명:

l,d=input()             # l is the lsit of presents, d is the list of ranges
k=lambda i,j=0:-~j*(d[j][0]<=i<=d[j][1])or k(i,j+1)# recursive lambda to sort with
k=lambda i,j=0:                                    # i is the present
                                                   # j is the index in the list of ranges
               -~j*(d[j][0]<=i<=d[j][1])           # return the index of the list of
                                                   # ranges(plus one) if the present is
                                                   # in the range
                                        or k(i,j+1)# if the present is not in the range,
                                                   # try the next range
print sorted(i,key=k)   # print the list of presents sorted by the lambda


1

PowerShell , 37 바이트

param($a,$b)$b|%{$i=$_;$a|?{$_-in$i}}

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

취하고 $a선물의 문자 배열 같이 $b전체 범위 (예를 들어, 각각 어느 배열의 배열로 @(1,2,3,4,5)대신 @(1,5)). 우리의 각 항목을 통해 다음 루프 $b|%{...}. 내부에서 도우미 $i를 현재 항목 으로 설정 한 다음 Where-Object에 대해 절 을 사용 하여 현재 배열 인 $a항목 만 가져와야합니다 .-in$b

그것들은 파이프 라인에 남아 있으며 출력은 암시 적입니다. 기본 동작은 Write-Output배열 요소 사이에 개행 을 삽입하기 때문에 우리가 얻는 것입니다. 여기에 있는 약간 불통 버전입니다 -join단지 차이를 보여, 대신 줄 바꿈의 쉼표를 통해 함께 에드.




1

Windows 배치 (CMD), 90 79 바이트

set/pX=||exit
set/pY=
for %%n in (%*)do if %X% LEQ %%n if %%n LEQ %Y% %%n
%0 %*

LF 줄 끝 형식을 사용하십시오. 각 줄 끝 문자는 1 바이트로 계산 될 수 있습니다.

TIO 없음 (TIO는 Linux를 사용하기 때문에)

명령 행 인수에서 목록을 가져 오십시오 stdin.

예를 들어, 프로그램이 실행되는 경우 (파일 이름이이라고 가정 r1.cmd)

r1 7 3 5 4 6 1 2

그리고 stdin입력

1
3
4
5
6
7

, 프로그램은 stderr형식으로 출력 됩니다

'3' is not recognized as an internal or external command,
operable program or batch file.
'1' is not recognized as an internal or external command,
operable program or batch file.
'2' is not recognized as an internal or external command,
operable program or batch file.
'5' is not recognized as an internal or external command,
operable program or batch file.
'4' is not recognized as an internal or external command,
operable program or batch file.
'7' is not recognized as an internal or external command,
operable program or batch file.
'6' is not recognized as an internal or external command,
operable program or batch file.

(출력 순서에 해당 3 1 2 5 4 7 6)


설명:

set /p X=       Prompt for variable X (min range)
   ||exit       If failed (end of file), exit - similar to short-circuit of logical OR
set /p Y=       Prompt for variable Y
for %%n in (%*)do     For each number %%n in all command-line arguments
   if %X% LEQ %%n     If X <= n
      if %%n LEQ %Y%  and n <= Y
         %%n          run command named "n", which lead to an error.

%0 %*           Call itself, process other ranges

Ungolfed code ( true인수 1로 전달 되면 상호 작용이 활성화 되어 있습니다.에서 목록을 묻는 프롬프트에서 스택 오버플로를 피하기 위해 stdin사용하십시오. goto실제로 문제를 보지 않고 70000 번 이상 호출하는 스크립트를 실행하려고했습니다. 꽤 안전해야합니다) :

@echo off

set INTERACTIVE=%1

if "%INTERACTIVE%" == "true" (
    set rangeMinPrompt=Enter range min: 
    set rangeMaxPrompt=Enter range max: 
    set listPrompt=Enter list: 
) else (
    set rangeMinPrompt=
    set rangeMaxPrompt=
    set listPrompt=
)


set /p list=%listPrompt%

:loop_label

set /p rangeMin=%rangeMinPrompt%&& set /p rangeMax=%rangeMaxPrompt%|| exit /b

for %%n in (%list%) do (
    if %rangeMin% LEQ %%n (
        if %%n LEQ %rangeMax% (
            echo %%n
        )
    )
)

goto :loop_label

선물을 명령 줄 인수로 사용하고을 사용하여 더 많은 바이트를 절약 할 수 있습니다 (%*). 이렇게하면 %0 %*각 범위를 처리 한 후 스크립트를 다시 시작하는 데 사용할 수 있습니다 . (사실 나는 좋은 접촉과 대화 형 버전을 사용했기 때문에 더 큰 바이트 수와 결국 &&, exit/b그리고 echo내 시작 지점으로.)

@ 닐 니스, 감사합니다! 나는 원래 사용하려고 시도 %1했지만 따옴표 "는 공백으로 구분 기호로 작동하지 않으므로을 사용했습니다 set /p.
user202729

오 와우, 심지어 $~1...
user202729


1

Wolfram Language (Mathematica) , 34 바이트

r#~SortBy~{#&@@@r~Position~#&}&

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

입니다 Function 연산자.

이것은 명명되지 않은 카레 기능으로, 먼저 확장 된 도크 범위 목록과 선물 목록으로 호출해야합니다. 예를 들어, 함수를 f다음에 할당 한 경우 :

f[ {{4,5,6,7},{1,2,3}} ][ {1,2,3,4,5,6,7} ]

선물 목록은 단순히 독 범위 목록에서 값의 첫 번째 수준 위치별로 정렬됩니다. 우리는 포장 할 필요가 SortBy정렬 안정을 위해 목록의 기능을.


1

Julia 0.6 , 31 30 바이트

p%d=vcat((∩(p,x)for x=d)...)

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

%오퍼레이터를 재정의하고 첫 번째 대치, 선물 목록의 순서와 다중성을 유지하면서 ∩()도크 위에 설정된 교차점 을 매핑 d합니다 p. 결과로 중첩 배열 vcat...평평하게 하여 입력을 여러 인수로 확장합니다 .

편집 -1Byte : 대신에 이해력을 나열하십시오 map().

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.