Дилема куратора


9

Вступ

Ви друг друга куратора художнього музею, який нещодавно захопився здобуттям сучасного мистецтва від чотирьох художників ( деякі з яких можуть дати куратору нульові твори мистецтва, молодих негідників ). Оскільки це сучасне мистецтво, всі твори будь-якого художника виглядають абсолютно однаково. Ваш друг хоче використовувати комп’ютер, щоб вирішити, в якому порядку розмістити ці шматки.

Вимоги до програми

Ваша програма повинна приймати п'ять цілих чисел (переданих у функцію або введених через stdin (або ще дещо)). Перші чотири - це кількість картин, наданих кожним із чотирьох художників. Останнє значення - індекс перестановки i(рахуючи від 1, а не 0). Куратор бажає побачити iперестановку в лексикографічному порядку на картинах.

Ваша програма повинна виводити цю перестановку в будь-якому розумному форматі: наприклад, abbccdабо [0 1 1 2 2 3]. Час виконання вводу, що становить менше десяти картин, має займати менше години (це, мабуть, не повинно бути проблемою).

Вам не дозволяється використовувати будь-які вбудовані функції для розробки перестановок

Приклади

Вхід: 0 1 2 0 2

З огляду на те, що у нас є одна картина художника В і дві художниці С (і всі вони однакові), перестановки в лексикографічному порядку:

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

Виділена перестановка була б правильним результатом, оскільки вона є другою в лексикографічному порядку.

Вхід: 1 2 0 1 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, який повинен випадковим чином генерувати входи та виходи, доступний тут (не вірно для запису, для цього використовується імпорт перестановок Python):

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, і тому не можу сказати точну проблему, але сподіваюся, що це допомагає =)
Олександр Креггс

@PopeyGilbert Ну, версія, яка просто випльовує цифри, була б {:A.[:I.}:... Справа в тому, але я все ще не думаю, що це A.було б дійсно: jsoftware.com/help/dictionary/dacapdot.htm
ɐɔıʇǝɥʇuʎs

Що робити, якщо потрібна перестановка не існує? 1 0 0 0 100?
edc65

Відповіді:


5

Пітон 2: 175 163 символів

Це не серйозна відповідь на гольф. З іншим алгоритмом я досяг 138 байт. Просто хотів опублікувати це тут, бо він не використовує грубу силу. Складність - Theta (# малюнки).

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 символ більше, ніж Python !!!)

Використання:

Спробуйте тут: компілятор / виконавець Pyth . Вимкнути режим налагодження та використовувати [2, 2, 3, 1, 86]як вхід.


Це працює! Вітаємо, що придумали перше рішення Python! Однак я виявив, що в моєму середовищі я повинен вийти from math import*за межі своєї функції. Додаємо вас до лідерів!
Олександр Креггс

Вау ... Ваше рішення неймовірно ефективне - для 32 картин потрібно всього 0,034 секунди o.0.
Олександр Креггс

3

CJam, 50 43 39 байт

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

Це можна багато в гольф.

Приймає дані від STDIN у наступному форматі:

4 1 2 0 24

Виводить картину. Наприклад для наведеного вище вводу:

0020210

Спробуйте його онлайн тут

Зауважте, що онлайн-компілятор відмовляється від великих розмірів картини. Вам доведеться спробувати більші входи у версії Java


Вітаємо вас з першим вирішувачем! 50 байтів, безумовно, важко перемогти. Я додам вас як верхню частину лідерів!
Олександр Креггс

@PopeyGilbert вам слід принаймні почекати 1 тиждень або близько того, перш ніж приймати відповідь
оптимізатор

Ах, добре, мені дуже шкода! У своєму попередньому виклику я просто змінив прийняту відповідь, коли когось побили. Моє ліжко.
Олександр Креггс

1
@ PopeyGilbert Це дуже благородно з вас (і я бажаю, щоб це зробили всі автори-претенденти), і в принципі немає нічого поганого в тому, щоб прийняти рано, якщо ви це зробите, але, здається, деякі люди ображаються, якщо виклик тут сприймає відповідь рано (бо, я здогадуйтесь, ніхто не сподівається, що автор змінить прийняту відповідь).
Мартін Ендер

Я особисто думаю, що перед прийняттям має бути як мінімум 2 відповіді, навіть якщо це зроблено достроково. Звичайно, якщо є лише одна відповідь до тижня або близько того, прийміть це.
Оптимізатор

3

JavaScript (ES6) 120 138 147

Як функція з необхідними п’ятьма параметрами, виведіть через консоль.
Використання символів 0,1,2,3. Я обчислюю загальну кількість символів, потім будую і перевіряю кожне базове 4 число, яке має необхідну кількість цифр. Числа з неправильним числом будь-якої цифри відкидаються.
Примітка. З 32-бітним цілим JavaScript JavaScript це працює для до 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, щоб побачити, чи допоможе це. Я додам вас до лідерів!
Олександр Креггс

Я знайшов досить хороший столик тут - я припускаю , що Firefox необхідно. Перевірено і це працює! Змінено таблицю лідерів на підтверджене.
Олександр Креггс

Таблиця лідерів, але ніяких результатів ... Вам це дуже не подобається! :(
edc65

Ага! Мені так шкода = (Це вже висунуто =)
Олександр Креггс

Цікаво, як довго цей алгоритм буде у CJam. Але на даний момент я не маю уявлення, як це працює: P
Оптимізатор

2

Піт , 20

@fqPQm/TdU4^U4sPQteQ

Спробуйте тут.

Введення є у формі списку Python, наприклад [1, 2, 4, 1, 5]

Вихідні дані також є у формі списку Python, наприклад, [0, 1, 1, 3, 2, 2, 2, 2]для вищевказаного вводу.

Рішення полягає в грубій силі та займає близько 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.