Contexte
L'art ASCII est la pratique de créer des images en utilisant du texte ASCII pour former des formes.
L'aliasing est l'effet créé par les grands "pixels" de l'art ASCII, qui correspondent à la taille des caractères. L'image devient bouchée et difficile à voir. L'anti-aliasing supprime cet effet en créant un dégradé et en adoucissant les contours de l'art ASCII.
Le défi
Votre défi est d’écrire le programme le plus court possible qui prendra un morceau d’art ASCII et produira une version anti-aliasée.
Quelle sorte d'anti-aliasing?
Tout l'art ASCII se composera de deux types de symboles: Espaces et non-blancs. Pour chaque caractère non-blanc, votre programme doit déterminer s'il est dans une position où il doit être anti-aliasé. Si c'est le cas, vous devez le remplacer par le caractère correct. Si ce n'est pas le cas, le personnage reste le même.
Comment savoir si un personnage doit être anti-aliasé? La réponse dépend des caractères qui se trouvent immédiatement au-dessus, en dessous, à gauche et à droite du caractère ( pas les diagonales ). Voici un tableau indiquant les cas où l’anti-aliasing est requis, où ?
et x
peut signifier tout caractère non-blanc.
x? -> d?
? ?
?x -> ?b
? ?
? ?
?x -> ?F
? ?
x? -> Y?
x -> ; Note: This character has been changed from _ to ;
? ?
? ?
x -> V
?x -> ?>
x? -> <?
x -> @
Entrée (et exemple d'art ASCII pré-anti-aliasing)
Tout d'abord, il y aura deux lignes d'entrée (à STDIN), un nombre H suivi d'un nombre W. Il y aura ensuite des lignes H de caractères exactement W (à l'exception de la nouvelle ligne). Les lignes suivantes constitueront l’art ASCII qui doit être anti-aliasé. Voici un exemple d'entrée (pas beau, mais un test):
7
9
888888
888888
999 98 7
666666
666666
6666
6
Sortie (et exemple d'art anti-aliasé)
Votre programme doit sortir vers STDOUT l’art ASCII (de mêmes dimensions), qui a été anti-aliasé. Voici la sortie pour l'entrée ci-dessus. Notez que les caractères de bordure sont traités comme des espaces blancs.
d8888>
d8888F
<99 98 @
Y6666b
Y6666>
Y66F
V
Cela peut ne pas sembler très bon (en raison de l'espace entre les lignes du bloc de code), il est plus esthétique avec les illustrations ASCII plus volumineuses et la qualité dépend de la police utilisée.
Un autre exemple
Contribution
12
18
xx xxx xxx
xxxx xxx xxx
xxxxxx xxx xxx
xxx xxx xxx xxx
xxxx xxx xxx xxx
xxxxxx xxx xxx
xxxx xxx xxx
x xx xxx xxx x
xx xxx xxx xx
xxx xxx xxx xxx
xxxx xxx xxx xx
xxxxx xxx xxx x
Sortie
db <xb <xb
dxxb Yxb Yxb
dxxxxb Yxb Yxb
dxx xxb xxb xxb
Yxxb xxF xxF xxF
YxxxxF dxF dxF
YxxF dxF dxF
; YF dxF dxF ;
xb dxF dxF dx
xxb <xF <xF <xx
xxxb Yxb Yxb Yx
Yxxx> Yx> Yx> V
Règles, restrictions et notes
Votre programme doit être écrit en caractères ASCII imprimables uniquement, afin que nous puissions en faire des oeuvres. Autre que cela, les règles standard de code-golf s'appliquent.
la source
_
est devenu;
parce que ça marche mieux.Réponses:
Ruby,
180168 caractèresUne autre implémentation de Ruby qui adopte une approche zip. Vous pouvez voir le deuxième exemple en cours d'exécution en ligne .
Edit: Utiliser
readlines
enregistre 12 caractères.la source
Ruby
275265263261258254244243214212207Exemple 1: http://ideone.com/PfNMA
Exemple 2: http://ideone.com/sWijD
la source
0..h-1
peut être écrit comme0...h
. 3)G=[];h.times{G<<gets}
peut être écrit de laG=readlines
même manière que dans votre code C #. 4) Après l'étape 3. la variable h devient inutile, les valeurs de h et w ne sont utilisées qu'une seule fois eth=gets.to_i;w=gets.to_i;H=(0..h-1);W=(0..w-1)
peuvent donc être écrites commeH=0...gets.to_i;W=0...gets.to_i
. 5) Dans ce cas, vousand
pouvez écrire en tant que&&
, ce qui ne nécessite pas d'espaces autour. 6) vous avez un extra; et vous avez compté la nouvelle ligne à la fin du fichier, ce qui n'est pas nécessaire. Cela signifie 214 caractères: ideone.com/CiW0lH=0..gets.to_i
quand j'avais écrit le code, mais cela ne semblait pas fonctionner (évidemment, cela devait être pour d'autres raisons).map
au lieu deeach
2)z=->...
au lieu dedef z...end
.map
au lieu deeach
changement. Pour la syntaxe lambda, cependant, je pense que cela exigerait que les utilisations dez
soient de la formez.call(args)
au lieu dez(args)
, ajoutant ainsi un bit au nombre de caractères. S'il vous plaît laissez-moi savoir si je manque quelque chose.[]
utilisation de Lambda .Javascript, 410 caractères:
ungolfed:
Original,
440 caractères:NB J'ai supposé que les deux premières lignes d'entrée étaient en réalité sans importance et que la taille des lignes suivantes était correcte. Je pense aussi que je pourrais peut-être couper quelques caractères de plus quand j'en aurai l'occasion!
la source
m={22:"b",28:"d",13:"Y",7:"F",20:";",5:"V",6:">",12:"<",4:"@"}
l'indice de puis le convertir m avecparseInt()
:m[parseInt(y[d](''),2)]
. Cela réduit la taille à 373 caractères.Python, 259 caractères
Le programme lit l'entrée dans une chaîne unique
I
(avec des espaces séparant les lignes), compresse une liste de 5 tuples contenant le caractère et ses quatre caractères environnants, puis recherche le caractère obtenu à l'aide de l'indexation de chaîne.la source
PHP -
359330282268257 caractèresla source
\r\n
. J'ai mis à jour mon code pour qu'il fonctionne avec le style unix EOL\n
.Python,
246241WC et test sur l'échantillon 2, avec la sortie de la solution de Ruby au sommet:
la source
C #
591563la source