Imprima la tabla ASCII

28

La tarea es mostrar n caracteres de la tabla ASCII .

Puede escribir una función (o un programa que tome el argumento como parámetro, también se permite STDIN) que tome un parámetro n , que será el índice del último carácter a imprimir.

La tarea es bastante simple, así que a modo de ejemplo, aquí hay una posible implementación en Python 2.7:

(lambda n:map(chr, range(n)))(256)

Como dije, es una tarea simple. ¡Así que este es el código de golf y gana el código más corto!

EDITAR

Como algunos de ustedes señalaron, este código no imprime el resultado. Es solo un ejemplo, ya que podría tener dificultades para explicar el problema en inglés ;-).

EDIT2

Siéntase libre de publicar la respuesta en cualquier lenguaje de programación, incluso si no es el código más corto. ¡Tal vez hay algunas implementaciones interesantes por ahí!

EDITAR3

Se corrigió el ejemplo para que imprima el resultado.

oopbase
fuente
1. ¿Tiene que ser una función? 2. Según su código de referencia, n sería el primer carácter que no se imprime.
Dennis
2
En realidad, el código de referencia no imprime nada. Simplemente devuelve una lista de los personajes y permite que REPL haga lo que quiera con el resultado.
manatwork
1
¿Alguien puede explicar el voto negativo? Lo siento si mi inglés no es tan bueno. Si hay algo poco claro dentro de la pregunta, por favor dígame.
oopbase
1
for x in range(input()):print chr(x)Realmente imprimiría los caracteres, si desea editar su ejemplo.
FryAmTheEggman
2
nota [i for i in range(n)]es bastante similar arange(n)
njzk2 28/10

Respuestas:

19

CJam, 4 bytes

ric,

Programa completo que lee desde STDIN (campo de entrada en el intérprete en línea ).

Esto simplemente se ejecuta range(chr(int(input()))), aprovechando el hecho de que ,devuelve una matriz de caracteres si su argumento es un carácter.

Llamo a dibs en c,(2 bytes), en caso de que se suponga que la entrada ya está en la pila está permitida.

Dennis
fuente
¿Tiene que especificar alguna entrada? El corredor en línea solo genera el código en sí.
manatwork
12
@manatwork: solo un segundo. Tienes que darte prisa cuando publicas estos ...;)
Dennis
Estoy un poco confundido por esto. El carácter en 0 (también conocido como 0c) evita que se imprima cualquier otra cosa después de él. ric, (parece funcionar bien. Esto significa que el código no funciona.
kaine
1
@kaine: Internet Explorer está escrito en C ++, que no utiliza cadenas terminadas en nulo. De acuerdo con esto , los caracteres nulos son errores de análisis en HTML 5; el navegador debe reemplazarlo con o cancelar el procesamiento del documento.
Dennis
44
Tenga en cuenta que debe ingresar un tamaño suficientemente grande n, ya que las primeras docenas de caracteres ASCII son caracteres no imprimibles. Dato curioso: este programa también genera la tabla Unicode, por ejemplo n = 9999
Sanchises
25

brainfuck 169 146 142 bytes

-[+>+[+<]>+]>+>>,[>,]<[<]<[->>[->]<[<]<]>>>[[<[-<+<+<+>>>]+++++++++[<[-<+>]<<[-<+>>>+<<]<[->+<]>>>>-]]<,<<,>[->>>+<<<]>>>---------->]<-[->.+<]

Limitaciones:

  • EOF debe ser 0
  • Requiere celdas de envoltura de 8 bits
  • Debido a ^, mods ingresados ​​por 256

No es la respuesta más corta aquí, pero oye, ¡maldición! Este sería un desafío muy, muy bueno, excepto el hecho de que requiere una entrada legible por el ser humano sin garantizar el número de dígitos. Podría haber requerido una entrada para tener ceros a la izquierda para tener 3 caracteres de largo, pero ¿qué tan divertido es eso? : D Un problema importante con la toma de entrada de esta manera es que la única estructura de ramificación o bucle de brainfuck verifica si la celda actual es cero o no. Cuando la entrada puede contener ceros, puede hacer que su código tome ramas que no debería tomar. Para resolver este problema, almaceno cada dígito de entrada más 1 , luego resto el exceso en el último segundo posible. De esa manera, siempre sé dónde están mis ceros.

Dije que esto habría sido un gran desafío mental sin tener que analizar la entrada. ¿Porqué es eso? Bueno, supongamos que no tomamos una entrada numérica. Diremos que el desafío es "Dado un byte de entrada, genera todos los caracteres ASCII debajo de ese byte". Aquí está mi respuesta sería:


brainfuck - 8 bytes

,[->.+<]

¡Es una gran diferencia! El programa real usa 135 instrucciones para recopilar la entrada (¡más del 95% del programa!), Solo porque es un humano escribiéndolo. Almacenar el número como un byte y dar que a mí, y sólo se necesita una.

(Dato curioso: si entendiste el programa hipotético, ¡entonces felicidades! Entiendes brainfuck en su totalidad. Todo el lenguaje tiene solo ocho comandos, y ese programa usa cada uno exactamente una vez).

Explicación

-[+>+[+<]>+]>+               abuse 8 bit wrapping to put 47 in cell 4

>>,[>,]                      starting in cell 6; get each character of input

<[<]<[->>[->]<[<]<]          subtract the value of cell 4 from each input character
                             '0' has an ascii value of 47 so subtracting 47 from each
                             digit gives you that digit's value plus 1

>>>[                         if the number is in more than one cell
                             (when the program first starts this means "if the input has
                             more than one digit")

[<[-<+<+<+>>>]               copy first input cell to 3 new cells

+++++++++[<[-<+>]<<          do some fancy addition magic to multiply that value by 10
[-<+>>>+<<]<[->+<]>>>>-]]

<,<<,>                       clean up a bit (abusing comma to set cells to 0)

[->>>+<<<]>>>                add the value to the next cell of input

----------                   because we multiplied (the digit plus 1) by 10; the answer
                             is 10 too high; so subtract 10

>]                           if the input is still in multiple cells; do the song and
                             dance again (multiply by 10; add to next cell; subtract 10)

<-                           we never got a chance to fix the final digit; so it's still 1
                             too high

               ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
               ;;         we have now finished processing input         ;;
               ;;     the tape is empty except for the current cell     ;;
               ;;  the current cell contains the number that was input  ;;
               ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[                            while the cell containing input != 0

-                            subtract 1 from it

>.+                          go a cell to the right; output that cell; then add 1

<]                           repeat
metro subterráneo
fuente
¡Agradable! Definitivamente +1 por el esfuerzo :-)
oopbase
1
Puede guardar algunos bytes en la parte de salida: >[-]<[->.+<]establezca la celda junto a la celda actual en 0, luego haga una cuenta regresiva de la celda actual mientras aumenta la celda al lado e imprime simultáneamente el valor.
Shujal
@shu ¡Ese es un excelente punto! No pensé en eso en absoluto. Además de ser más corto, soluciona el problema que tuve al atragantarme con entradas grandes y ¡probablemente sea más rápido! Gracias :)
undergroundmonorail
Sí, es mucho, mucho más rápido ahora. Tampoco necesitaba la >[-]<parte porque ya estaba al lado de una celda vacía. :)
undergroundmonorail
1
Además, su segunda respuesta es válida.
Esolanging Fruit
12

Pyth , 4 bytes

VQCN

Básicamente, una traducción del programa Python 3:

for N in range(eval(input())):print(chr(N))
FryAmTheEggman
fuente
11

Befunge 93 - 23 21

&> :#v_,>:#,_@
 ^-1:<

Befunge 93 - 15 13 (por Ingo Bürk)

Este imprime la lista al revés, pero OP solo dijo que necesitamos imprimir los primeros ncaracteres, no es que tenga que estar en orden.

&>::>v
@^-1,_

No podría seguir siendo golfable sin pasar a Befunge98 (para el operador ";", vea la respuesta de @ Kasran )

Pruébalo aquí:

karhell
fuente
Espero que no te importe que haya usado un intérprete en línea desde aquí :)
Ingo Bürk
La pregunta no indica que debemos imprimirlo en ningún orden, por lo que esto es cinco bytes más corto: &> #- #1:# :#,_@(solo lo imprime al revés)
Ingo Bürk
Eliminé otros bytes para un total de 15. Debido a las nuevas líneas, lo editaré en tu publicación.
Ingo Bürk
Bien jugado en el golf extra :) En cuanto al intérprete en línea, no sabía que había uno. Es genial, gracias :)
karhell
El intérprete es nuevo desde el desafío vinculado. Solo pensé en usarlo cuando vi tu respuesta. :)
Ingo Bürk
8

Java, 151 128 77 62 56 bytes

Primero intente en el golf de código.

void f(int n){for(char i=0;++i<=n;System.out.print(i));}

Uso:

import java.util.Scanner;
class A {

    public static void main(String[] a) {
        int num = new Scanner(System.in).nextInt();
        new A().f(num);
    }

    void f(int n) {
        for (char i = 0; ++i <= n; System.out.print(i));
    }
}

Gracias a @Shujal, @flawr, @Ingo Bürk y @Loovjo por la seria reducción de bytes.

Rodolfo Dias
fuente
1
Puede guardar algunos caracteres declarando int mientras abre el escáner: int i,n=new Scanner(...y cambiando el ciclo a for(;++i<n;). Además, no necesita invocar Character.toString. Simplemente puede alimentar System.out con un valor de char y felizmente lo generará.
Shujal
1
El desafío permite el uso de su acomo entrada. Y creo que puede acortar el forbucle abusando del lugar de incremento como cuerpo del bucle: for(;++i<n;System.out.print((char)i));(pero puede que tenga que cambiar la inicialización o el valor final en + - 1)
error
1
Se le permite escribir una función, por lo que no necesita una clase completa y todo.
Ingo Bürk
1
@RodolfoDias ¿Estás seguro? Obviamente, ++i<n+1debería ser equivalente a ++i<=n. Tenga =en cuenta el allí, sin embargo! Solo ahorra un byte. Esto funciona para mi.
Ingo Bürk
1
Entonces llegamos a void f(int n){int i=0;for(;++i<=n;System.out.print((char)i));}62 bytes. Al menos no veo más al golf ahora. :)
Ingo Bürk
6

APL, 5

⎕UCS⍳

Ejemplo de uso:

⎕UCS⍳256
Shujal
fuente
1
No tienes que hacer un dfn. Solo ⎕UCS⍳ funcionaría bien. Así que 5 caracteres
Moris Zucca
1
No tiene que admitir puntos de código superiores a 127. Solo ↑ ⎕AV funcionaría bien. Así que 4 caracteres
Adám
6

JavaScript, ES6 - 52 58 56 53 44 42 bytes

n=>String.fromCharCode(...Array(n).keys())

Pega esto en la consola de Firefox. Corre como f(NUM).

Tuve que hacerlo más largo porque el primero no aceptó correctamente la entrada.

Abajo 3, gracias edc65! ¡Hasta 44 gracias a Swivel!

Scimonster
fuente
1
Esto realmente no maneja ni el parámetro ni la entrada.
manatwork
Simplemente cambie el 70 a un número diferente; Esa es la entrada.
Scimonster
Bien, lo actualicé para tomar entrada, a un costo de 6 bytes.
Scimonster
3
-2: f = n => [... Array (n)]. Map ((v, i) => String.fromCharCode (i))
edc65
2
44 personajes! f=n=>String.fromCharCode(...Array(n).keys())
Giratorio
6

Haskell, 17 23 bytes

flip take['\0'..]

No estoy seguro de si es posible hacerlo mejor sin importaciones.

Editar

Mi primera solución en realidad no imprimió el resultado, así que permita 6 caracteres más para eso:

print.flip take['\0'..]

Además, no más corto (25 caracteres con impresión, 19 sin), pero un enfoque alternativo interesante (aunque requiere 'Data.List'):

print.((inits['\0'..])!!)
Archaephyrryx
fuente
Esto en realidad no imprime el resultado.
nyuszika7h
@ nyuszika7h ahora sí
John Dvorak
(`take`['\0'..])Guarda un byte.
Laikoni
4

Bash + BSD utilidades comunes, 9 bytes

jot -c $1

GNU dc, 20 bytes

?sc_1[1+dPdlc>m]dsmx
Trauma digital
fuente
4

DO, 31 30 28 27

k;f(n){putch(k++)<n&&f(n);}

Dado que putch no es estándar, aquí está la versión totalmente compatible:

k;f(n){putchar(k++)<n&&f(n);}

Debe llamarse desde main:

main(){f(255);}

EDITAR: Mejorado aprovechando el valor de retorno de putchar
EDITAR 2: Reducido por otro personaje a través de la recursividad

takra
fuente
1
putch es una función no estándar. Además, ¿puedo preguntar por qué esta respuesta fue rechazada?
Stuntddude
@Stuntddude Agregaré una versión alternativa que usa putchar, y no tengo idea de por qué esto se rechaza. Después de todo, es uno de los más cortos.
takra
4

Perl, 17 bytes

say chr for 0..$_
Demnogonis
fuente
1
Demasiados paréntesis. print chr for 0..$ARGV[0]
manatwork
¡Tienes razón! Ha pasado un tiempo desde que usé perl
Demnogonis
1
Puede usar en shiftlugar de $ARGV[0]guardar 2 bytes.
nyuszika7h
Si puede imprimir los caracteres en diferentes líneas, puede usar say. Además, el recuento de caracteres es más corto si lo haces de una sola vez -n. echo "90" | perl -nE'say chr for 0..$_'contaría como 18personajes. 17por say chr for 0..$_más 1para el n.
hmatt1
Tienes razón. Pero sayno funcionará con todas las versiones de perl.
Demnogonis
3

CJam, 3

,:c

Supuse que el argumento era el elemento de la pila superior.

Ejemplo de uso:

256,:c

ri,:c
Shujal
fuente
3

Ruby, 30 caracteres.

puts (0..$*[0].to_i).map &:chr
Pomo de la puerta
fuente
3

awk - 27

{while(i<$0)printf"%c",i++}

Para dar el parámetro en stdin, ejecútelo como:

awk '{while(i<$0)printf"%c",i++}' <<<96

Solo por diversión: la "versión positiva" que comienza con un definitivo yes:

yes|head -96|awk '{printf"%c",NR-1}'

NR-1que se necesita para imprimir (char)0para NR==1. :-(

¿Y por qué no tenemos un nocomando? Eso es un poco malo!


fuente
1
alias no='yes no'
nyuszika7h
... pero también tendría que contar los caracteres de esa definición de alias ... :-(
3

J - 5 bytes

{.&a.

{.es Head, a.es Alphabet (una lista de todos los caracteres) y los &une, generando un verbo monádico llamado like:

{.&a. 100 NB. first 100 characters

Nota : Parece que esto no funciona de manera interactiva: Jconsole y jQt parecen configurar una traducción, generando caracteres de cuadro en lugar de algunos caracteres de control. Sin embargo, en un script o desde la línea de comandos, funciona:

  ijconsole <<< '127 {. a.' | hd
jpjacobs
fuente
Tenga en cuenta que el alfabeto no es exactamente ASCII.
FUZxxl
Hasta {.&a. 127, no es?
jpjacobs 01 de
No porque J tiene caracteres de dibujo de recuadro en lugar de algunos de los caracteres de control.
FUZxxl
En realidad, escribir esto en un archivo e inspeccionarlo con un visor hexadecimal me dice que J genera los valores correctos (0x00 0x01, ...). es solo el intérprete J / IDE que interpreta esos valores como caracteres de cuadro de dibujo en lugar de caracteres de control. Hace exactamente lo mismo que todos los demás idiomas que usan charo equivalentes.
jpjacobs 01 de
Eso es extraño porque lo probé en mi caja UNIX y, de hecho, generó caracteres Unicode para algunos de los puntos de código.
FUZxxl
3

gs2, 2 bytes

V.

¡Esto debería estar compitiendo, creo! Hubiera funcionado incluso en los primeros días de gs2. Pruébalo aquí.

Lynn
fuente
1
Probado con éxito con esta versión , que precede el desafío en un mes.
Dennis
3

Brainfuck, 44 bytes

,
[
  <[>++++++++++<-]
  -[>-<-----]
  >+++>,
]
<[>.+<-]

Espera una cadena decimal sin una nueva línea final.

Pruébalo en línea.

Leer números enteros en el rango [0, max_cell_size]de brainfuck no es difícil. Te animo a inventar un método limpio por tu cuenta. Considero que este es un ejercicio para principiantes. (La operación inversa de imprimir el valor numérico de una celda es más complicada y podría considerarse una tarea de nivel intermedio).

Aquí hay una versión de 58 bytes que puede manejar 256implementaciones de 8 bits:

,
[
  <[<+> >++++++++++<-]
  -[>-<-----]
  >+++>,
]
<[>]
-<<[>.]
>[>+.<-]

Mitch Schwartz
fuente
¿Por qué no he pensado en esto? ¡Esto es ingenioso!
FinW
Can I borrow this to use on future answers?
FinW
1
@FinW I'm guessing you don't know about this meta post.
Mitch Schwartz
2

Golfscript - 5

Thanks to @Dennis

~,''+
Beta Decay
fuente
1
~,""+ is shorter and correctly processes input from STDIN.
Dennis
@Dennis That doesn't produce any output for me...
Beta Decay
1
Are you using the online interpeter? To correctly simulate input from STDIN, you have to use, e.g., ;"65", since the input from STDIN will always be a string.
Dennis
1
@Dennis Oh thanks that works now!
Beta Decay
2

Lua - 43 41 Bytes

for i=1,arg[1]do print(string.char(i))end
William Barbosa
fuente
You can shorten this by a byte a=""for i=1,arg[1]do print(a.char(i))end
Digital Veer
You can shorten this by 2 bytes for i=1,arg[1]do print(("").char(i))end
manatwork
2

Befunge 98, 22

&:00pv>0gk,@
0::-1<^j`

Kind of sad that this is so long.

&:00p        ; gets numerical input, stores a copy at cell (0,0)               ;
     v       ; IP goes down                                                    ;

     <       ; IP goes left, so I execute 1-::0`j^                             ;
 ::-1        ; (1-::) subtract one from our number and duplicate it twice      ;
0       `    ; (0`) compare the number with 0, push 1 if greater else 0        ;
     <^j     ; if the result was 0, go up, otherwise continue going left       ;

      >0gk,  ; get the value at cell (0,0), print that many numbers from stack ;
           @ ; terminate program                                               ;
Justin
fuente
2

Python 3.4 - 36 bytes / 43 bytes

print(*map(chr,range(int(input()))))
print(*map(chr,range(int(input()))),sep='')

255 input()

How this works is:

  1. Get upper limit of range
  2. Generate a range of the table.
  3. Map the range to chr function ( takes int, returns ascii ).
  4. Consume the map via splat argument expansion ( number -> character -> print! )

The second one just removes the space separating each character in exchange for 7 bytes.

Full Metal
fuente
You could very much make this into a lambda, as the question states this, and in Python 2, map returns a list, so you could just do f=lambda i:map(chr,range(i))
Justin
That's true, and my initial solution was similar but I didn't want to use a lambda so that I could immediately print output. I wish map kept the trend of returning a list instead of an iterator, even if it is more pythonic that way.
Full Metal
2

Pascal 87

program _;var c:char;n:byte;begin n:=0;readln(n);for c:=chr(0)to chr(n)do write(c);end.

Pascal 73

program _;var c,n:byte;begin readln(n);for c:=0to n do write(chr(c));end.

Builds and runs fine from http://www.onlinecompiler.net/pascal

Mark K Cowan
fuente
1
FreePascal (and if I remember correctly, Turbo Pascal too) only needs 60 of those characters: var c,n:byte;begin read(n);for c:=0to n do write(chr(c))end. pastebin.com/aFLVTuvh
manatwork
Quite possibly, I've only used Delphi. But someone edited that out of the title.
Mark K Cowan
2

x86 ASM (Linux) (many many bytes unless you compile it)

Written as a function, assumes parameter is passed in AX (I forget the number for the read syscall) Also doesn't preserve [SP] or BX.

test ax,ax
jz @Done
mov [sp],ax
@Loop:
mov ax,4
mov bx,1
mov cx,sp
mov dx,1
int 0x80
sub [sp],1  ; Can I do this?  Or do I need to load/sub/store separately?
jnz @Loop
@Done:
ret
Mark K Cowan
fuente
2
(I should have put a F00F exploit in there, it's not like anyone will run it anyway)
Mark K Cowan
7
I was going to run this. I'm not going to run this now.
Aearnus
2

Perl - 29

sub f{print map{chr}0..shift}
nyuszika7h
fuente
2

Ruby, 23

f=->n{puts *?\0..n.chr}

Explanation

  • Input is taken as the argument to a lambda. It expects an Integer.
  • The "destructuring operator" (*) invokes #to_ary on the Range to print every character on its own line.
britishtea
fuente
2

Julia: 20 characters (REPL)

This is close to the question's example: just generates the characters and let the REPL to do whatever it wants with them.

f(n)=map(char,[0:n])

Julia: 33 characters

Prints each character in a separate line.

print(map(char,[0:int(ARGS[1])]))
manatwork
fuente
2

M (MUMPS) - 21

R n F i=1:1:n W $C(i)

In expanded form: READ n FOR i=1:1:n WRITE $CHAR(i)

temporicide
fuente
2

T-SQL: 68 63

As a print loop

DECLARE @i INT=64,@ INT=0A:PRINT CHAR(@)SET @+=1IF @<=@i GOTO A

T-SQL: 95 86

As a query

DECLARE @ INT=64SELECT TOP(@+1)CHAR(ROW_NUMBER()OVER(ORDER BY 0/0)-1)FROM sys.messages

Edit: Made changes and fixes pointed out by Muqo. Thanks. Fixes and golfing suggested by @t-clausen.dk

MickyT
fuente
For the loop, you can save 5 or so characters converting the WHILE to a GOTO with label. For the query, maybe specify msdb.sys.objects to guarantee enough objects. Also, it doesn't output CHAR(0). However, as consolation you can ORDER BY @.
Muqo
Second answer is invalid. You can rewrite it this way and golf 9 characters: DECLARE @ INT=64SELECT TOP(@+1)CHAR(ROW_NUMBER()OVER(ORDER BY 0/0)-1)FROM sys.messages
t-clausen.dk
@t-clausen.dk not sure how I let that one through. Thanks for that.
MickyT
2

BrainFuck - 140 112 Bytes

,>,>,>-[>+<-----]>---[<+>-]<[<<<->->->-]<[>+<-]<[>>++++++++++<<-]<[>>>>++++++++++[<++++++++++>-]<<<<-]>>>[>.+<-]

Try It Here!

Saved 28 bytes by changing [<<<->>>->+<]>[<<<->>>->+<]>[<<<->>>-] to [<<<->->->-].

What it does

,>,>,>                                                              Takes three inputs
                                                                    in three separate cells

-[>+<-----]>---[<+>-]<[<<<->->->-]<                                 Takes 48 off of each to
                                                                    convert them to decimal

[>+<-]<[>>++++++++++<<-]<[>>>>++++++++++[<++++++++++>-]<<<<-]>>>    Combines them into a
                                                                    three digit number by
                                                                    multiplying the first
                                                                    by 100, the second by
                                                                    10 and then adding all
                                                                    three

[>.+<-]                                                             Repeatedly prints the
                                                                    value of the adjacent
                                                                    cell and then adds one
                                                                    to it until it reaches
                                                                    the input value.
FinW
fuente