PostScript 50 binaire, 113 ASCII
Cela utilise une sortie graphique. Hexdump du programme à l'aide de jetons binaires:
$ hexdump -C textRect_binary.ps
00000000 74 5b 30 20 39 5b 74 92 62 34 92 36 92 38 92 10 |t[0 9[t.b4.6.8..|
00000010 32 92 19 5d 7b 92 2c 7b 32 92 19 7d 92 83 92 3e |2..]{.,{2..}...>|
00000020 92 6e 7d 92 49 5d 39 20 39 92 6b 91 c7 39 92 8e |.n}.I]9 9.k..9..|
00000030 92 c3 |..|
00000032
Téléchargez pour l'essayer . À l'aide de Ghostscript, le texte à rendre peut être transmis au programme comme suit:
gs -st=helloworld textRect_binary.ps
La sortie graphique ressemble à ceci:
Le même code utilisant des jetons ASCII ressemble à ceci:
t[0 9[t length
4 div dup
ceiling
2 copy]{cvi{2 copy}repeat
exch neg}forall]9 9 moveto/Courier 9 selectfont
xyshow
La stratégie est d'utiliser xyshow
pour définir où nous nous déplaçons après avoir montré chaque personnage avant de montrer le personnage suivant. Nous commençons dans le coin inférieur gauche, nous allons dans le sens des aiguilles d'une montre, c'est-à-dire d'abord vers le haut, puis à droite, puis vers le bas puis à gauche. Nous déplaçons toujours 9 unités, nous avons donc d'abord un mouvement relatif de 0 9
, puis 9 0
, ensuite 0 -9
, ensuite -9 0
. On peut passer d'une paire de ces nombres à l'autre avec la séquence exch neg
.
Nous devons construire un tableau pour xyshow
contenir ces paires de nombres, une paire pour chaque caractère. Cela signifie que si nous avons helloworld
comme chaîne d'exemple, qui a 10 caractères, nous voulons monter deux fois, puis trois fois à droite, puis deux fois à gauche et trois fois à gauche. Nous obtenons ces valeurs (deux et trois) en divisant la longueur de la chaîne par 8, une fois arrondie au sol, une fois au plafond.
Donc, nous copions 0 9
deux fois, puis passons aux coordonnées x / y relatives en utilisant exch neg
, copions ces trois fois et ainsi de suite.
Ce code commenté montre ce qui se passe sur la pile:
t[0 9 % t [ 0 9
[t length % t [ 0 9 [ length
4 div dup % t [ 0 9 [ length/4 length/4
ceiling % t [ 0 9 [ length/4=height width
2 copy] % t [ 0 9 [height width height width]
{%forall % t [ 0 9 ... x y height_or_width
cvi % t [ 0 9 ... x y height_or_width_integer
{2 copy} % t [ 0 9 ... x y height_or_width_integer {2 copy}
repeat % t [ 0 9 ... x y .. x y
exch neg % t [ 0 9 ... x y .. y -x
}forall] % t [0 9 ... -9 0]
9 9 moveto/Courier 9 selectfont
xyshow
xyshow
? Heureux de vous présenter celui-ci - il y a quelque temps, vous m'avez présentékshow
, dont je n'étais pas vraiment au courant ;-).Ruby
112100Je suis nouveau à Ruby et c'est mon premier golf à code. J'ai puisé dans l'implémentation de perl de memowe et essayé d'en faire une version Ruby. Il s'agit de
112100 caractères et suppose que vous affectez une chaîne à x. Au plaisir de voir les autres.Modifié pour implémenter les suggestions. Je pense que c'est maintenant 100 caractères. Merci les gars!
la source
x.length
parx.size
(Enregistre 2 caractères)puts x[0..w=l/2-h=l/4]
.Perl (
124118109 + 3 = 112)C'était autrefois assez simple. Compter toutes les options de ligne de commande comme 1 caractère chacune.
Exemple:
la source
(@s-$h*2)/2 == @s/2-$h
(2)$w
peut être représenté comme$w=(@s=split//)/2-($h=int@s/4);
, sauvant ainsi deux points - virgules$"
–saves 1 char. (2)$w+$h == @s/2
–enregistre 1 caractère. (3) Si$w
est plus petit de un, nous pouvons simplifier$"x($w-1)
. Pour cela, le$_
doit être augmenté de 1. Enregistre comme 3 caractères. (4) Le dernier point-virgule est überflüssig, enregistre 1 car. Cela conduit au fragment de codesay@s[0..$w--];say$s[1-$_].$"x$w.$s[$w+$_]for+2..$h;say+reverse@s[@s/2..@s-$h]
(avec quelques-uns+
pour le plaisir, donc il n'y a plus un seul espace).Brainfuck -
194187la source
Mathematica
156 199344Éditer : Il s'agit d'une réécriture majeure du code précédent. Il fonctionne essentiellement de la même manière, mais prend maintenant en entrée une chaîne de longueur <120 caractères et dimensionne automatiquement le carré.
Il pourrait encore être un peu joué au golf, mais ne descendra pas à la taille des versions antérieures et plus bogues.
Exemples
la source
Perl + Regexes: 104 (101 + 3)
(code de comptage + interrupteurs)
Voici une solution utilisant de jolies Regexes et un peu de Perl:
Cela ne fonctionnera correctement que sur un ligne d'entrée.
Inspiré par memowe, mais essentiellement sans tableau.
la source
echo thisworksgreat | perl -plE'$w=($l=length)/2-($h=int$l/4);s/..{$w}\K.*/"\n".reverse$&/e;$"x=--$w;s/.\K(.*)(.)$/$"$2\n$1/while--$h'
PostScript (106)
Ceci est inspiré par la solution Mathematica de mec .
Avec Ghostscript, appelez cela comme
Il produit une sortie comme.
Il utilise
kshow
pour afficher les glyphes un par un. Après avoir montré suffisamment de glyphes pour un côté, tout est tourné de -90 degrés avant de continuer avec les glyphes restants.Pour savoir quand suffisamment de glyphes ont été affichés sur le côté, nous incrémentons un compteur de 4 chaque fois qu'un glyphe est affiché. Si la valeur du compteur modulo la longueur de la chaîne est inférieure à 4, alors nous savons que nous devons tourner:
Code source commenté et non golfé:
la source
Python 2.x: 137
Je suis nouveau dans le code du golf et je suis sûr que cela peut être amélioré…
Code de test visuel:
Quelque chose d'intérêt: Cette solution dépend des mathématiques entières. Si vous faites simplement le calcul symboliquement, vous le trouverez
h=(c-w-w)/2 => h=w-2
, mais si vous remplacez ce résultat, tous les autres résultats manqueront deux caractères en bas à gauche.la source
K, 84
.
la source
Scala (135)
L'extrait suivant suppose que
x
contient la chaîne à formater et doit être collé dans le scala REPL:Si vous n'avez pas installé scala, vous pouvez le vérifier rapidement en utilisant cet interpréteur Scala en ligne: http://www.simplyscala.com/ . Collez simplement le texte suivant et appuyez sur Évaluer:
la source
Python 3 (120)
Tester
contribution:
production:
la source
PHP (149)
Le texte à imprimer doit être dans une variable nommée
$x
.la source
Python2.7 (99)
Edit: Il viole apparemment la règle de la zone maximale à l'intérieur.
la source
JAVA - 320
Remarque: - L' entrée provient de la ligne de commande
Entrée: - HelloWorld
Production : -
Entrée: - abcdefghijklmnopqrstuvwxyz
Production : -
la source