코드 골프 : 견과류를 섞어 같은 종류의 재료가 닿지 않도록하십시오.


16

입력:

입력은 임의의 견과류 (언어로)로 배열되며 가능한 견과류가 따릅니다. 프로그램에는 정수 코드와 같은 각 종류의 너트를 나타내는 방법이 있어야합니다. 프로그램은 너트 구성의 모든 크기 배열을 처리 할 수 ​​있어야합니다.

가능한 너트 :

Kola nut
Macadamia
Mamoncillo
Maya nut
Mongongo
Oak acorns
Ogbono nut
Paradise nut
Pili nut
Pistachio
Walnut

산출:

출력은 같은 종류의 인접 너트가없는 방식으로 정렬 된 배열이어야합니다. 이것이 불가능한 경우 출력은 빈 배열이어야합니다.

입력 예 (간체) :

["walnut", "walnut", "pistachio"]

출력 예 :

["walnut", "pistachio", "walnut"]

솔루션은 우연히 독특해질 때까지 단순히 배열을 섞지 않을 수 있습니다. 사용 된 정렬은 결정 론적이어야합니다.

혼합 견과류?  나는 두 개의 아몬드가 닿는 것을 본다!


4
"프로그램에는 정수 코드와 같은 각 종류의 너트를 나타내는 방법이 있어야합니다."왜 그런가요? — "우연히 배열이 우연히 될 때까지 단순히 배열을 섞지 않을 수 있습니다. 사용 된 정렬은 결정 론적 배열이어야합니다."셔플은 여전히 ​​결정론적일 수 있습니다. 프로그램의 시간 복잡성을 제한한다는 의미입니까?
반 시계 회전을 중지

1
나는 특별한 알고리즘이 아무 이유없이 어리석지 않다는 것을 @leftaroundabout에 동의해야합니다. 이와 같은 코드 게임에서 가장 보람있는 것 중 하나는 다양한 방법으로 사용됩니다.
dmckee --- 전 운영자 고양이 새끼 고양이

@ dmckee, 알고리즘 결정적 요구 사항은 합리적이라고 생각합니다. RNG에 결함이 있거나 입력이 상당히 길면 비 결정적 솔루션이 종료되지 않을 수 있습니다.
boothby

@ 부스비. Meh. 저는 입자 물리학 자입니다. Monte Carlo는 그 자체로 중요한 도구입니다. 나는 고정 PRNG 및 고정 씨앗을 선택하는 경우 또한, 그것은 것입니다 결정.
dmckee --- 전 운영자 고양이

1
여러 솔루션이있는 예제를 찾았지만 일부 답변이 찾지 못할 수도 있습니다. 추가 할 수 있습니까? (5,4,4,3,3,2) perl6 -e 'my @a="aaaaabbbbccccdddee".comb;my @b = @a.pick(*) while @b.squish !== @a;say [~] @b' baedcbdacdecbabaca(3,3,2)도 실패 할 수 있습니다.
브래드 길버트 b2gills

답변:


8

GolfScript, 42 41 37 38 자

~.`{\`{=}+%1-,}+$.,)2//zip[]*.2<..&=*p

이 코드는 STDIN에 대한 입력을 예상하고 STDOUT에 결과를 인쇄합니다. 예 :

> ["walnut" "walnut" "walnut" "macadamia" "pistachio"]
["walnut" "macadamia" "walnut" "pistachio" "walnut"]

> ["walnut" "walnut" "walnut" "macadamia" "walnut"]
[]

스크립트가 예상보다 길어졌지만 개선의 여지가 있다고 생각합니다.

편집 : 단일 항목이있는 목록의 경우 1 자의 비용이 듭니다 (내가 비교할 수있는 가장 좋은 비교는 Peter의 것과 같습니다).


1
나는 아직 이것을 구현하기 위해 앉지 않았지만, $.,)2//zip내가 생각한 그대로입니다. 사양에 대한 나의 해석은 스택에 입력을 가져 와서 스택에 남겨 둘 수 있다는 것입니다.
피터 테일러

@PeterTaylor, 멋지다. 나를 위해 작동합니다.
boothby 2016 년

이것은 ["walnut"]두 번째 비교 섹션의 입력 에서 충돌 합니다.
피터 테일러

@PeterTaylor 당신이 맞아요. 그 코너 케이스에서 일해야합니다.
Howard

6

GolfScript, 32 자

~:x{]x\-,}$.,)2//zip[]*.2<..&=*`

Howard 솔루션과 동일한 입력 및 출력 형식입니다.


나는 정렬 부분에 대해 같은 생각을했지만 아직 코딩하지 않았습니다 :-) 잘했습니다!
Howard

6

Brachylog v2, 10 바이트

p.¬{s₂=}∨Ė

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

무차별 대입 솔루션. (이것은 챌린지가 "전체 프로그램"이라고 말하지 않기 때문에 허용되는 함수입니다.) 또한 대부분 스펙의 직접적인 번역입니다. 적절한 장소에 추가 문자가 필요하지 않습니다).

이것은 두 가지 터치 요소가 없도록 모든 종류의 목록을 재배 열하는 일반적인 알고리즘입니다. 요소의 문자열 표현을 처리 할 수 ​​있으며 정수 코드도 처리 할 수 ​​있습니다. 따라서 "프로그램에 정수 코드와 같은 각 종류의 너트를 나타내는 방법이 있어야합니다." 질문의 요구 사항이 해석됩니다.

설명

p.¬{s₂=}∨Ė
p            Find a permutation of {the input}
  ¬{   }     which does not have the following property:
    s₂         it contains a pair of adjacent elements
      =        that are equal
        ∨    {no constraint on what value the equal elements can have}
 .           If you find such a permutation, output it.
        ∨    If no permutation is found, ignore the input and
         Ė     {output} an empty list

1

J, 80 자

]`_:@.(0<2&([:+/=/\))({.~-:@#),((],.|.)~>.@-:@#)<"1;(\:#&.>)(</.])[;.1' ',1!:1[1

실제로 이것에 대한 Golfscript와 같은 리그에는 없습니다. 나는 이익이 있다고 생각하지만 14 명은 프로그램에 목록을 가져 오기 위해 필요했습니다.[;.1' ',1!:1[1 가 주요 장애입니다.

기본적으로 프로그램은 목록을 가져와 유사한 항목을 그룹화하고 각 그룹의 항목 수를 기준으로 내림차순으로 정렬하고 목록의 전반과 후반 사이의 출력을 번갈아 표시합니다. 코드가 관련없는 항목을 제거하고 목록이 유효한 출력인지 여부를 결정하는 경우 나머지 _는 (그렇지 않으면 무한대 출력 )

예:

macadamia walnut walnut pistachio walnut

그룹 (</.]):

macadamia walnut walnut walnut pistachio

정렬 (\:#&.>):

walnut walnut walnut macadamia pistachio

라벨 ((],.|.)~>.@-:@#):

walnut macadamia walnut pistachio walnut


0

Stax , 10 바이트

│éÿ∞å[zàL⌂

실행 및 디버깅

다음은 압축을 풀고 압축을 풀고 주석을 달은 동일한 프로그램입니다.

|T      get all permutations
{       block to filter by
  :g_=  after dropping repeated elements, it's still equal
f       execute filter
|c      terminate and pop if falsy (no match)
hJ      take the first permutation, and join with spaces

이것을 실행

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