Роздрукуйте таблицю ASCII


28

Завдання - відобразити n символів таблиці ASCII .

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

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

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

Як я вже сказав, це просте завдання. Отже, це код-гольф, і найкоротші коди виграють!

EDIT

Як зазначали деякі з вас, цей код не друкує результат. Це лише приклад, оскільки я можу боротися з поясненням проблеми англійською мовою ;-).

EDIT2

Сміливо публікуйте відповідь будь-якою мовою програмування, навіть якщо це не найкоротший код. Можливо, там є якісь цікаві реалізації!

EDIT3

Виправлено приклад, щоб він надрукував результат.


1. Чи повинна вона бути функцією? 2. Згідно з вашим довідковим кодом, n буде першим символом, який не друкується.
Денніс

2
Насправді довідковий код нічого не друкує. Він просто повертає список символів і дозволяє REPL робити все, що завгодно, з результатом.
манатура

1
Може хтось, будь-ласка, пояснить протиріччя? Вибачте, якщо моя англійська мова не є такою хорошою. Якщо в питанні є щось незрозуміле, будь ласка, скажіть мені.
oopbase

1
for x in range(input()):print chr(x)Насправді буде надруковано символи, якщо ви хочете відредагувати свій приклад.
FryAmTheEggman

2
nota [i for i in range(n)]в range(n)
достатній мірі

Відповіді:


19

CJam, 4 байти

ric,

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

Це просто виконується range(chr(int(input()))), скориставшись тим, що ,повертає масив символів, якщо його аргументом є символ.

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


Чи потрібно вказати якийсь вхід? Онлайн-бігун просто виводить сам код.
манатура

12
@manatwork: Всього на секунду. Ви повинні поспішати, коли ви публікуєте ці ...;)
Денніс

Я трохи збентежений цим. Символ у 0 (він же 0c) запобігає друкуванню нічого іншого після нього. Рік, (здається, працює нормально. Це означає, що код не працює.
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, а потім підрахуйте поточну комірку, збільшивши комірок поруч із нею та одночасно друкуючи значення.
Shujal

@shu Це прекрасний момент! Я про це взагалі не думав. Окрім того, що він коротший, він вирішує проблему, яку я мав із задушенням великих входів, і це, мабуть, швидше! Дякую :)
undergroundmonorail

Так, зараз це набагато швидше. >[-]<Частина мені також не потрібна, бо я вже був поруч із порожньою коміркою. :)
undergroundmonorail


12

Pyth , 4 байти

VQCN

В основному це переклад програми Python 3:

for N in range(eval(input())):print(chr(N))

11

Befunge 93 - 23 21

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

Befunge 93 - 15 13 (автор: Інго Бюрк)

Цей друкує список у зворотному порядку, але ОП лише сказав, що нам потрібно надрукувати перші nсимволи, а не те, що це повинно бути в порядку.

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

Можливо, більше не можна пограбувати, не переходячи на Befunge98 (про оператора ";", див. Відповідь @ Kasran )

Спробуйте тут:


Я сподіваюся , ви не заперечуєте , що я використовував вбудований інтерпретатор з тут :)
Інго Берк

У запитанні не зазначено, що ми повинні надрукувати його в будь-якому порядку, тому це на п'ять байтів коротше: &> #- #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, і воно з радістю виведе його.
Shujal

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

APL, 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
Це насправді не обробляє ні параметр, ні вхід.
манатура

Просто змініть 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);}

Оскільки путч нестандартний, ось повністю сумісна версія:

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

Потрібно телефонувати з основного:

main(){f(255);}

EDIT: Покращено за рахунок використання зворотного значення putchar
EDIT 2: Зменшення на інший символ через рекурсію


1
putch - це нестандартна функція. Також я можу запитати, чому цю відповідь було скасовано?
Stuntddude

@Stuntddude Я додам альтернативну версію, яка використовує putchar, і не маю поняття, чому це не дозволено. Зрештою, це один із коротших.
такра

4

Perl, 17 байт

say chr for 0..$_

1
Занадто багато дужок. print chr for 0..$ARGV[0]
манатство

Ти правий!
Минув

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.

{.є Head, a.є алфавітом (список усіх символів) і &зв'язує їх, породжуючи монадійне дієслово, яке називається:

{.&a. 100 NB. first 100 characters

Примітка : Схоже, це не працює інтерактивно: Jconsole та jQt, схоже, налаштовують переклад, виводячи символи поля замість деяких контрольних символів. У сценарії або з командного рядка він працює, хоча:

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

Зауважте, що алфавіт не зовсім ASCII.
FUZxxl

До {.&a. 127, це ні?
jpjacobs

Ні, тому що J має замість деяких контрольних символів коробки для малювання поля.
FUZxxl

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

Це дивно, тому що я тестував його на своєму вікні UNIX, і він дійсно виводив символи Unicode для деяких кодових точок.
FUZxxl


3

Brainfuck, 44 байти

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

Очікує десятковий рядок без останнього рядка.

Спробуйте в Інтернеті.

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

Ось 58-байтна версія, яка може працювати 256з 8-бітовими реалізаціями:

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


Чому я не подумав про це ??? Це геніально !!!
FinW

Чи можу я запозичити це для використання у майбутніх відповідях?
FinW

1
@FinW Я здогадуюсь, що ти не знаєш про цю мета-посаду .
Мітч Шварц

2

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

Завдяки @Dennis

~,''+

1
~,""+коротше і правильно обробляє вхід з STDIN.
Денніс

@Dennis Це не дає ніяких результатів для мене ...
бета-розпад

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))
Джастін

Це правда, і моє початкове рішення було схожим, але я не хотів використовувати лямбда, щоб я міг негайно надрукувати вихід. Я хотів би, щоб карта зберегла тенденцію повернення списку замість ітератора, навіть якщо він більш пітонічний.
Повний метал

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 (я забуваю число для syscall для читання) Також не зберігає [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, це не так, як все одно хтось його запустить)
Mark K Cowan

7
Я збирався це запустити. Я зараз не збираюся це запускати.
Aearnus


2

Рубі, 23

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

Пояснення

  • Введення береться за аргумент лямбда. Він очікує цілий ряд.
  • "Оператор руйнування" ( *) викликає #to_aryдіапазон для друку кожного символу на його власному рядку.

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 (ЗАМОВЛЕННЯ 0/0) -1) OD 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.