큐레이터의 딜레마


9

소개

당신은 (사 예술가에서 현대 미술을 받고 최근 기뻐했다 미술관에 대한 큐레이터의 친구가 큐레이터에게 예술의 제로 조각, 젊은 악당을 제공 할 수 있습니다 일부를 ). 이것은 현대 미술이기 때문에 주어진 예술가의 작품은 모두 똑같이 보입니다. 친구가 컴퓨터를 사용하여 이러한 조각을 넣을 순서를 결정하려고합니다.

프로그램 요구 사항

프로그램은 5 개의 정수를 가져와야합니다 (함수로 전달되거나 stdin (또는 다른 방법으로 입력)). 처음 네 개는 각 네 명의 예술가가 제공 한 그림 수입니다. 마지막 값은 순열 인덱스입니다 i(0이 아닌 1부터 계산). 큐레이터 i는 그림의 사전 순으로 순열 을보고자합니다 .

프로그램은이 순열을 합리적인 형식 (예 : abbccd또는) 으로 출력해야합니다 [0 1 1 2 2 3]. 총 10 개 미만의 그림을 입력하는 데 걸리는 시간은 1 시간 미만이어야합니다 (문제가 없을 것입니다).

내장 함수를 사용하여 순열을 해결할 수 없습니다.

입력 : 012 2

아티스트 B의 그림 한 개와 아티스트 C의 그림 두 개가 모두 같고 (사실 모두 동일하게 보임) 사전 사전 순서는 다음과 같습니다.

[ 'bcc', ' cbc ', 'ccb']

강조 표시된 순열은 사전 순서의 두 번째이므로 올바른 출력이됩니다.

입력 : 12 2 5

[ 'abbd', 'abdb', 'adbb', 'babd', ' badb ', 'bbad', 'bbda', 'bdab', 'bdba', 'dabb', 'dbab', 'dbba']

테스팅

다음은 올바른 테스트입니다.

1 2 4 1 5    - ABBDCCCC
2 2 3 1 86   - ABBCACDC
4 1 2 0 24   - AACACBA
1 4 3 2 65   - ABBCBBDCDC

입력과 출력을 무작위로 생성해야하는 Python3의 짧은 코드는 여기에서 사용할 수 있습니다 (입력에 유효하지 않음, 파이썬 순열 가져 오기를 사용함).

from itertools import permutations
from random import randint
a,b,c,d,n = randint(1,2),randint(1,2),randint(1,3),randint(1,3),randint(1,15)
print(str(a) + " " + str(b) + " " + str(c) + " " + str(d) + " " + str(n) + " - " + str(sorted(set([''.join(p) for p in permutations(a * "a" + b * "b" + c * "c" + d * "d")]))[n-1]))

스코어 보드

Optimizer - CJam       - 39  - Confirmed - Bruteforce
EDC65     - JavaScript - 120 - Confirmed - Bruteforce
Jakube    - Python2    - 175 - Confirmed - Algorithmic

1
당신은 "모든 조각들이 똑같이 보인다"고 말합니다. "지정된 아티스트의 모든 작품이 똑같아 보이지만 다른 아티스트의 작품은 다른 모습"을 의미합니까?
DavidC

이것은 유효한 항목이 아니지만 누군가에게 유용 할 수 있다고 생각합니다. {:A.a.{~97+[:I.}:유효한 J이고 작동하지만 A.대부분의 작업에 사용되므로 유효하지 않습니다. 이 함수에서 대체 A.하고 대체 할 수있는 함수를 작성할 수 있다면 올바른 답을 얻을 수 있습니다.
ɐɔıʇǝɥʇuʎs

@ ɐɔıʇǝɥʇuʎs- "ABCD"를 사용할 필요가 없으며 문자 / 숫자 / 기호 시스템을 전혀 사용할 수 없습니다. 나는 J를 모른다는 것이 두려워서 정확한 문제를 말할 수는 없지만 이것이 도움이되기를 바랍니다.)
Alexander Craggs

@PopeyGilbert 글쎄, 숫자를 뱉어 버리는 버전은 {:A.[:I.}:... 것입니다.하지만 여전히 A.유효 하지 않다고 생각 합니다 : jsoftware.com/help/dictionary/dacapdot.htm
ɐɔıʇǝɥʇuʎs

필요한 순열이 없으면 어떻게됩니까? 10000100?
edc65

답변:


5

파이썬 2 : 175 개 163 문자

이것은 심각한 골프 답변이 아닙니다. 다른 알고리즘으로 138 바이트에 도달했습니다. 무차별 강제력을 사용하지 않기 때문에 여기에 게시하고 싶었습니다. 복잡성은 세타 (#pictures)입니다.

f=lambda x:0**x or x*f(x-1)
def g(Q,n):
 while sum(Q):
  for j in 0,1,2,3:
   p=f(sum(Q)-1)*Q[j]
   for k in Q:p/=f(k)
   if p<n:n-=p
   else:print j;Q[j]-=1;break

용법:

g([1, 4, 3, 2], 65)

편집하다:

동일한 알고리즘, 일부 골프 : 계승 방법을 가져 오지 말고 계산 순서에서 약간의 변경 사항을 가져옵니다.

Pyth 번역 : 61 자

Lu*GhHUb1WsPQV4J*@QNytsPQFZPQ=J/JyZ)I<JeQ XQ4-eQJ)EN XQNt@QNB

여기에는 특별한 것이 없습니다. 파이썬 코드를 정확하게 번역했습니다. 그래도 너무 길다. 나는 너무 못생긴 (긴) 것들을 사용했습니다. 처음 9 글자 만 계승의 정의입니다.

Lu*GhHUb1    def y(b): G=1; for H in range(b): G*= H+1; return G

또한 Q[j]-=1너무 길다 : XQNt@QN(파이썬보다 1 문자 더 !!!)

용법:

Pyth Compiler / Executor 에서 사용해보십시오 . 디버그 모드를 비활성화 [2, 2, 3, 1, 86]하고 입력으로 사용하십시오 .


효과가있다! 첫 번째 Python 솔루션을 출시 한 것을 축하합니다! 그러나 내 환경 from math import*에서 함수 외부 로 이동해야한다는 것을 알았습니다 . 리더 보드에 당신을 추가!
Alexander Craggs

와우 ... 당신의 해결책은 엄청나게 효율적입니다-32 개의 그림은 0.034 초 밖에 걸리지 않습니다. o.0.
Alexander Craggs

3

CJam, 50 43 39 바이트

q~(])\{W):Wa*}%s:X{Xm*:s_&}X,(*{$X=},$=

이것은 골프를 많이 할 수 있습니다.

STDIN에서 다음 형식으로 입력을받습니다.

4 1 2 0 24

그림을 출력합니다. 예를 들어 위 입력의 경우 :

0020210

여기에서 온라인으로 사용해보십시오

온라인 컴파일러는 더 큰 그림 크기를 포기합니다. Java 버전 에서 더 큰 입력을 시도해야합니다.


첫 번째 솔버가 된 것을 축하합니다! 50 바이트는 확실히 이길 수없는 가치입니다. 리더 보드의 상단에 당신을 추가하겠습니다!
Alexander Craggs 2016 년

@PopeyGilbert 답변을 수락하기 전에 적어도 1 주일 정도 기다려야합니다
Optimizer

아, 정말 죄송합니다! 나의 이전 도전에서 나는 누군가를 때리면 받아 들여진 대답을 바꾸었다. 내 잘못이야.
Alexander Craggs 2016 년

1
@PopeyGilbert 그것은 당신의 매우 고귀한 것입니다 (그리고 모든 도전자 저자가했으면 좋겠습니다). 원하는 경우 일찍 받아들이는 데 아무런 문제가 없지만, 주변의 도전이 일찍 대답을 받아들이면 어떤 사람들은 기분이 상할 것 같습니다 (나 때문에 아무도 저자가 허용 된 답변을 변경하기를 기대 하지 않습니다 ).
Martin Ender

개인적으로 받아들이 기 전에 선택해야 할 답변이 2 개 이상 있어야한다고 생각합니다. 물론 일주일 정도까지 1 개의 답변 만 있다면 받아들이십시오.
Optimizer

3

자바 스크립트 (ES6) 120 138 147

필요한 다섯 가지 매개 변수가있는 기능으로 콘솔을 통해 출력하십시오.
기호 0,1,2,3을 사용합니다. 총 심볼 수를 계산 한 다음 필요한 자릿수를 갖는 모든 기본 4 숫자를 작성하고 확인합니다. 숫자가 틀린 숫자는 버립니다.
참고 : JavaScript 32 비트 정수를 사용하면 최대 15 개의 그림에서 작동합니다.

더 짧게 (.toString을 피하고) 더 빠르게 편집 (종료 된 종료 조건) 1 초 미만의 각 테스트 시간.

Edit2 알고리즘 변경 없음, 더 골프화 (가독성을 위해 들여 쓰기 추가)

F=(w,x,y,z,n)=>{
  for(a=0;n;n-=l=='0,0,0,0')
    for(l=[w,x,y,z],t=w+x+y+z,v='',b=a++;t--;b/=4)--l[d=b&3],v=d+v;
  console.log(v)
}

Ungolfed 및 FireFox 필요 없음

F=function(w,x,y,z,n) {
  for(a=0; n; a++) // exit when solution found (if wrong parameters, run forever)
  {
    l=[w,x,y,z]; // required number of each symbol
    t=w+x+y+z; // total of digits
    v=''; // init output string
    for(b=a;
      t--; // digit count down
      b >>= 2) // shift for next digit
    {
        d = b & 3; //get digit
        --l[d]; // decrement for the current digit
        v = d + v; // add to output string         
    }
    l[0]|l[1]|l[2]|l[3] // if digits ok
    ||--n // decrement counter
  }
  console.log(v) // when found, exit for and print the answer
}

FireBug / FireFox 콘솔에서 테스트

F(1, 2, 4, 1, 5) 
F(2, 2, 3, 1, 86)
F(4, 1, 2, 0, 24)
F(1, 4, 3, 2, 65)

산출

01132222
01120232
0020210
0112113232

여보세요! 실행하는 데 약간의 문제가 있습니다. 도움이되는지 FireFox를 다운로드하고 있습니다. 리더 보드에 추가하겠습니다.
Alexander Craggs 2016 년

나는 여기서 멋진 테이블을 발견했다. 나는 Firefox가 필요하다고 가정 할 것이다. 테스트하고 작동합니다! 리더 보드를 확인으로 변경했습니다.
Alexander Craggs 2016 년

순위표는 있지만 투표권이 없습니다 ... 당신은 정말로 그것을 좋아하지 않습니다! :(
edc65

아! 정말 죄송합니다 = (이제 upvoted =)
Alexander Craggs

CJam에서이 알고리즘이 얼마나 오래 지속 될지 궁금합니다. 그러나 현재로서는 이것이 어떻게 작동하는지 전혀 모른다 : P
Optimizer

2

피 이스 , 20

@fqPQm/TdU4^U4sPQteQ

여기에서 시도하십시오.

입력은 파이썬리스트 형식입니다. 예 : [1, 2, 4, 1, 5]

출력은 또한 예 [0, 1, 1, 3, 2, 2, 2, 2]를 들어 위 입력 과 같은 Python 목록 형식 입니다.

해결책은 무차별 적이며 내 컴퓨터에서 최악의 경우 약 10 초가 걸립니다.

작동 방식 :

@fqPQm/TdU4^U4sPQteQ
           ^U4sPQ         All permutations of [0, 1, 2, 3] with length equal to the number
                          of paintings.
     m/TdU4               Find the count (/) of paintings by painter in the input list.
 fqPQ                     Filter the permutations on the counts being the desired counts
                          in the input.
                          This gives all possible orderings of the paintings.
@                teQ      Index into this list at the given location - 1. (0-indexing)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.