Contexte
Le soi-disant "protocole d'urinoir", décrivant l'ordre dans lequel les urinoirs individuels sont cueillis dans les toilettes d'un homme, a été discuté à plusieurs endroits. Une version est donnée dans cet article de blog xkcd . Cette question concerne une légère variation:
Arrangement : n urinoirs en ligne.
Protocole : chaque nouvelle personne sélectionne l’un des urinoirs les plus éloignés de ceux déjà utilisés.
Notez que cela n'impose aucune restriction quant à l'urinoir choisi par la première personne.
Mise à jour : La séquence du nombre de manières différentes par lesquelles n personnes peuvent sélectionner n urinoirs commence par 1, 2, 4, 8, 20 ... Notez que ce n'est pas la même chose que OEIS A095236 , qui décrit des restrictions légèrement plus strictes que celles-ci. question.
Tâche
Soit un entier n compris entre 0 et 10, affiche (dans n'importe quel ordre) tous les ordres possibles dans lesquels n personnes peuvent occuper n urinoirs. Chaque commande doit être imprimée comme arrangement final: une séquence de chiffres représentant les personnes (1-9 pour les 9 premières personnes, 0 pour la dixième), en partant de l’urinoir le plus à gauche, avec des séparateurs non alphanumériques optionnels entre (mais pas avant). ou après) les chiffres. Par exemple, les sorties suivantes sont toutes les deux valides:
>> 3
132
213
312
231
>> 4
1|3|4|2
1|4|3|2
3|1|4|2
4|1|3|2
2|3|1|4
2|4|1|3
2|3|4|1
2|4|3|1
Vous pouvez écrire un programme ou une fonction en prenant l’entrée via STDIN (ou l’alternative la plus proche), un argument de ligne de commande ou un argument de fonction. Les résultats doivent être imprimés sur STDOUT (ou l'alternative la plus proche).
Notation
Le code le plus court gagne. Les conditions générales s'appliquent.
la source
span
longueur de 1, où il y a unespan
longueur de 2 disponible. J'ai soudainement réussi à m'embrouiller. Il semblerait que le PO soit intentionnellement dérivé du lien, et donc que le lien devrait être suivi?Réponses:
Pyth,
5351C'est une approche itérative. En considérant un ensemble possible d'emplacements partiellement remplis, nous trouvons tous les autres emplacements optimaux, puis générons la liste des emplacements correspondants et répétons l'opération.
Les résultats sont générés sous la forme
[<first person's location>, <second person's location> ...]
, puis ils sont transformés au format souhaité.MhSm^-dG2H
définit une fonction d'assistance qui recherche les distances minimales entre un décrochage donné et un décrochage occupé (au carré). Curieusement, le séparateur est libre.Exemple exécuté.
Explication:
Tout d’abord, la fonction d’aide
g
, qui détermine la distance au carré minimale entre G et une valeur quelconque dans H.Ensuite, nous trouvons le maximum au-dessus des emplacements des urinoirs de la distance carrée minimale entre ce dernier et tout urinoir occupé:
(
Q
est l'entrée.)d
Dans ce cas, il s’agit de la liste des urinoirs occupés, tandisb
qu’itération sur les emplacements des urinoirs.Ensuite, nous trouvons tous les emplacements d'urinoirs dont la distance minimale au carré de l'urinoir occupé le plus proche est égale à la valeur maximale trouvée ci-dessus.
Ensuite, nous allons générer les listes d’emplacement d’urinoir créées en ajoutant les emplacements d’urinoir trouvés ci-dessus à
d
. Nous le ferons pour chaque liste précédente d’emplacement d’urinoirs, ce qui étendra les listes de longueurN
àN+1
.G
est la liste des listes légales des emplacements des urinoirs occupés d’une longueur donnée.Ensuite, nous appliquerons l’expression ci-dessus à plusieurs reprises pour générer la liste complète des listes d’emplacements d’urinoirs occupés.
u
, la fonction de réduction fait exactement cela, autant de fois qu'il y a d'éléments dans son deuxième argument.Autre partir de la représentation ci - dessus, qui va
[<1st location>, <2nd location>, ... ]
, à la forme de sortie souhaitée,[<person in slot 1>, <person in slot 2>, ... ]
. Ensuite, le formulaire de sortie est joint à la chaîne de sortie et imprimé. L'impression est implicite.la source
kajsdlkas^23asdjkla1lasdkj~JZasSSA
- presque la moitié de la taille.Pyth,
757167Solution combinatoire récursive.
C'est une traduction assez directe de cette solution Python:
la source
C,
929878 octetsCelui-ci est un monstre, les gars. Désolé.
Définit 3 fonctions,
f(int*,int)
,P(int*,int,int,int,int)
etL(int)
. AppelezL(n)
, et il sort à STDOUT.Sortie pour
n=5
:Mise à jour: j'ai supprimé les séparateurs et corrigé le code. L’ancien code a non seulement échoué pour n = 7 +, mais n’a rien produit du tout pour n = 10 (oups!). J'ai plus soigneusement testé ce groupe. Il prend désormais en charge une entrée allant jusqu’à n = 13 (bien que le
"%d"
faille changer le pour"%x"
qu’elle soit imprimée en hexadécimal). La taille de l'entrée dépend desizeof(long)
et on suppose que c'est8
en pratique.Voici une explication de son fonctionnement et des raisons pour lesquelles une restriction aussi étrange existe:
Celles-ci ont été beaucoup utilisées, nous les définissons donc pour économiser quelques octets:
typedef unsigned long U; typedef unsigned char C;
Voici
f
:f
prend un tableau d'entiers de taillen
, etn
lui - même. Le seul élément intelligent ici est qu'il renvoie ununsigned long
, qui est converti enchar[8]
par la fonction appelante. Chaque caractère du tableau est ainsi défini sur0xFF
ou sur un index pointant vers un urinal valide pour la personne suivante. En effetn<10
, nous n’avons jamais besoin de plus de 5 octets pour contenir tous les urinoirs valides que la personne suivante peut utiliser.Voici
P
:P
prend un tableauu
de taillen
dans lequel exactement un élément est défini sur1
et les autres sont0
. Il trouve ensuite et imprime toutes les permutations possibles de manière récursive.Voici
L
:L
appelle simplement desP
n
temps avec des positions de départ différentes à chaque fois.Pour les intéressés, cela (moins joué
f
au golf ) générera la séquence dans A095236 .la source
14352
signifie que la personne n ° 1 a choisi l'urinal le plus à gauche. La personne n ° 2 a choisi la personne la plus à droite, qui a ensuite forcé la n ° 3 au milieu. Ce n'est pas le numéro de l'urinal choisi ensuite qui doit être fourni.Python 2, 208
Approche récursive.
la source
JavaScript (ES6) 153
160 169modifier Utilisez Math.min pour trouver (bien sûr) la distance maximale: code simplifié et 16 octets enregistrés.
La recherche récursive peut fonctionner avec n> 10, il suffit de supprimer% 10 (et d’être prêt à attendre pendant que la console déroule toute sa sortie).
J'utilise un seul tableau pour stocker l'emplacement en cours d' utilisation (nombres positifs) ou la distance courante de la fente la plus proche (numéros de négatif , de sorte
<
et>
sont permutés dans le code).Ungolfed
Testez dans la console Firefox / FireBug
la source
Mathematica,
123104la source
n~f~s~Join~{#}
deviendraJoin[f[n,s],{#}]
.MATLAB, 164
la source
Perl, 174
Pas très court, mais amusant. Je ne compte pas
use feature 'say';
dans le total d'octets.De-golfé:
la source
C, 248 octets
Ce code utilise un algorithme récursif pour générer le résultat souhaité.
Étendu:
la source
Bash,
744674 octetsC'est encore trop long :). J'utilise une chaîne pour représenter la rangée d'urinoirs et un algorithme d'inondation pour rechercher les urinoirs les plus distants dans chaque phase de la récursion. Le code non-ludique est presque explicite. Le nombre d'urinoirs est lu à partir du clavier.
Code (golfé):
Utilisation:
Et ungolfed ça va:
la source