Contexte
L'étiquette de la salle de bain, en ce qui concerne les urinoirs disponibles, indique que le prochain urinoir à remplir doit être celui qui minimise l'inconfort total. L'équation de l'inconfort total est donnée par l'ensemble d'équations suivant:
dist (x, y) = distance linéaire entre la personne x et la personne y dans l' inconfort des unités d'urinoir (x) = somme (1 / (dist (x, y) * dist (x, y))) pour toutes les personnes y à l'exclusion de la personne x total_Discomfort = somme (inconfort (x)) pour tous les x
Un article plus approfondi traitant d'un problème similaire (pas exactement le même) peut être trouvé ici: (Merci à @Lembik de m'avoir alerté de ce livre blanc étonnant!)
Entrée sortie
Étant donné l'entrée d'urinoirs vides et pleins, sortez l'ensemble d'urinoirs résultant avec l'ajout d'une personne. S'il y a une égalité pour une position, les urinoirs doivent se remplir de gauche à droite. La sortie doit être au même format que l'entrée.
- Si on vous donne un cas avec des urinoirs pleins, renvoyez l'entrée.
- L'entrée aura toujours au moins un urinoir défini.
Cas de test
ENTRÉE -> SORTIE 1000001 -> 1001001 101010101 -> 111010101 100 -> 101 00000 -> 10000 1111111 -> 1111111 0100 -> 0101 101000 -> 101001
Règles
C'est le code-golf , donc le code le plus court en octets gagne. Les trous de boucle standard sont interdits.
0100
et101000
dans les cas de test (une approche basée sur des expressions rationnelles fonctionne sur les cas de test réels mais ne fonctionnera pas sur ceux qui devraient encore être traités)Réponses:
Gelée ,
1312 octetsEssayez-le en ligne! ou Vérifiez tous les cas de test.
Explication
la source
MATL ,
191817 octetsEssayez-le en ligne! Ou vérifiez tous les cas de test (code légèrement modifié).
Explication
Il suffit de calculer la distance de chaque nouvelle position potentielle à celles déjà occupées. Les distances restantes ne dépendent pas de la nouvelle position potentielle et constituent donc un terme constant, qui peut être ignoré.
Prenons l'
[1 0 0 0 0 0 1]
exemple de la saisie .la source
JavaScript (ES6), 89 octets
Sorties en modifiant le tableau d'entrée.
la source
R,
837667 octetsJe viens de réaliser que je peux économiser plusieurs octets en ne prenant pas la peine de vérifier si les urinoirs candidats sont vides. Les urinoirs non vides renverront toujours une
Inf
valeur d'inconfort, ils sont donc exclus au cours du calcul. En outre, il suffit d'utiliser l'indexation directe plutôt quereplace
, donc c'est plus court mais moins élégant.Explication
Nous lisons l'état actuel de stdin et l'appelons
x
. Nous supposons que l'entrée est une séquence de1
s et0
s séparés par des espaces ou des retours à la ligne. Aux fins de l'explication, disons que nous saisissons1 0 0 0 0 0 1
.Nous remplaçons une valeur de
x
à un indice particulier par 1. Tout entre le[ ]
détermine quel est le meilleur index.Étant donné que les urinoirs existants sont immuables, nous n'avons pas besoin de considérer les distances entre eux. Il suffit de considérer les distances entre les urinoirs occupés et le nouveau éventuel. Nous déterminons donc les indices des urinoirs occupés. Nous utilisons
which
une fonction pour renvoyer les indices d'un vecteur logique qui le sontTRUE
. Tous les nombres de R, lorsqu'ils sont contraints de taperlogical
, sontTRUE
si différents de zéro etFALSE
s'ils sont nuls. Faire simplementwhich(x)
entraînera une erreur de typeargument to 'which' is not logical
, tout commex
un vecteur numérique. Nous devons donc le contraindre à la logique.!
est la fonction de négation logique de R, qui contraint automatiquement à logique. En l'appliquant deux fois!!x
,, donne un vecteur deTRUE
etFALSE
indiquant quels urinoirs sont occupés. (Les coercitions équivalentes en octets alternatives à la logique impliquent les opérateurs logiques&
et|
et les commandes internesT
etF
, par exempleF|x
ouT&x
et ainsi de suite.!!x
Semble plus exclamatif, nous allons donc l'utiliser.)Ceci est associé à
seq(x)
, qui renvoie la séquence entière de1
à la longueur dex
, c'est-à-dire tous les emplacements d'urinoirs (et donc tous les emplacements possibles à considérer).Nous avons maintenant les indices de nos urinoirs occupés:
1 7
et de nos urinoirs vides1 2 3 4 5 6 7
. On passe`-`
, la fonction de soustraction, à laouter
fonction pour obtenir la "soustraction externe", qui est la matrice de distances suivante entre tous les urinoirs et les urinoirs occupés:Nous élevons cela à la
-2
puissance e. (Pour ceux qui sont un peu perdus, au PO, le "malaise" est défini comme1 / (distance(x, y) * distance(x, y))
, ce qui simplifie1/d(x,y)^2
, c'est- à -dired(x,y)^-2
.)Prenez la somme de chaque ligne de la matrice.
Obtenez l'indice de la plus petite valeur, c'est-à-dire l'urinoir optimal. Dans le cas de plusieurs plus petites valeurs, la première (c'est-à-dire la plus à gauche) est renvoyée.
Et voilà, nous avons l'indice de l'urinoir optimal. Nous remplaçons la valeur de cet indice
x
par1
. Dans le cas d'une1111
entrée, peu importe celle que nous remplaçons, nous aurons toujours une sortie valide.Renvoie l'entrée modifiée.
la source
PHP, 135 octets
Je suis sûr qu'il y a une façon beaucoup plus rapide de le faire, mais j'ai la tête floue et je ne peux pas y penser!
Ancien code
Le code sans minification:
la source
Python 3
223222165 OctetsD'accord, je sais que ce n'est pas la plus jolie réponse là-bas, et je suis sûr que cela peut être joué un peu, mais je ne faisais que déconner et voir ce que je pouvais faire
Criez à mbomb007 pour obtenir des conseils sur les espaces et les comparateurs. De plus, j'ai vu que mon compteur de personnages en ligne prenait tous les onglets et les transformait en espaces, donc le nombre est beaucoup moins élevé que ce que j'avais à l'origine
Affichage de l'espace blanc révisé:
Original:
Cela attend une chaîne qui lui est passée de 1 et 0 comme
"10001"
et retourne une chaîne"10101"
Modifier: changé
1/float((j-i)**2)
enfloat((j-i)**-2)
la source
!='1'
peut être<'1'
et=='1'
peut être>'0'
. En outre, considérez cette astucePython 3,
574471347 octetsJe vais probablement y travailler un peu plus, étant donné que l'autre solution Python est comme un cinquième de celle-ci: [.
Eh bien, c'est beaucoup mieux maintenant que j'ai appris que vous pouvez utiliser des espaces simples.
la source
Python,
165163158147141140139 octetsla source
if"1"*len(p)==p:return p
pour enregistrer un octet