Objectif
J'ai une jolie photo que je veux accrocher à mon mur. Et je veux qu'il soit accroché de manière spectaculaire, j'ai donc choisi de l'accrocher sur des n
clous où se n
trouve un entier positif.
Mais je suis aussi indécis, donc si je change d'avis, je ne veux pas avoir beaucoup de mal à prendre la photo. Par conséquent, retirer l'un des n
clous devrait faire tomber l'image. Ai-je mentionné qu'il n'y a pas de friction dans ma maison?
Pouvez-vous m'aider?
Règles
- Votre programme doit lire le nombre
n
depuis stdin et imprimer vers stdout (ou les équivalents de votre langue). - La sortie doit être la solution selon la spécification de sortie sans aucun autre caractère de fin ou de début. Cependant, les espaces blancs et / ou les retours à la ligne de fin sont acceptables.
- Vous devez utiliser exactement des
n
clous. - En supposant un monde sans friction, votre solution doit remplir les conditions suivantes:
- En accrochant l'image comme décrit par votre solution, l'image ne doit pas tomber.
- Si l'un des clous est retiré, l'image doit tomber.
- Des échappatoires standard s'appliquent. En particulier, vous ne pouvez pas adresser de demande, par exemple, au programme de vérification à des solutions de force brute.
Notez que 4.2 implique déjà que tous les n
clous doivent être impliqués.
Spécifications de sortie
- Tous les ongles sont nommés de gauche à droite avec la position dans laquelle ils se trouvent, en commençant par
1
. - Il existe deux façons fondamentales de placer la chaîne autour d'un clou: dans le sens horaire et anti-horaire. On note un pas dans le sens horaire avec
>
et un pas dans le sens anti-horaire avec<
. - Chaque fois que la ficelle est placée autour d'un clou, elle sort par-dessus les ongles, donc sauter des ongles signifie que la ficelle traversera le haut des ongles intermédiaires.
- Chaque solution doit commencer sur l'ongle
1
et se terminer sur l'onglen
. - La sortie doit consister en une séquence d'étapes dans laquelle une étape est une combinaison du nom de l'ongle et de la direction dans laquelle placer la chaîne.
Exemple de sortie
Voici un exemple de sortie pour n=5
et n=3
:
1>4<3<2>4>5< # n=5, incorrect solution
1>2<1<2>3<2<1>2>1<3> # n=3, correct solution
Et voici une représentation visuelle de la solution incorrecte pour n=5
(awsumz gimp skillz)
La solution correcte pour n=1
est simplement 1>
ou 1<
. Pour plusieurs ongles, il peut y avoir différentes solutions. Vous ne devez en produire qu'un, car cela fait partie de votre score.
Vérification
Vous pouvez vérifier si une solution est correcte ici: www.airblader.de/verify.php .
Il utilise une requête GET, vous pouvez donc l'appeler directement si vous le souhaitez. Par exemple, si foo
un fichier contient une solution sur chaque ligne, vous pouvez utiliser
cat foo | while read line; do echo `wget -qO- "www.airblader.de/verify.php?solution=$line" | grep "Passed" | wc -l`; done
Si vous pensez qu'une solution est correcte mais que le vérificateur la marque comme incorrecte, faites-le moi savoir!
Edit: Et si votre sortie est si longue qu'une requête GET ne la coupera pas, faites le moi savoir et je ferai une version de requête POST. :)
Notation
C'est du code-golf. Le score est le nombre d'octets de votre code source dans le codage UTF-8, par exemple, utilisez cet outil . Cependant, il y a un bonus potentiel pour chaque soumission:
Exécutez votre programme pour tous n
dans la plage [1..20]
et ajoutez la longueur de toutes les sorties pour déterminer votre score de sortie . Soustrayez votre score de sortie de 6291370
pour obtenir le nombre de points bonus que vous pouvez déduire de votre nombre d'octets pour obtenir votre score global . Il n'y a pas de pénalité si votre score de sortie est supérieur à ce nombre.
La soumission avec le score global le plus bas gagne. Dans le cas peu probable d'une égalité, les bris d'égalité sont dans cet ordre: points bonus plus élevés, nombre d'octets inférieur, date de soumission plus précoce.
Veuillez afficher à la fois les parties individuelles (nombre d'octets, points bonus) du score et le score final, par exemple, " LOLCODE (44 - 5 = 39)
".
1>
est dessiné dans l'image). Et il n'y an
pas de solution impossible. Une solution valable pourn=2
is1>2<1<2>
.Réponses:
GolfScript (
5167 octets + (73107150 - 6,291,370) = -6,284,153)Ceci est basé sur la construction de commutateurs récursifs de Chris Lusby Taylor * , mieux exposée dans Picture-Hanging Puzzles , Demaine et al., Theory of Computing Systems 54 (4): 531-550 (2014).
Sorties pour les 20 premières entrées:
NB Je pense que les réponses plus longues échoueront au test en ligne car il utilise
GET
plutôt quePOST
et les URL ne sont pas garanties d'être traitées correctement si elles dépassent 255 caractères.Il y a deux réglages sur la construction standard:
[x_1, x_2^-1]
au lieu de[x_1, x_2]
.* Aucune relation, pour autant que je sache.
** Eh bien, dans la même approche de commutateur récursif. Je ne prétends pas avoir résolu le problème ouvert de le prouver optimal.
la source
Python 2 (208 octets + (7230 - 6 291 370) = -6 283 932)
La fonction
f
fait récursivement une réponse en combinant des demi-solutions comme A ^ {- 1} * B ^ {- 1} * A * B, représente des inverses par négation.f(a,b)
est une solution pour les nombres dans l'intervalle semi-ouvert[a,b)
.Modifier: pour respecter l'exigence de commencer par
1
et de terminer parn
, j'ain
inversé la commande pour toujours terminer par en utilisant des intervalles inversés et en ajoutant simplement"1<1>"
au début.Modifier : 136 symboles ont été enregistrés en sortie en arrondissant l'inverse dans la sélection des intervalles, ce qui réduit les intervalles avec des nombres plus grands (et donc plus susceptibles d'avoir deux chiffres).
Édition : 100 symboles enregistrés en divisant les intervalles de manière inégale afin que celui avec les plus grands nombres soit plus court. Cela n'allonge pas le nombre d'opérations utilisées tant que les longueurs ne traversent jamais des puissances de 2.
Edit : réintroduction de l'arrondi favorable, -50 symboles, 2+ caractères de code.
Sorties de 1 à 20:
la source
n>n<
alors.n=1
solution maintenant.C - (199 octets - 0) = 199
Avec des sauts de ligne:
Probablement un algorithme assez naïf étant donné que je ne connais pas grand-chose à la théorie des nœuds. Fondamentalement, il suffit d'ajouter le nombre supérieur suivant, puis d'inverser l'ensemble des instructions pour le dérouler. Cela serait probablement beaucoup plus concis dans un langage qui gère mieux les ensembles ...
La longueur totale de sortie pour
n
dans la plage[1..20]
était de 6 291 370 octets de sortie (3 145 685 instructions). Cela a été assez énorme que je ne posté sorties échantillons pourn
la plage[1..10]
.la source
6,291,370
est exactement le bon numéro que je voulais poster. J'ai accidentellement seulement affiché le numéro den=20
, pas la somme de tous. Je vais devoir le réduire[1..10]
.199 + 0 = 199
.