Introducción
Usted es amigo de un curador de un museo de arte, que recientemente tuvo el placer de obtener arte moderno de cuatro artistas ( algunos de los cuales pueden darle al curador cero piezas de arte, jóvenes sinvergüenzas ). Como se trata de arte moderno, todas las piezas de cualquier artista se ven exactamente iguales. Tu amigo quiere usar una computadora para ayudar a decidir en qué orden colocar estas piezas.
Requerimientos del programa
Su programa debe tomar cinco enteros (pasados a una función o ingresados a través de stdin (o de otra manera)). Los primeros cuatro son el número de pinturas proporcionadas por cada uno de los cuatro artistas. El último valor es un índice de permutación i
(contando desde 1, no desde 0). El curador desea ver la i
permutación por orden lexicográfico de las pinturas.
Su programa debe generar esta permutación en cualquier formato razonable: por ejemplo, abbccd
o [0 1 1 2 2 3]
. El tiempo de ejecución para la entrada por un total de menos de diez pinturas debe tomar menos de una hora (con suerte esto no debería ser un problema)
No está permitido usar ninguna función incorporada para resolver las permutaciones
Ejemplos
Entrada: 0 1 2 0 2
Dado que tenemos una pintura del artista B y dos del artista C (y todas se ven iguales), las permutaciones en orden lexicográfico son:
['bcc', ' cbc ', 'ccb']
La permutación resaltada sería la salida correcta, porque es la segunda en orden lexicográfico.
Entrada: 1 2 0 1 5
['abbd', 'abdb', 'adbb', 'babd', ' badb ', 'bbad', 'bbda', 'bdab', 'bdba', 'dabb', 'dbab', 'dbba']
Pruebas
Aquí hay algunas pruebas que deberían ser correctas.
1 2 4 1 5 - ABBDCCCC
2 2 3 1 86 - ABBCACDC
4 1 2 0 24 - AACACBA
1 4 3 2 65 - ABBCBBDCDC
Aquí está disponible un pequeño fragmento de código en Python3 que debería generar aleatoriamente entradas y salidas (no válido para la entrada, esto usa la importación de permutaciones de 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]))
Marcador
Optimizer - CJam - 39 - Confirmed - Bruteforce
EDC65 - JavaScript - 120 - Confirmed - Bruteforce
Jakube - Python2 - 175 - Confirmed - Algorithmic
fuente
{:A.a.{~97+[:I.}:
es válida J y funciona, pero se usaA.
para la mayor parte del trabajo, por lo que no es válida. Si pudiera escribir una función que la reemplaceA.
y la sustituya en esta función, tendría una respuesta válida.{:A.[:I.}:
... Lo que pasa es eso, pero todavía no creoA.
que sea válido: jsoftware.com/help/dictionary/dacapdot.htmRespuestas:
Python 2:
175163 caracteresEsta no es una respuesta de golf seria. Con un algoritmo diferente llegué a 138 bytes. Solo quería publicar esto aquí, porque no usa fuerza bruta. La complejidad es Theta (#imágenes).
Uso:
editar:
Mismo algoritmo, solo un poco de golf: no importe el método factorial y los pequeños cambios en el orden de los cálculos.
Traducción Pyth: 61 caracteres
Nada especial aquí, traducción exacta de mi código de Python. Demasiado tiempo sin embargo. También tuve que usar algunas cosas feas (largas). La primera letra 9 sola es la definición del factorial.
También cosas como
Q[j]-=1
son demasiado largas:XQNt@QN
(¡1 carácter más que Python!)Uso:
Pruébelo aquí: Pyth Compiler / Executor . Deshabilite el modo de depuración y úselo
[2, 2, 3, 1, 86]
como entrada.fuente
from math import*
fuera de la función. ¡Agregándote a la tabla de clasificación!CJam,
50 4339 bytesEsto se puede jugar mucho al golf.
Toma información de STDIN en el siguiente formato:
Salidas de la pintura. Por ejemplo para la entrada anterior:
Pruébalo en línea aquí
Tenga en cuenta que el compilador en línea renuncia a los tamaños de pintura más grandes. Tendrá que probar entradas más grandes en la versión Java
fuente
JavaScript (ES6) 120
138 147Como una función con los cinco parámetros requeridos, salida a través de la consola.
Usando los símbolos 0,1,2,3. Calculo el total de símbolos, luego construyo y verifico cada número base 4 que tiene el número requerido de dígitos. Los números con el número incorrecto de cualquier dígito se descartan.
Nota: con un entero de 32 bits de JavaScript, esto funciona para hasta 15 pinturas.
Editar más corto (evitar .toString) y mucho más rápido (condición de salida modificada). Tiempo para cada prueba por debajo de 1 seg.
Edit2 sin cambio de algoritmo, más golf (sangría agregada para facilitar la lectura)
Ungolfed y no requiere FireFox
Prueba en la consola FireBug / FireFox
Salida
fuente
Pyth , 20
Pruébalo aquí.
La entrada está en forma de lista de Python, p. Ej.
[1, 2, 4, 1, 5]
La salida también está en forma de lista de Python, por ejemplo,
[0, 1, 1, 3, 2, 2, 2, 2]
para la entrada anterior.La solución es la fuerza bruta y toma alrededor de 10 segundos, en el peor de los casos, en mi máquina.
Cómo funciona:
fuente