La tâche consiste à afficher n caractères de la table ASCII .
Vous pouvez écrire une fonction (ou un programme qui prend l'argument comme paramètre, STDIN est également autorisé) qui prend un paramètre n , qui sera l'index du dernier caractère à imprimer.
La tâche est assez simple, donc à titre d'exemple, voici une implémentation possible en Python 2.7:
(lambda n:map(chr, range(n)))(256)
Comme je l'ai dit, c'est une tâche simple. Il s'agit donc de code-golf et les codes les plus courts gagnent!
MODIFIER
Comme certains d'entre vous l'ont souligné, ce code n'imprime pas le résultat. C'est juste un exemple car je pourrais avoir du mal à expliquer le problème en anglais ;-).
EDIT2
N'hésitez pas à publier la réponse dans n'importe quel langage de programmation, même si ce n'est pas le code le plus court. Il existe peut-être des implémentations intéressantes!
EDIT3
Correction de l'exemple pour qu'il imprime le résultat.
for x in range(input()):print chr(x)
Imprime en fait les caractères, si vous souhaitez modifier votre exemple.[i for i in range(n)]
est assez similaire àrange(n)
Réponses:
CJam, 4 octets
Programme complet qui lit à partir de STDIN (champ de saisie dans l' interpréteur en ligne ).
Cela s'exécute simplement
range(chr(int(input())))
, profitant du fait que,
renvoie un tableau de caractères si son argument est un caractère.J'appelle dibs on
c,
(2 octets), juste au cas où en supposant que l'entrée est déjà sur la pile se révèle être autorisée.la source
n
, car les premières dizaines de caractères ASCII sont des caractères non imprimables. Fait amusant: ce programmebrainfuck -
169146142 octetsLimites:
Pas la réponse la plus courte ici, mais bon, enculé! Ce serait un défi vraiment, vraiment bon, sauf pour le fait qu'il nécessite une entrée lisible par l'homme sans garantir le nombre de chiffres. J'aurais pu exiger une entrée pour avoir des zéros de tête pour faire 3 caractères de long, mais quel plaisir est-ce? : D Un problème majeur avec la prise d'entrée de cette façon est que la seule structure de branchement ou de boucle de brainfuck vérifie si la cellule actuelle est nulle ou non. Lorsque l'entrée peut contenir des zéros, votre code peut prendre des branches qu'il ne devrait pas prendre. Pour résoudre ce problème, je stocke chaque chiffre d'entrée plus 1 , puis soustrais l'excédent à la dernière seconde possible. De cette façon, je sais toujours où sont mes zéros.
J'ai dit que cela aurait été un grand défi de réflexion sans avoir à analyser les entrées. Pourquoi donc? Eh bien, supposons que nous ne prenons pas de saisie numérique. Nous dirons que le défi est "Étant donné un octet d'entrée, sortez tous les caractères ASCII en dessous de cet octet". Voici ma réponse:
brainfuck - 8 octets
C'est toute une différence! Le vrai programme utilise 135 instructions pour collecter l'entrée (plus de 95% du programme!), Simplement parce que c'est un humain qui la tape. Enregistrez le numéro sous forme d'octet et donnez - le-moi, et cela ne prend qu'un seul.
(Fait amusant: si vous avez compris le programme hypothétique, alors félicitations! Vous comprenez le brainfuck dans son intégralité. La langue entière n'a que huit commandes, et ce programme arrive à utiliser chacune une seule fois.)
Explication
la source
>[-]<[->.+<]
définissez la cellule à côté de la cellule actuelle sur 0, puis comptez à rebours la cellule actuelle tout en augmentant la cellule à côté et en imprimant simultanément la valeur.>[-]<
pièce car j'étais déjà à côté d'une cellule vide. :)Pyth , 4 octets
Fondamentalement, une traduction du programme Python 3:
la source
Befunge 93 -
vingt-trois21Befunge 93 -
1513 (par Ingo Bürk)Celui-ci imprime la liste à l'envers, mais OP a seulement dit que nous devons imprimer les premiers
n
caractères, pas que cela doit être en ordre.Pourrait ne plus être jouable au golf sans passer à Befunge98 (pour l'opérateur ";", voir la réponse de @ Kasran )
Essayez-le ici:
Afficher l'extrait de code
la source
&> #- #1:# :#,_@
(il l'imprime simplement à l'envers)Java,
151128776256 octetsEssayez d'abord le golf par code.
Usage:
Merci à @Shujal, @flawr, @Ingo Bürk et @Loovjo pour la sérieuse réduction d'octets.
la source
int i,n=new Scanner(...
et en changeant la boucle enfor(;++i<n;)
. De plus, vous n'avez pas besoin d'invoquerCharacter.toString
. Vous pouvez simplement fournir à System.out une valeur char et il la restituera avec plaisir.a
entrée. Et je pense que vous pouvez raccourcir lafor
boucle en abusant de la place de l'incrément en tant que corps de boucle:for(;++i<n;System.out.print((char)i));
(mais vous devrez peut-être modifier l'initialisation ou la valeur finale de + - 1)++i<n+1
devrait être équivalent à++i<=n
. Notez le=
dedans, cependant! Il enregistre juste un octet. Ça marche pour moi.void f(int n){int i=0;for(;++i<=n;System.out.print((char)i));}
62 octets. Au moins, je ne vois plus de golf maintenant. :)APL, 5
Exemple d'utilisation:
la source
JavaScript, ES6 -
525856534442 octetsCollez-le dans la console Firefox. Exécuter en tant que
f(NUM)
.J'ai dû l'allonger car le premier n'acceptait pas correctement les entrées.Down 3, merci edc65! Jusqu'à 44 grâce à Swivel!
la source
f=n=>String.fromCharCode(...Array(n).keys())
Haskell,
1723 octetsJe ne sais pas s'il est possible de faire mieux sans importations.
modifier
Ma première solution n'a pas réellement imprimé le résultat, alors autorisez 6 caractères supplémentaires pour cela:
De plus, pas plus court (25 caractères avec impression, 19 sans), mais une approche alternative intéressante (elle nécessite cependant 'Data.List'):
la source
(`take`['\0'..])
enregistre un octet.Utilitaires communs Bash + BSD, 9 octets
GNU dc, 20 octets
la source
C,
31302827Puisque le putch n'est pas standard, voici la version entièrement conforme:
Doit être appelé depuis le principal:
EDIT: amélioré en profitant de la valeur de retour de putchar
EDIT 2: réduit par un autre personnage par récursivité
la source
Perl, 17 octets
la source
print chr for 0..$ARGV[0]
shift
au lieu de$ARGV[0]
pour enregistrer 2 octets.say
. En outre, le nombre de caractères est plus court si vous le faites en une ligne avec-n
.echo "90" | perl -nE'say chr for 0..$_'
compterait comme des18
caractères.17
poursay chr for 0..$_
plus1
pour len
.say
ne fonctionnera pas avec toutes les versions de perl.CJam, 3
J'ai supposé que l'argument était l'élément de pile supérieur.
Exemple d'utilisation:
la source
Ruby, 30 caractères
la source
awk - 27
Pour donner le paramètre sur stdin, exécutez-le comme:
Juste pour le plaisir: la "version positive" à partir d'une version définitive
yes
:NR-1
est nécessaire pour imprimer(char)0
pourNR==1
. :-(Et pourquoi n'avons-nous pas de
no
commande? C'est un peu méchant!la source
alias no='yes no'
J - 5 octets
{.
est Head,a.
est Alphabet (une liste de tous les caractères) et les&
lie, générant un verbe monadique appelé comme:Remarque : Il semble que cela ne fonctionne pas de manière interactive: Jconsole et jQt semblent mettre en place une traduction, produisant des caractères de boîte au lieu de certains caractères de contrôle. Dans un script ou à partir de la ligne de commande, cela fonctionne cependant:
la source
{.&a. 127
, ce n'est pas?char
ou équivalentes.gs2, 2 octets
Cela devrait être en compétition, je pense! Cela aurait fonctionné même dans les premiers jours de gs2. Essayez-le ici.
la source
Brainfuck, 44 octets
Attend une chaîne décimale sans retour à la ligne.
Essayez-le en ligne.
La lecture d'entiers dans la gamme
[0, max_cell_size]
de brainfuck n'est pas difficile. Je vous encourage à inventer vous-même une méthode propre. Je considère que c'est un exercice de niveau débutant. (L'opération inverse de l'impression de la valeur numérique d'une cellule est plus complexe et pourrait être considérée comme une tâche de niveau intermédiaire.)Voici une version de 58 octets qui peut gérer
256
les implémentations 8 bits:la source
Golfscript - 5
Merci à @Dennis
la source
~,""+
est plus court et traite correctement les entrées de STDIN.;"65"
, car l'entrée de STDIN sera toujours une chaîne.Lua -
4341 octetsla source
a=""for i=1,arg[1]do print(a.char(i))end
for i=1,arg[1]do print(("").char(i))end
Befunge 98, 22
Un peu triste que ce soit si long.
la source
Python 3.4 - 36 octets / 43 octets
255 entrée ()
Comment cela fonctionne:
Le second supprime simplement l'espace séparant chaque caractère en échange de 7 octets.
la source
map
retourne une liste, donc vous pouvez simplement le fairef=lambda i:map(chr,range(i))
Pascal 87
Pascal 73
Construit et fonctionne correctement à partir de http://www.onlinecompiler.net/pascal
la source
var c,n:byte;begin read(n);for c:=0to n do write(chr(c))end.
pastebin.com/aFLVTuvhx86 ASM (Linux) (beaucoup d'octets sauf si vous le compilez)
Écrit en tant que fonction, suppose que le paramètre est passé dans AX (j'oublie le numéro de l'appel système lu) Ne préserve pas non plus [SP] ou BX.
la source
Perl - 29
la source
Rubis, 23
Explication
*
) invoque#to_ary
sur la plage pour imprimer chaque caractère sur sa propre ligne.la source
Julia: 20 caractères (REPL)
Ceci est proche de l'exemple de la question: génère simplement les personnages et laisse le REPL faire ce qu'il veut avec eux.
Julia: 33 personnages
Imprime chaque caractère sur une ligne distincte.
la source
M (MUMPS) - 21
R n F i=1:1:n W $C(i)
Sous forme développée:
READ n FOR i=1:1:n WRITE $CHAR(i)
la source
T-SQL:
6863En boucle d'impression
T-SQL:
9586Comme une requête
Modifier: apporté des modifications et des correctifs signalés par Muqo. Merci. Corrections et golf suggérées par @ t-clausen.dk
la source
GOTO
avec étiquette. Pour la requête, spécifiez peut-êtremsdb.sys.objects
pour garantir suffisamment d'objets. En outre, il ne génère pas CHAR (0). Cependant, comme consolation, vous pouvezORDER BY @
.Brainfuck -
140112 OctetsEssayez-le ici!
28 octets enregistrés en changeant
[<<<->>>->+<]>[<<<->>>->+<]>[<<<->>>-]
pour[<<<->->->-]
.Ce qu'il fait
la source
Keg , 4 octets (SBCS)
TIO
Entrée push, sortie table ASCII.
la source