이 질문에서 영감을 얻었습니다 .
숫자 목록을 수신하고 재정렬 된 목록을 출력하는 함수 (또는 전체 프로그램)를 만들어 짝수 색인이 먼저 나타나고 홀수 색인이 뒤 따릅니다. 숫자 자체의 값은 순서에 영향을 미치지 않으며 지수 만 영향을 미칩니다. 모든 지수는 0부터 시작합니다.
예를 들면 다음과 같습니다.
입력: [0, 1, 2, 3, 4]
산출: [0, 2, 4, 1, 3]
또 다른 예:
입력: [110, 22, 3330, 4444, 55555, 6]
산출: [110, 3330, 55555, 22, 4444, 6]
귀하의 언어가 가지고있는 목록에 가장 자연스러운 표현을 사용하십시오. 복잡성에 대한 제한은 없습니다 (예 : 임시 목록을 할당해도 괜찮습니다. 제자리에서 할 필요가 없습니다).
추신 빈 목록 (빈 입력 => 빈 출력)에 대해 작동합니다.
답변
답변
답변
피스, 5
o~!ZQ
온라인으로 사용해 보거나 Test Suite를 실행하십시오.
설명
o~!ZQ ## implicit: Z = 0; Q = eval(input)
o Q ## sort Q using a supplied function
~!Z ## Use the old value of Z, then set Z to be not Z
## This assigns a weight to each number in the list, for example given [0,1,2,3,4]
## This will give (value, weight) = [(0,0), (1,1), (2,0), (3,1), (4,0)]
## The values are sorted by weight and then by index
## This happens because Pyth is written in Python, which performs stable sorts
답변
CJam, 7 바이트
{2/ze_}
필요에 따라 최상위 스택 요소를 변환하는 블록 (이름이없는 함수에 가장 가까운 것)을 푸시합니다.
설명
설명에서는 스택의 상단이 배열이라고 가정합니다 [0 1 2 3 4]
. 실제 값은 계산에 영향을 미치지 않습니다.
2/ e# Split the array into chunks of two: [[0 1] [2 3] [4]]
z e# Zip/transpose, which works on ragged arrays: [[0 2 4] [1 3]]
e_ e# Flatten the result: [0 2 4 1 3]
답변
미로 , 28 25 24 23 22 바이트
" >
?!?:|}\{@
@\?"":)!
이것은 미친 재미이었다! 🙂 그것은 지금까지 내가 작성한 가장 조밀하게 압축 된 미로 프로그램입니다. 나는 20과 21 바이트에 너무 많은 버전을 가지고있어 거의 효과가 있었지만 여전히 이것이 최적인지 의심하고 있습니다 …
입력은 양의 정수 목록 (임의의 구분 기호 포함) 으로 가져 와서 결과를 줄 바꿈으로 구분 된 정수로 STDOUT에 인쇄합니다.
20/21 바이트 사냥 : 나는 양식의 모든 프로그램을 확인했습니다.
" XX
?!?X}\{@
@\?XX)!
여기서 X
짐승 힘에 의한 합리적인 성격이지만, 유효한 해결책을 찾지 못했습니다. 물론 이것이 더 짧은 솔루션이 존재하지 않는다는 것을 의미하지는 않지만 20 바이트 프로그램을 구조에 대한 적절한 가정없이 강제로 할 수는 없습니다.
설명
(설명은 약간 구식이지만 솔루션이 최적이라고 확신하지 못하므로 업데이트를 기다릴 것입니다.)
따라서 일반적으로 미로 프로그램은 미로처럼 보일 것입니다. 명령 포인터가 복도에있는 동안 해당 복도를 따릅니다. IP가 모든 종류의 정션에 도달하면 방향은 Labyrinth의 기본 스택의 최상위 값을 기준으로 결정됩니다 (미로에는 두 개의 스택이 있으며 맨 아래에는 무한한 양의 0이 있음). 즉, 벽이 아닌 셀이 모든 곳에 연결되어 있으면 모든 것이 접합이며 대부분의 경우 스택의 상단에 IP에 대한 올바른 값이 없기 때문에 사소하지 않은 루프는 상당히 비쌉니다. 원하는 길을 가고 그래서 당신이하는 일은 루프를 확대하여 중앙에 하나의 잘 정의 된 진입 점과 출구 점이 각각 하나씩 있도록합니다.
그러나 이번에는 정말 운이 좋았고 모든 것이 잘 어울려서 하나의 큰 덩어리로 스쿼시 할 수있었습니다. 🙂
_
남쪽으로 가면서 제어 흐름이 시작됩니다 . 는 _
메인 스택에 0을 민다. 이는 작동하지 않는 것처럼 보이지만 1
나중에 필요 로 하는 ( 암시 적이 지 않은) 스택 깊이를 증가시킵니다 .
?
STDIN에서 정수를 읽습니다. 읽을 정수가 더 이상 없으면 0을 푸시합니다. 이 경우 IP는 계속 남쪽으로 이동 @
하고 입력 목록이 비어 있기 때문에 프로그램을 즉시 종료합니다. 그렇지 않으면 IP가 동쪽으로 바뀝니다.
우리는 이제 두 개의 출구 지점으로 매우 단단한 루프를 시작합니다.
!?;
\?
;
!
스택에 0 만 남기고 정수를 다시 STDOUT으로 인쇄합니다. IP는 계속 동쪽으로 이동 ?
하고 다음 정수를 읽습니다. 그것이 0이 아닌 경우 우회전하여 남쪽으로 이동합니다. ?
다른 것을 읽습니다 (다음 짝수 색인). 다시, 그것이 0이 아닌 경우, 우리는 오른쪽을 잡고 서쪽으로 움직입니다.
그런 다음 \
스택을 변경하지 않고 줄 바꿈을 인쇄하므로 오른쪽으로 이동하여 북쪽으로 이동합니다. !
그 다음 짝수 색인 정수를 인쇄합니다. 이제 스택에 하나 이상의 (양의) 홀수 인덱스 정수가 있으므로 계속 우회전하여 루프가 반복됩니다.
둘 중 하나가 ?
목록의 끝에 도달하면 0을 밀어 해당 해당 항목으로 바로 이동하여 해당 ;
0을 버립니다.
목록에 하나의 요소 만있는 경우 (우리가 즉시 인쇄했기 때문에) IP가 완료되었으므로 IP는 계속 동쪽으로 계속 이동 @
하여 프로그램을 종료합니다 (후행 인쇄) 길에 줄 바꿈).
그렇지 않으면 홀수 인덱스 정수도 인쇄해야합니다. 이 경우 두 경로 (첫 번째 루프의 두 출구 지점에서)가 가운데 "
에서 병합 되어 어느 쪽이든 동쪽으로 전환됩니다.
_
에 왼쪽을 복용하지 않도록 0을 밀어 @
및 ;
폐기 제로 그. 이제 우리는 새로운 루프를 입력합니다 :
"}
""
IP는 왼쪽 아래 셀에 이것을 입력하고 북쪽으로 이동하여 시계 방향으로 루프를 돌립니다. 는 }
보조 스택을 통해 주요 스택의 상단을 이동합니다. 스택에 여전히 요소가 있지만 IP는 계속 작동합니다. 모든 것이 보조 스택으로 이동되고 프로세스에서 반대로 바뀌면 IP는 계속 동쪽으로 이동하여 마지막 루프에 들어갑니다.
\{@
#!
\
줄 바꿈을 다시 인쇄 {
하고 보조 스택에서 주 항목으로 항목을 다시 이동합니다. 이 항목이 여전히 목록의 항목이면 양수이고 IP가 남쪽으로 바뀌고 항목이로 인쇄됩니다 !
. 그런 다음 #
스택 깊이를 밀어 (초기 어디 지금은 _
중요하다이 때문에, #
긍정적 인 스택 깊이를 보장)에 IP가 여전히 통해, 우회전 그래서, \
그리고 {
다시.
모든 것을 인쇄 한 후 {
보조 스택의 맨 아래에서 0을 가져 오면 IP는 동쪽을 계속 @
하고 프로그램을 종료합니다.
답변
MATLAB, 24
@(x)x([1:2:end 2:2:end])
파이썬과 비슷합니다.
2 바이트를 절약 해 주셔서 감사합니다 @LuisMendo!
답변
하스켈 , 37 바이트
concat.foldr(\x[l,r]->[x:r,l])[[],[]]
는 foldr
재귀 적으로도 목록 및 홀수 목록을 작성합니다. 요소를 목록에 추가하면 홀수 목록 앞에 추가하고 새 짝수 목록을 호출하고 이전 짝수 목록을 호출하여 새 홀수 목록을 업데이트합니다. 그런 다음 쌍이 [l,r]
에 연결됩니다 l++r
.
튜플 대신 2 요소 목록을 사용하여 5 바이트를 저장 한 Ørjan Johansen에게 감사합니다.
42 바이트 :
f l=[x|p<-[even,odd],(i,x)<-zip[0..]l,p i]
목록에 색인을 추가 l
하고 짝수 또는 홀수를 필터링합니다.
g(a:_:l)=a:(g l)
g l=l
f l=g l++(g$drop 1 l)
44의 또 다른 형식입니다.이 함수 g
는 모든 짝수 색인 요소를 사용합니다. 홀수 지수는 먼저 요소를 삭제 한 다음을 적용하여 얻습니다 g
. l
비어 있지 않다고 보장 되면 tail
41
g(a:_:l)=a:(g l)
g l=l
f l=g l++g(tail l)