Le problème:
Ce défi vient d'un vrai problème que j'avais. J'ai une configuration à double moniteur au travail et je voulais utiliser l'image suivante comme fond d'écran:
Cependant, mes moniteurs ont des lunettes assez importantes, et quand je règle mon arrière-plan, cela ressemble à ceci, où la jetée semble (appiers?) Être cassée:
J'ai pu résoudre ce problème en créant une image avec le centre découpé, puis en l'étirant à sa taille d'origine, comme dans l'image ci-dessous:
Le défi:
Écrivez un programme qui prend une image et la «surveille» pour l'utiliser avec une configuration à deux moniteurs (c'est-à-dire supprime la section centrale de l'image, où se trouvent les lunettes). Les règles sont les suivantes:
- Il doit s'agir d'un programme complet qui accepte l'image, soit en tant que chemin (argument chaîne, etc.), soit sous la forme d'une boîte de dialogue de sélection de fichier.
- Le programme doit prendre en entrée le nombre de lignes verticales (un pixel de largeur) à recadrer à partir du centre de l'image
- Le recadrage doit provenir du centre (dans le sens de la largeur) de l'image originale
- L'image résultante doit être redimensionnée à la taille d'origine de l'image d'entrée. (Les moitiés peuvent être mises à l'échelle individuellement, puis concaténées, ou concaténées puis mises à l'échelle. La mise à l'échelle individuelle produit une meilleure image / effet, mais est à peine perceptible dans le monde réel)
- Les images d'arrière-plan sont généralement égales, donc pour faciliter ce défi, les images d'entrée n'auront qu'un nombre pair de pixels et le nombre de lignes à supprimer ne sera que pair.
- Ce défi est le golf de code - le code le plus court en octets gagne
Bonne chance!
code-golf
image-processing
dberm22
la source
la source
Réponses:
Octave, 85 octets
Définit une fonction anonyme avec
f
le nom de fichier etn
le nombre de colonnes à supprimer. Puisqu'une fonction anonyme nécessite une seule expression, l'affectation en ligne est utilisée, une fonctionnalité non présente dans MATLAB.MATLAB, 98 octets
En prime, j'ai également joué une réponse compatible MATLAB. Fait intéressant, cela ne fait que 13 octets de plus, car la version Octave a besoin de beaucoup de parenthèses pour analyser correctement les affectations en ligne.
la source
Matlab 2013, 150 octets
Voici ma tentative en Matlab. Ce ne sera certainement pas le code le plus court, mais c'est un début.
Attention, cela écrase l'image d'origine, donc faites d'abord une copie.
Version golfée
Code non golfé, avec des améliorations pour les tailles d'image impaires et le nombre impair de colonnes
la source
os
etc. à n'importe quelle autre lettre de l'alphabet! Et pourquoi ne pas simplement réécrire l'image sur l'image d'entréef
pour sauvegarder le toutstrcat
? (que, incidemment, vous pouvez remplacer par['',...]
plutôt questrcat(...)
)Langue Wolfram,
134,127,119111 octetsCrée une fonction
f
qui prend une image comme première entrée (comme symbole dans Mathematica ou Wolfram Cloud) et un entier comme deuxième entrée.Non golfé :
Techniquement, cela ne fonctionnera pas correctement si l'une des dimensions de l'image dépasse 362 880 pixels, mais je suppose que c'est correct, car c'est bien en dehors de la portée du problème (et de certains ordinateurs).Fixé!la source
PHP, 206 octets
prend trois arguments de ligne de commande: nom du fichier source, nombre de lignes à rogner et nom du fichier cible. Courez avec
-r
.Vous voudrez peut-être utiliser à la
imagecopyresampled
place deimagecopyresized
(+2 octets) pour un meilleur résultat.non golfé
Je pourrais économiser 9 octets de plus en envoyant le résultat PNG à STDOUT ... mais pour quoi faire?
la source
php -r image.php image.png 1 > output.png
, non?