Распечатать таблицу ASCII


28

Задача состоит в том, чтобы отобразить п символов из таблицы ASCII .

Вы можете написать функцию (или программу, которая принимает аргумент в качестве параметра, также допустим STDIN), который принимает параметр n , который будет индексом последнего символа для печати.

Задача довольно проста, поэтому в качестве примера приведена возможная реализация в Python 2.7:

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

Как я уже сказал, это простая задача. Так что это код-гольф, и выигрывают самые короткие коды!

РЕДАКТИРОВАТЬ

Как некоторые из вас указали, этот код не печатает результат. Это всего лишь пример, так как я могу изо всех сил объяснять проблему на английском языке ;-).

EDIT2

Не стесняйтесь размещать ответ на любом языке программирования, даже если это не самый короткий код. Может быть, есть некоторые интересные реализации там!

EDIT3

Исправлен пример, чтобы он печатал результат.


1. Должно ли это быть функцией? 2. В соответствии с вашим ссылочным кодом, n будет первым символом, который не печатается.
Деннис

2
На самом деле ссылочный код ничего не печатает. Он просто возвращает список символов и позволяет REPL делать с результатом все, что он хочет.
manatwork

1
Может кто-нибудь, пожалуйста, объясните отрицательный голос? Я извиняюсь, если мой английский не так хорош. Если в этом вопросе что-то неясное, скажите, пожалуйста.
oopbase

1
for x in range(input()):print chr(x)Будет на самом деле печатать символы, если вы хотите редактировать свой пример.
FryAmTheEggman

2
nota [i for i in range(n)]в достаточной степени похож наrange(n)
njzk2

Ответы:


19

CJam, 4 байта

ric,

Полная программа, которая читает из STDIN (поле ввода в онлайн-переводчике ).

Это просто выполняется range(chr(int(input()))), используя тот факт, что ,возвращает массив символов, если его аргумент является символом.

Я вызываю dibs c,(2 байта), на случай, если допущение, что вход уже находится в стеке, оказывается разрешенным.


Вы должны указать какой-либо вход? Онлайн бегун просто выводит сам код.
manatwork

12
@ Manatwork: всего на секунду. Вы должны поторопиться, когда вы публикуете эти ...;)
Деннис

Я немного смущен этим. Символ в 0 (он же 0c) не позволяет печатать что-либо еще после него. ric, (кажется, работает нормально. Это означает, что код не работает.
kaine

1
@kaine: Internet Explorer написан на C ++, который не использует строки с нулевым символом в конце. В соответствии с этим нулевые символы являются ошибками разбора в HTML 5; браузер должен заменить его на или прервать обработку документа.
Деннис

4
Имейте в виду, что вы должны ввести достаточно большое значение n, поскольку первые несколько десятков символов ASCII являются непечатными символами. Интересный факт: эта программа также выводит таблицу Unicode, например, n = 9999
Sanchises

25

брейкфук - 169 146 142 байта

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

Ограничения:

  • EOF должен быть 0
  • Требует 8-битных упаковочных ячеек
  • Из-за ^, ввод модов на 256

Не самый короткий ответ здесь, но эй, придурок! Это было бы действительно, действительно хорошей задачей, за исключением того факта, что она требует читабельного ввода человеком без гарантии количества цифр. Я мог бы потребовать, чтобы ввод имел начальные нули, чтобы он был длиной 3 символа, но что это интересно? : D Одной из основных проблем, связанных с таким вводом данных, является то, что единственная структура разветвления или циклирования в мозговом матче проверяет, равна ли текущая ячейка нулю или нет. Когда входные данные могут содержать нули, это может привести к тому, что ваш код получит ответвления, которые он не должен брать. Чтобы решить эту проблему, я сохраняю каждую цифру ввода плюс 1 , а затем вычитаю излишки в последнюю возможную секунду. Таким образом, я всегда знаю, где мои нули.

Я сказал, что это было бы серьезной проблемой, без разбора входных данных. Почему это? Что ж, давайте представим, что мы не берем числовой ввод. Мы скажем, что проблема заключается в том, что «учитывая байты ввода, выведите все символы ASCII ниже этого байта». Вот что мой ответ будет:


брейкфук - 8 байт

,[->.+<]

Это большая разница! Настоящая программа использует 135 инструкций для сбора ввода (более 95% программы!), Просто потому, что его печатает человек. Сохранение номера в качестве байта и дать , что для меня, и он принимает только один.

(Забавный факт: если вы поняли гипотетическую программу, то поздравляю! Вы понимаете «мозговитость» во всей ее полноте. Весь язык имеет только восемь команд, и эта программа использует каждую из них ровно один раз.)

объяснение

-[+>+[+<]>+]>+               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

Ницца! Определенно +1 за усилия :-)
oopbase

1
Вы можете сохранить несколько байтов в выходной части: >[-]<[->.+<]установите для ячейки рядом с текущей ячейкой значение 0, затем начните обратный отсчет текущей ячейки, увеличивая ячейку рядом с ней и одновременно печатая значение.
Шуджал,

@shu Это отличный момент! Я не думал об этом вообще. Помимо того, что он короче, он устраняет проблему с удушением при больших входах и, вероятно, быстрее! Спасибо :)
подземный

Да, теперь намного, намного быстрее. Мне также не понадобилась эта >[-]<роль, потому что я уже был рядом с пустой камерой. :)
подземный



11

Befunge 93 - 23 21

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

Befunge 93 - 15 13 (Инго Бюрк)

Этот выводит список в обратном порядке, но OP только сказал, что нам нужно напечатать первые nсимволы, а не то, что он должен быть в порядке.

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

Больше нельзя играть в гольф, не переходя на Befunge98 (оператор ";" см. В ответе @ Kasran )

Попробуйте это здесь:


Надеюсь, вы не возражаете, что я использовал встроенный переводчик отсюда :)
Ingo Bürk

Вопрос не гласит, что мы должны печатать его в любом порядке, так что это на пять байт короче: &> #- #1:# :#,_@(он просто печатает его в обратном порядке)
Ingo Bürk

Я сбрил еще один байт в общей сложности 15. Из-за новых строк я отредактирую его в вашем посте
Инго Бюрк

Хорошо играл на дополнительном гольфе :) Что касается встроенного переводчика, я не знал, что был один. Это здорово, спасибо :)
karhell

Переводчик новичок в связанном вызове. Я просто подумал, что смогу использовать это, когда увидел твой ответ. :)
Инго Бюрк

8

Java, 151 128 77 62 56 байт

Сначала попробуйте сыграть в гольф.

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

Использование:

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));
    }
}

Спасибо @Shujal, @flawr, @Ingo Bürk и @Loovjo за серьезное сокращение байтов.


1
Вы можете сохранить некоторые символы, указав int при открытии сканера: int i,n=new Scanner(...и изменив цикл на for(;++i<n;). Кроме того, вам не нужно вызывать Character.toString. Вы можете просто передать System.out значение char, и оно с радостью выведет его.
Шуджал

1
Задача позволяет использовать ваш в aкачестве входных данных. И я думаю, что вы можете сократить forцикл, используя место приращения как тело цикла: for(;++i<n;System.out.print((char)i));(но вам, возможно, придется изменить значение инициализации или конечное значение на + - 1)
flawr

1
Вам разрешено написать функцию, поэтому вам не нужен целый класс и все.
Инго Бюрк

1
@RodolfoDias Вы уверены? Очевидно, ++i<n+1должно быть эквивалентно ++i<=n. Обратите внимание на =там, однако! Это просто сохраняет один байт. Меня устраивает.
Инго Бюрк

1
Итак, мы дошли до void f(int n){int i=0;for(;++i<=n;System.out.print((char)i));}62 байтов. По крайней мере, я не вижу больше в гольфе сейчас. :)
Инго Бюрк

6

АПЗ, 5

⎕UCS⍳

Пример использования:

⎕UCS⍳256

1
Вам не нужно делать DFN. Просто «UCS» будет работать нормально. Итак, 5 символов
Морис Зукка,

1
Вам не нужно поддерживать кодовые точки свыше 127. Просто ↑ ⎕AV будет работать нормально. Итак, 4
символа

6

JavaScript, ES6 - 52 58 56 53 44 42 байта

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

Вставьте это в консоль Firefox. Запустить как f(NUM).

Пришлось сделать это дольше, потому что первый не правильно принял ввод.

Даун 3, спасибо edc65! До 44 благодаря Swivel!


1
Это на самом деле не обрабатывает ни параметров, ни ввода.
manatwork

Просто измените 70 на другое число; это вход.
Scimonster

Хорошо, я обновил его, чтобы принять входные данные, стоимостью 6 байтов.
Scimonster

3
-2: f = n => [... Array (n)]. Map ((v, i) => String.fromCharCode (i))
edc65

2
44 персонажа! f=n=>String.fromCharCode(...Array(n).keys())
Поворот

6

Haskell, 17 23 байта

flip take['\0'..]

Не уверен, что это возможно сделать лучше без импорта.

редактировать

Мое первое решение на самом деле не печатало результат, поэтому добавьте еще 6 символов для этого:

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

Кроме того, не короче (25 символов с печатью, 19 без), но интересный альтернативный подход (хотя и требует 'Data.List'):

print.((inits['\0'..])!!)

Это на самом деле не печатать результат.
nyuszika7h

@ nyuszika7h теперь это делает
Джон Дворжак

(`take`['\0'..])сохраняет байт.
Лайкони


4

C, 31 30 28 27

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

Так как putch нестандартный, вот полностью совместимая версия:

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

Должен быть вызван из основного:

main(){f(255);}

РЕДАКТИРОВАТЬ: Улучшено за счет использования возвращаемого значения путчар
РЕДАКТИРОВАТЬ 2: Уменьшено на другого персонажа через рекурсию


1
putch - это нестандартная функция. Кроме того, могу я спросить, почему этот ответ был отклонен?
Stuntddude

@Stuntddude Я добавлю альтернативную версию, которая использует putchar, и понятия не имею, почему это понизили. В конце концов, это один из самых коротких.
Такра

4

Perl, 17 байт

say chr for 0..$_

1
Слишком много скобок. print chr for 0..$ARGV[0]
manatwork

Вы правы! Прошло много времени с тех пор, как я использовал Perl
Demnogonis

1
Вы можете использовать shiftвместо того, $ARGV[0]чтобы сохранить 2 байта.
nyuszika7h

Если вам разрешено печатать символы в разных строках, вы можете использовать say. Кроме того, количество символов короче, если вы делаете это как одну строку с -n. echo "90" | perl -nE'say chr for 0..$_'будет считаться как 18персонажи. 17за say chr for 0..$_плюс 1за n.
hmatt1

Вы правы. Но sayне будет работать с каждой версией Perl.
Демногонис

3

CJam, 3

,:c

Я предположил, что аргумент является верхним элементом стека.

Пример использования:

256,:c

ri,:c


3

awk - 27

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

Чтобы задать параметр на stdin, запустите его следующим образом:

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

Просто для удовольствия: «Подумайте позитивно», начиная с окончательного yes:

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

NR-1необходимо напечатать (char)0для NR==1. :-(

И почему у нас нет noкоманды? Это своего рода подло!


1
alias no='yes no'
nyuszika7h

... но тогда я должен был бы посчитать символы этого определения псевдонима тоже ... :-(

3

J - 5 байт

{.&a.

{.is Head, a.is Alphabet (список всех символов) и &связывает их, генерируя монадический глагол, называемый как:

{.&a. 100 NB. first 100 characters

Примечание : кажется, что это не работает в интерактивном режиме: Jconsole и jQt, кажется, устанавливают перевод, выводя символы ящика вместо некоторых управляющих символов. В скрипте или из командной строки это работает, хотя:

  ijconsole <<< '127 {. a.' | hd

Обратите внимание, что алфавит не совсем ASCII.
FUZxxl

До {.&a. 127, это не так?
jpjacobs

Нет, потому что у J есть символы рисования в рамке вместо некоторых управляющих символов.
FUZxxl

На самом деле, запись этого в файл и проверка его с помощью шестнадцатеричной программы просмотра говорит мне, что J выводит правильные значения (0x00 0x01, ...). только интерпретатор / IDE J интерпретирует эти значения как символы для рисования прямоугольников вместо управляющих символов. Он делает то же самое, что и все другие языки, использующие charили эквиваленты.
jpjacobs

Это странно, потому что я тестировал его на своем UNIX-боксе, и он действительно выводил символы Unicode для некоторых кодовых точек.
FUZxxl


3

Brainfuck, 44 байта

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

Ожидается десятичная строка без завершающей строки.

Попробуйте онлайн.

Чтение целых чисел в диапазоне [0, max_cell_size]в Brainfuck не сложно. Я призываю вас изобрести чистый метод самостоятельно. Я считаю это упражнение для начинающих. (Обратная операция печати числового значения ячейки более сложна и может рассматриваться как задача промежуточного уровня.)

Вот 58-байтовая версия, которая может обрабатывать 2568-битные реализации:

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


Почему я не подумал об этом ??? Это гениально !!!
FinW

Могу ли я позаимствовать это, чтобы использовать в будущих ответах?
FinW

1
@FinW Полагаю, ты не знаешь об этом мета-посте .
Митч Шварц

2

Гольфскрипт - 5

Благодаря @Dennis

~,''+

1
~,""+Короче и правильно обрабатывает ввод из STDIN.
Деннис

@Dennis Это не производит никакого выхода для меня ...
Beta Decay

1
Вы используете онлайн переводчик? Чтобы правильно имитировать ввод из STDIN, вы должны использовать, например ;"65", так как ввод из STDIN всегда будет строкой.
Деннис

1
@ Деннис О, спасибо, это работает сейчас!
бета-распад


2

Befunge 98, 22

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

Вид грустно, что это так долго.

&: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                                               ;

2

Python 3.4 - 36 байт / 43 байт

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

255 вход ()

Как это работает:

  1. Получить верхний предел диапазона
  2. Создайте диапазон таблицы.
  3. Сопоставить диапазон с функцией chr (принимает int, возвращает ascii).
  4. Использовать карту через расширение аргумента splat (число -> символ -> печать!)

Второй просто удаляет пробел, отделяющий каждый символ в обмен на 7 байтов.


Вы можете очень сильно превратить это в лямбду, так как вопрос гласит это, а в Python 2 mapвозвращает список, так что вы можете просто сделатьf=lambda i:map(chr,range(i))
Джастин

Это правда, и мое первоначальное решение было похоже, но я не хотел использовать лямбду, чтобы я мог сразу же напечатать вывод. Хотелось бы, чтобы карта сохранила тенденцию возврата списка вместо итератора, даже если он более питонический.
Full Metal

2

Паскаль 87

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

Паскаль 73

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

Сборка и работает нормально с http://www.onlinecompiler.net/pascal


1
FreePascal (и если я правильно помню, Turbo Pascal тоже) нужно только 60 из этих символов: var c,n:byte;begin read(n);for c:=0to n do write(chr(c))end. pastebin.com/aFLVTuvh
manatwork

Вполне возможно, я использовал только Delphi. Но кто-то отредактировал это из заголовка.
Марк К Коуэн

2

x86 ASM (Linux) (много-много байтов, если вы его не скомпилируете)

Записано как функция, предполагает, что параметр передается в AX (я забыл номер для системного вызова read). Также не сохраняет [SP] или 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

2
(Я должен был поместить там эксплойт F00F, это не значит, что кто-нибудь все равно его запустит)
Марк К Коуэн

7
Я собирался запустить это. Я не собираюсь запускать это сейчас.
Aearnus


2

Руби, 23

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

объяснение

  • Ввод принимается в качестве аргумента лямбда-выражения. Ожидается целое число.
  • «Оператор деструктурирования» ( *) вызывает #to_aryRange для печати каждого символа в отдельной строке.

2

Юлия: 20 символов (REPL)

Это близко к примеру вопроса: просто сгенерируйте символы и позвольте REPL делать с ними все, что он хочет.

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

Юлия: 33 персонажа

Печатает каждый символ в отдельной строке.

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


2

T-SQL: 68 63

Как печатная петля

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

T-SQL: 95 86

Как запрос

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

Изменить: Внесены изменения и исправления, указанные Muqo. Спасибо. Исправления и игра в гольф, предложенные @ t-clausen.dk


Для цикла вы можете сохранить 5 или около того символов, преобразуя WHILE в GOTOметку с. Для запроса, возможно, укажите, msdb.sys.objectsчтобы гарантировать достаточно объектов. Кроме того, он не выводит CHAR (0). Однако, как утешение, вы можете ORDER BY @.
Muqo

Второй ответ неверен. Вы можете переписать его таким образом и набрать 9 символов: DECLARE @ INT = 64SELECT TOP (@ + 1) CHAR (ROW_NUMBER () OVER (ORDER BY 0/0) -1) FROM sys.messages
t-clausen.dk

@ t-clausen.dk не уверен, как я пропустил это. Спасибо за это.
MickyT

2

BrainFuck - 140 112 байт

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

Попробуй здесь!

Сохранено 28 байтов путем изменения [<<<->>>->+<]>[<<<->>>->+<]>[<<<->>>-]на [<<<->->->-].

Что оно делает

,>,>,>                                                              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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.