Formule auto-référentielle de Tupper (copie de Wikipedia)
La formule auto-référentielle de Tupper est une formule définie par Jeff Tupper qui, lorsqu'elle est représentée graphiquement en deux dimensions à un endroit très spécifique du plan, peut être "programmée" pour reproduire visuellement la formule elle-même. Il est utilisé dans divers cours de mathématiques et d'informatique comme exercice de représentation graphique de formules.
Où est la fonction de sol.
Soit k
le numéro à 543 chiffres suivant:
960939379918958884971672962127852754715004339660129306651505519271702802395266424689642842174350718121267153782770623355993237280874144307891325963941337723487857735749823926629715517173716995165232890538221612403238855866184013235585136048828693337902491454229288667081096184496091705183454067827731551705405381627380967602565625016981482083418783163849115590225610003652351370343874461848378737238198224849863465033159410054974700593138339226497249461751545728366702369745461014655997933798537483143786841806593422227898388722980000748404719
Si un graphique l'ensemble des points (x, y)
dans 0 <= x < 106
et k <= y < k + 17
satisfaisant à l'inégalité donnée ci - dessus, l'aspect graphique résultant comme celui - ci (note que les axes dans ce complot ont été inversés, sinon l'image ressorte à l' envers):
Et alors?
Ce qui est intéressant à propos de cette formule est qu’elle peut être utilisée pour représenter graphiquement toute image possible en noir et blanc au format 106x17. Effectivement, effectuer une recherche serait extrêmement fastidieux. Il existe donc un moyen de déterminer la valeur k où votre image apparaît. Le processus est assez simple:
- Commencez par le pixel en bas de la première colonne de votre image.
- Si le pixel est blanc, un 0 sera ajouté à la valeur-k. S'il est noir, ajoutez un 1.
- Montez la colonne en répétant l'étape 2.
- Une fois à la fin de la colonne, passez à la colonne suivante et partez du bas en suivant le même processus.
- Une fois chaque pixel analysé, convertissez cette chaîne binaire en décimal et multipliez-la par 17 pour obtenir la valeur k.
Quel est mon travail
Votre travail consiste à créer un programme qui peut prendre n'importe quelle image 106x17 et générer sa valeur k correspondante. Vous pouvez faire les hypothèses suivantes:
- Toutes les images seront exactement 106x17
- Toutes les images ne contiendront que des pixels noirs (# 000000) ou blancs (#FFFFFF), rien entre les deux.
Il y a aussi quelques règles:
- La sortie est simplement la valeur k. Il doit être dans la base appropriée, mais peut être dans n’importe quel format.
- Les images doivent être lues à partir d’un fichier PNG ou PPM.
- Aucune échappatoire standard.
Images d'essai
[ ] devrait produire ~ 1.4946x10 542
[ ] devrait produire ~ 7.2355x10 159
[ ] devrait produire 2 1801 * 17
[ ] devrait produire (2 1802 -1) * 17
Découvrez ce Gist pour les solutions exactes.
C'est le code-golf , donc le moins d'octets gagne.
Liens utiles
quine
quelque part.Réponses:
CJam, 16 ans
Merci à Dennis. Essayez-le en ligne
Si vous rencontrez des problèmes avec l'URL, voici l'entrée que j'ai testée:
J'ai utilisé le format généré par GIMP lors de l'exportation au format ASCII, avec le commentaire supprimé.
Explication:
la source
l;l~\qN-/W%zs:~2b*
devrait également fonctionner.Pyth - 21 octets
Simple à faire avec la
i
conversion de base de pyth . Prend l'entrée commePBM
nom de fichier et lit à l'aide de la'
commande. Je devais utiliser!M
pour nier les Noirs et les Blancs. Tout le reste est explicite.Essayez-le ici en ligne . (L'interprète Web ne peut pas lire les fichiers, il est donc modifié et prend le fichier en entrée).
la source
Python 2:
133110 octetsUne première tentative en python avec PIL:
Merci aux commentateurs utiles ci-dessous
la source
from PIL import Image k=0 for a in range(1802):y=a%17;x=a/17;k=(0 if Image.open(input()).load()[x,16-y][0]else 1)+k*2 print k*17
a/17
eta%17
aux emplacements appropriés, et vous pouvez abuser du fait que 1 est la vérité et 0 est la falsie. Voici le résultat de ces changements, vous serez ramené à 111 octets :)input()
appelé à chaque itération de la boucle avec cette modification. Édition avec d’autres astuces cependant, merci.(...<1) --> 0**...
peut être?C #, 199
C'était amusant! Il n'y a rien de mal à recharger un bitmap 106 * 17 fois, non? Je l'ai fait comme une fonction pour sauvegarder des octets, pas sûr que ce soit légal.
i
est le nom du fichier d'entrée.En outre, en tant qu’expression unique, simplement parce qu’il s’agit d’une seule expression, avec
i
ou fourni (167 octets)la source
Mathematica 69 octets
Binarize @ peut être omis si l’image est au format monochrome.
Cette fonction reproduira l'image:
la source