플롭하는 방법을 알려주세요


29

컴퓨터 과학자는 아마도 푸시 의 기본 목록 작업에 익숙 할 것입니다 . 요소 목록을 수정하는 간단한 작업입니다. 그러나 작동 플롭에 대해 들어 본 적이 있습니까? ( 플립 플롭 에서와 같이 )? 꽤 간단합니다. 숫자 n이 주어지면 목록 의 처음 n 요소를 반대로 바꿉니다 . 예를 들면 다음과 같습니다.

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> a.flop(4)
[4, 3, 2, 1, 5, 6, 7, 8, 9, 10]

플롭 작업의 멋진 점은 정렬 과 같은 멋진 작업을 목록에 사용할 수 있다는 입니다. 우리는 플롭과 비슷한 것을 할 것입니다 :

정수 목록이 주어지면 "이웃"입니다. 즉, 모든 중복 요소가 연속적으로 나타나도록 정렬합니다.

이것은 퍼로 할 수 있습니다! 예를 들어, 다음 목록을 작성하십시오.

>>> a = [3, 2, 1, 4, 3, 3, 2]
>>> a.flop(4)
[4, 1, 2, 3, 3, 3, 2]
>>> a.flop(3)
[2, 1, 4, 3, 3, 3, 2]
>>> a.flop(6)
[3, 3, 3, 4, 1, 2, 2]

이를 통해 오늘날의 과제를 정의 할 수 있습니다.

정수 목록이 주어지면 목록이 인접하게되는 모든 플롭 세트를 출력하십시오.

마지막 목록을 예로 사용하면 다음을 출력해야합니다.

4
3
6

리스트를 4, 3, 6으로 플로 핑하면 인접리스트가됩니다. 리스트에 인접한 가장 짧은 플롭리스트를 인쇄 할 필요 는 없습니다 . 인쇄 한 경우 :

4
4
4
3
1
1
6
2
2

대신 이것은 여전히 ​​유효한 출력입니다. 그러나 목록의 길이보다 큰 숫자는 출력 하지 않을 수 있습니다 . list의 a = [1, 2, 3]경우 호출 이 의미가 없기 때문입니다 a.flop(4).

여기 몇 가지 예가 있어요.

#Input:
[2, 6, 0, 3, 1, 5, 5, 0, 5, 1]

#Output
[3, 7, 8, 6, 9]


#Input
[1, 2]

#Output
<any list of integers under 3, including an empty list>


#Input
[2, 6, 0, 2, 1, 4, 5, 1, 3, 2, 1, 5, 6, 4, 4, 1, 4, 6, 6, 0]

#Output
[3, 19, 17, 7, 2, 4, 11, 15, 2, 7, 13, 4, 14, 2]


#Input
[1, 1, 1, 1, 2, 2, 2, -1, 4]

#Output
[]


#Input
[4, 4, 8, 8, 15, 16, 16, 23, 23, 42, 42, 15]

#Output
[12, 7]

이러한 각 예에서 주어진 출력은 하나의 잠재적 인 유효한 출력 일뿐입니다. 앞에서 말했듯 이 주어진 목록에 인접한 모든 플롭 세트는 유효한 출력 입니다. 이 파이썬 스크립트 를 사용하여 주어진 플롭 목록이 목록과 올바르게 이웃하는지 확인할 수 있습니다 .

합리적인 형식으로 입력 및 출력 할 수 있습니다. 예를 들어, 함수 인수 / 반환 값, STDIN / STDOUT, 파일 읽기 / 쓰기 등이 모두 유효합니다. 평소와 같이, 이것은 이므로 가능한 한 가장 짧은 프로그램을 만들고 재미있게 보내십시오! :)


3
fl (oating point) op (eration)으로 들었습니다.
Weijun Zhou

3
@WeijunZhou 그것은 한 조각의 하드웨어에서 수행되는 연산을 계산하기위한 계산 속도의 척도입니다. en.wikipedia.org/wiki/FLOPS
iPhoenix

3
제출물이 결정 론적이어야합니까, 아니면 배열이 그룹화 될 때까지 의사 난수로 퍼낼 수 있습니까?
Dennis

3
출력에 제로 플롭이 나타날 수 있습니까?
Laikoni

4
관련 . NB 그 질문에 대한 대답은 이것에 대한 대답 일 것이지만, 분류되는 것이 "이웃 된"것보다 더 강한 조건이기 때문에 그것들을 아웃 골프 (out-golf)하는 것이 가능할 수 있습니다. 지금까지 답변은 장려하지 않습니다).
피터 테일러

답변:


7

하스켈 , 98 71 바이트

h.r
h(x:s)|(a,b)<-span(/=x)s=l b:l s:h(b++r a)
h e=e
r=reverse
l=length

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

설명

길이 목록의 n경우이 방법은 2*n플롭을 생성합니다 . 목록의 마지막 요소를보고 목록에서 동일한 요소를 찾아서 두 번째에서 마지막 위치로 뒤집어 작동합니다. 그런 다음 마지막 요소가 제거 된 목록이 재귀 적으로 "이웃"됩니다.

목록의 [1,2,3,1,2]경우 알고리즘은 다음과 같이 작동합니다.

[1,2,3,1,2]  flip longest prefix that ends in 2: flop 2
[2,1,3,1,2]  bring first element to second to last position: flop n-1 = flop 4
[1,3,1,2,2]  recursively work on n-1 list
[1,3,1,2]    there is no other 2: flop 0
[1,3,1,2]    flop n-1 = flop 3
[1,3,1,2]    recurse
[1,3,1]      flop 1
[1,3,1]      flop 2
[3,1,1]      recurse
[3,1]        flop 0
[3,1]        flop 1
 ...

이 모든 것이 함께 [2,4,0,3,1,2,0,1,0,0]퍼와 이웃 목록을 산출합니다 [3,1,1,2,2].


6

Wolfram Language (Mathematica) , 71 바이트

If[(n=Tr[1^#])<1,{},{i=Last@Ordering@#,n,n-1,i-1}~Join~#0[#~Drop~{i}]]&

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

작동 원리

length의 배열이 주어지면 배열을 증가하는 순서로 정렬하는 플롭 n시퀀스를 출력합니다 4n. 특히 중복 요소를 나란히 배치합니다.

아이디어는 배열을 정렬하고 가장 큰 요소를 끝으로 이동 한 다음 n-1배열 의 첫 번째 요소 를 정렬하는 것 입니다. 플롭 작업의 구현을 피하기 위해 다른 요소를 방해하지 않는 방식으로 가장 큰 요소를 끝으로 옮깁니다.

{3, 2, 1, 5, 3, 3, 2}    starting array, with largest element in position 4
{5, 1, 2, 3, 3, 3, 2}    flop 4 to put the largest element at the beginning
{2, 3, 3, 3, 2, 1, 5}    flop 7 to put the largest element at the end
{1, 2, 3, 3, 3, 2, 5}    flop 6 (7-1) to reverse the effect of flop 7 on other elements
{3, 2, 1, 3, 3, 2, 5}    flop 3 (4-1) to reverse the effect of flop 4 on other elements

일반적으로 가장 큰 요소가 위치에 있으면 요소 i를 끝까지 이동하는 플롭 시퀀스는 i, n, n-1, i-1입니다.


을 사용하여 가장 큰 요소를 끝까지 이동할 수 있습니다 i, n. 그럼 왜합니까 n-1, i-1? 안정적인 정렬이 필요하지 않습니다 .
피터 테일러

@PeterTaylor 나는 대답이 실제로 플롭을 수행한다고 생각하지 않습니다. 매번 가장 큰 요소를 제거하고 플롭 측면에서 해당 작업과 동등한 결과를 출력합니다.
Neil


3

젤리 , 19 17 바이트

ỤỤạ‘Ḣ
ỤÇÐƤ˵Uż’ṚF

목록을 정렬합니다.

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


나는 ỤŒ¿’Æ!‘Ṛ˵Uż’ṚF역 정렬 Œ¿이 모듈로 라고 생각 L!합니다.
Jonathan Allan

어떤 이유로 든, 그것은 마지막 테스트 케이스에서 작동하지 않습니다. 아마도 아마도 코드가 모호한 경우에도 내 코드가 실패한다는 것을 의미합니다 ...
Dennis

그리고 실제로 입력에 실패합니다 [4, 3, 2, 1, 3]. 버머.
Dennis

오 부; 부끄러운 일입니다.
Jonathan Allan

Ụ>Ṫ$ƤSạỤ˵Uż’ṚF도우미 링크를 교체하여 2 바이트를 절약합니다.
마일

2

클린 , 88 바이트

경비원과 함께 더 짧은 것이 있다고 생각하지만 아직 찾지 못했습니다.

import StdEnv
$[h:t]#(a,b)=span((<>)h)t
=map length[b,t]++ $(b++r a)
$e=e
r=reverse

$o r

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

함수 리터럴로. Laikoni의 Haskell answer 와 같은 방식으로 작동 하지만 약간 다르게 골프를 치고 물론 다른 언어로도 골프를칩니다.


1

자바 스크립트, 150 바이트

(a,f=n=>(a=[...a.slice(0, n).reverse(),...a.slice(n)],n),l=a.length,i=0)=>a.reduce(c=>[...c,f(a.indexOf(Math.max(...a.slice(0, l-i)))+1),f(l-i++)],[])

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

자바 스크립트, 151 바이트

a=>{f=n=>(a=[...a.slice(0,n).reverse(),...a.slice(n)],n),r=[];for(i=a.length+1;--i>0;)r.push(f(a.indexOf(Math.max(...a.slice(0, i)))+1),f(i));return r}

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

둘 다 기본적으로 최대 숫자를 시작으로 뒤집은 다음 뒤로 뒤집어 배열을 정렬하여 나머지 배열과 함께 반복합니다. 첫 번째는 reduce를 사용하고 두 번째는 for 루프를 사용합니다.

언 골프 드 :

array => {
  let flop = n => {
    array = [...array.slice(0, n).reverse(), ...array.slice(n)]; 
    return n;
  }
  let flops = [];
  for (let i = array.length + 1; --i > 0;) 
  {
    let maxIndex = array.indexOf(Math.max(...array.slice(0, i)));
    flops.push(flop(maxIndex + 1), flop(i));
  }
  return flops;
}

0

Perl 5.10 이상, 66 바이트

포함 +3에 대해 -n (가) use 5.10.05.10이 무료로 간주됩니다 펄 수준으로 언어를 가지고

#!/usr/bin/perl -n
use 5.10.0;
$'>=$&or$.=s/(\S+) \G(\S+)/$2 $1/*say"$. 2 $."while$.++,/\S+ /g

STDIN에서 입력을 한 줄로 실행하십시오.

flop.pl <<< "1 8 3 -5 6"

반복적으로 반전을 찾아서 앞쪽으로 치우고 반전을 치우고 모든 것을 이전 위치로 다시 치핑하여 목록을 정렬합니다.

파이썬과 동일한 야구장에 들어가는 것은 놀랍게도 어려웠습니다. :-)


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