Das Problem:
Diese Herausforderung kommt von einem echten Problem, das ich hatte. Ich habe ein Dual-Monitor-Setup bei der Arbeit und wollte das folgende Bild als Hintergrundbild verwenden:
Meine Monitore haben jedoch ziemlich bedeutende Einfassungen, und wenn ich meinen Hintergrund einstelle, sieht es ungefähr so aus, als ob der Pier (Appiers?) Gebrochen zu sein scheint:
Ich konnte dies lösen, indem ich ein Bild mit ausgeschnittener Mitte machte und es dann wieder auf die ursprüngliche Größe streckte, wie im Bild unten:
Die Herausforderung:
Schreiben Sie ein Programm, das ein Bild aufnimmt und es für die Verwendung mit einem Dual-Monitor-Setup "überwacht" (dh löscht den mittleren Bereich des Bildes, in dem sich die Rahmen befinden). Die Regeln lauten wie folgt:
- Es muss ein vollständiges Programm sein, das das Bild entweder als Pfad (Zeichenfolgenargument usw.) oder in Form eines Dateiauswahldialogs akzeptiert.
- Das Programm muss die Anzahl der vertikalen Linien (ein Pixel breit) als Eingabe verwenden, um aus der Bildmitte herauszuschneiden
- Das Zuschneiden muss von der Mitte (in der Breite) des Originalbilds erfolgen
- Das resultierende Bild muss auf die ursprüngliche Größe des Eingabebildes zurückskaliert werden. (Entweder können die Hälften einzeln skaliert und dann verkettet oder verkettet und dann skaliert werden. Die individuelle Skalierung erzeugt ein besseres Bild / einen besseren Effekt, ist jedoch in der realen Welt kaum wahrnehmbar.)
- Hintergrundbilder sind im Allgemeinen gerade. Um diese Herausforderung zu vereinfachen, haben Eingabebilder nur eine gerade Anzahl von Pixeln und die Anzahl der zu entfernenden Zeilen ist ebenfalls gerade.
- Diese Herausforderung ist Code Golf - der kürzeste Code in Bytes gewinnt
Viel Glück!
quelle
Antworten:
Oktave, 85 Bytes
Definiert eine anonyme Funktion mit
f
dem Dateinamen undn
der Anzahl der zu entfernenden Spalten. Da für eine anonyme Funktion ein einzelner Ausdruck erforderlich ist, wird die Inline-Zuweisung verwendet, eine Funktion, die in MATLAB nicht vorhanden ist.MATLAB, 98 Bytes
Als Bonus habe ich auch eine MATLAB-kompatible Antwort gespielt. Interessanterweise ist dies nur 13 Byte länger, da die Octave-Version viele Klammern benötigt, um die Inline-Zuweisungen korrekt zu analysieren.
quelle
Matlab 2013, 150 Bytes
Hier ist mein Versuch in Matlab. Wird definitiv nicht der kürzeste Code sein, aber es ist ein Anfang.
Achtung, dies überschreibt das Originalbild. Erstellen Sie daher zuerst eine Kopie.
Golfversion
Ungolfed Code mit Verbesserungen für ungerade Bildgrößen und ungerade Anzahl von Spalten
quelle
os
etc. für jeden anderen Buchstaben im Alphabet! Und warum nicht einfach das Bild zurück in das Eingabebild schreibenf
, um das Ganze zu speichernstrcat
? (die Sie übrigens['',...]
eher durch als ersetzen könnenstrcat(...)
)Wolfram Language,
134,127,119,111 ByteErstellt eine Funktion
f
, die ein Bild als erste Eingabe (als Symbol in Mathematica oder der Wolfram Cloud) und eine Ganzzahl als zweite Eingabe verwendet.Ungolfed :
Technisch gesehen funktioniert es nicht richtig, wenn eine der Bildabmessungen 362.880 Pixel überschreitet, aber ich gehe davon aus, dass dies in Ordnung ist, da dies weit außerhalb des Bereichs des Problems (und einiger Computer) liegt.Fest!quelle
PHP, 206 Bytes
Es werden drei Befehlszeilenargumente verwendet: Name der Quelldatei, Anzahl der zu beschneidenden Zeilen und Zieldateiname. Laufen Sie mit
-r
.Möglicherweise möchten Sie
imagecopyresampled
anstelle vonimagecopyresized
(+2 Byte) ein besseres Ergebnis erzielen.ungolfed
Ich könnte 9 weitere Bytes sparen, indem ich das PNG-Ergebnis an STDOUT sende ... aber wozu?
quelle
php -r image.php image.png 1 > output.png
, oder?