Воссоздать ASCII-таблицу как ASCII-таблицу


26

Часто, пока я играю в код, я хочу знать, каково значение ASCII для определенного персонажа. ASCIItable.com - один из моих любимых ресурсов для быстрого поиска всех печатных символов ASCII . Это действительно хорошее изображение, которое показывает не только печатные символы ASCII и их значения, но также непечатаемые и расширенные символы, а также значения в шестнадцатеричном, восьмеричном и HTML-кодах:

введите описание изображения здесь

Сегодня задача состоит в том, чтобы воссоздать эту таблицу ASCII в виде таблицы ASCII вместо изображения. Для простоты мы не будем использовать управляющие символы (символы ниже 32) и будем показывать только десятичное значение и символ. Другими словами, ваша задача - написать либо полную программу, либо функцию, которая печатает или возвращает следующий текст:

Dec  Chr   | Dec  Chr   | Dec  Chr
----------------------------------
32   Space | 64   @     | 96   `
33   !     | 65   A     | 97   a
34   "     | 66   B     | 98   b
35   #     | 67   C     | 99   c
36   $     | 68   D     | 100  d
37   %     | 69   E     | 101  e
38   &     | 70   F     | 102  f
39   '     | 71   G     | 103  g
40   (     | 72   H     | 104  h
41   )     | 73   I     | 105  i
42   *     | 74   J     | 106  j
43   +     | 75   K     | 107  k
44   ,     | 76   L     | 108  l
45   -     | 77   M     | 109  m
46   .     | 78   N     | 110  n
47   /     | 79   O     | 111  o
48   0     | 80   P     | 112  p
49   1     | 81   Q     | 113  q
50   2     | 82   R     | 114  r
51   3     | 83   S     | 115  s
52   4     | 84   T     | 116  t
53   5     | 85   U     | 117  u
54   6     | 86   V     | 118  v
55   7     | 87   W     | 119  w
56   8     | 88   X     | 120  x
57   9     | 89   Y     | 121  y
58   :     | 90   Z     | 122  z
59   ;     | 91   [     | 123  {
60   <     | 92   \     | 124  |
61   =     | 93   ]     | 125  }
62   >     | 94   ^     | 126  ~
63   ?     | 95   _     | 127  DEL

Конечные пробелы в каждой строке и завершающий символ новой строки разрешены. Поскольку это задача , ваша может не потребовать ввода или доступа к каким-либо внешним ресурсам (таким как файл или Интернет), и ваша цель - сжать код для вывода этого текста в максимально возможной степени.

Применяются стандартные лазейки, и выигрывает самый короткий ответ в байтах. Удачного игры в гольф!


3
У меня есть точное изображение таблицы ASCII, прикрепленное к моей стене ... В любом случае, можно ли вернуть список строк?
FlipTack

2
@fliptack Конечно, вы можете. Почему бы мне не позволить что-то совершенно разумное, как это?
DJMcMayhem

10
Я бы не сказал, что это обман - другой требует шестнадцатеричных значений, имен непечатаемых, и это другой формат таблицы. Это придерживается видимого ASCII и позволяет код для игры в гольф, не запрашивая трехбуквенные коды всех непечатных.
FlipTack

@FlipTack У него все еще есть Space и DEL
simon

2
@gurka да, но у другого есть все управляющие символы.
FlipTack

Ответы:


11

Python 2, 185 183 175 159 байт

Сохранено 8 байт благодаря FlipTack!

Все еще довольно плохо знакомы с игрой в гольф на Python.

for a in["Dec  Chr   | "*3,"-"*39]+["".join(["%-5d%-6s| "%(l,('Space',chr(l),'DEL')[(l>32)+(l>126)]) for l in(i,32+i,64+i)])for i in range(32,64)]:print a[:-5]

Использует понимание вложенного списка для генерации тела таблицы.

Ungolfed:

lines =   \
  ["Dec  Chr   | "*3, "-"*39] +                    # first two lines
    ["".join(                                        # join 3 parts of each line
      ["%-5d%-6s| " % (l, ('Space',chr(l),'DEL')[(l>32)+(l>126)]) 
        for l in (i,32+i,64+i)]                      # generate 3 parts of a line
      )
      for i in range(32,64)]

for line in lines: print line[:-5]

Старая попытка, 185 183 175 байт

print("Dec  Chr   | "*3)[:-5]+"\n"+"-"*34
a=lambda x:('Space',chr(x),'DEL')[(x>32)+(x>126)]
for l in range(32,64):print("%-5d%-6s| "*3%(l,a(l),l+32,a(l+32),l+64,a(l+64)))[:-5]

Ungolfed:

print ("Dec  Chr   | "*3)[:-5] + "\n" + "-"*34
def a(x):
    return "Space" if x==32 else "DEL" if x==127 else chr(x)
for line in range(32,64):
    print ("%-5d%-6s| "*3 % (line, a(line), line+32, a(line+32), 
      line+64, a(line+64))) [:-5]

Я вижу пробел в `for l in (i, 32 + i, 64 + i)])`, может быть удален для сохранения одного байта.
максимум



5

JavaScript (ES6), 179 173 байта

f=n=>n?(n>>6?' | ':`
`)+n+(99<n?'  ':'   ')+(126<n?'DEL':String.fromCharCode(n)+'    '+f(n>95?n-63:n+32)):`${x='Dec  Chr   '}| ${x}| ${x}
${'-'.repeat(34)}
32   Space`+f(64)

console.log(f())


Хороший ответ! Вы можете сохранить еще один байт, заменив `${x='Dec Chr '}| ${x}| ${x}в конце строки 2 на(x='Dec Chr ')+(' |'+x)*2+`
Luke

@ L.Serné Я не знаю ни одной версии ECMAScript, которая повторяла бы строку с *оператором. Или я как-то неправильно понимаю ваше предложение?
Арно

Ой, мой плохой. Это то, что вы получаете за попытку игры в гольф на python, а затем javascript.
Лука

5

V , 98, 96 , 94 байта

i32 | 64 | 9631ñÙl.l.ñÍä«/&   &    
ÎéiD@"
bsDELF 27kdH5lRSpaceÄÒ-Ä3RDec  Chr³ | Î35|D

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

Просто едва поскрипывает под сотню. Я посмотрю, смогу ли я победить Пита, но я не буду давать никаких обещаний.

Вот hexdump:

00000000: 6933 3220 7c20 3634 207c 2039 361b 3331  i32 | 64 | 96.31
00000010: f1d9 016c 2e6c 2ef1 cde4 ab2f 2620 2020  ...l.l...../&   
00000020: 1616 2620 2020 200a cee9 6944 4022 0a62  ..&    ...iD@".b
00000030: 7344 454c 1b46 2016 3237 6b64 4835 6c52  sDEL.F .27kdH5lR
00000040: 5370 6163 651b c4d2 2dc4 3352 4465 6320  Space...-.3RDec 
00000050: 2043 6872 b320 7c20 1bce 3335 7c44        Chr. | ..35|D

И вот как это работает:

i32 | 64 | 96<esc>      " Insert some starting text
31ñ          ñ          " 31 times:
   Ù                    "   Duplicate this line
    <C-a>               "   Increment the first number on this line
         l.             "   Increment the next number
           l.           "   Increment the next number

Вот где это интересно. Во-первых, позвольте мне объяснить трюк vim. В режиме вставки вставляются определенные символы (все печатные символы ASCII, большинство не отображенных символов выше 0x7fи некоторые другие), но другие символы имеют побочный эффект. Например, 0x1b( <esc>) выйдет в нормальный режим. 0x01( <C-a>) вставит последний вставленный текст и т. д. Иногда мы хотим вставить эти символы буквально. Таким образом, чтобы вставить буквальный escape-символ, вы должны набрать <C-v><esc>. Это работает для всех персонажей, которые имеют побочный эффект. По сути, <C-v>это эквивалент обратной косой черты в языках со строковыми литералами, которые позволяют вам экранировать определенные символы в строке.

Другой полезный прием <C-v>в режиме вставки заключается в том, что его можно использовать для вставки символов по кодам , в десятичном, шестнадцатеричном, восьмеричном или шестнадцатеричном юникоде. Так как у нас уже есть числа, которые соответствуют определенным значениям ASCII, нам просто нужно поставить <C-v>перед этими символами a и запустить соответствующий текст как vim-нажатия клавиш. Это может быть достигнуто с помощью команды regex и команды "Do 'x' на каждой строке". Итак, мы:

Í                       " Substitute globally:
 ä«                     "   One or more digits
   /                    " With:
    &                   "   The matched number + some spaces
        <C-v><C-v>&     "   A ctrl-v character, then the matched number again
                        "   Since ctrl-v is like a backslash, we need two to enter a literal ctrl-v character
Î                       " On every line:
 éi                     "   Insert an 'i'
   D                    "   Delete this line
    @"                  "   Run it as vim keystrokes

На данный момент буфер выглядит так

32         | 64   @     | 96   `    
33   !     | 65   A     | 97   a    
34   "     | 66   B     | 98   b    
35   #     | 67   C     | 99   c    
36   $     | 68   D     | 100   d    
37   %     | 69   E     | 101   e    
38   &     | 70   F     | 102   f    
39   '     | 71   G     | 103   g    
40   (     | 72   H     | 104   h    
41   )     | 73   I     | 105   i    
42   *     | 74   J     | 106   j    
43   +     | 75   K     | 107   k    
44   ,     | 76   L     | 108   l    
45   -     | 77   M     | 109   m    
46   .     | 78   N     | 110   n    
47   /     | 79   O     | 111   o    
48   0     | 80   P     | 112   p    
49   1     | 81   Q     | 113   q    
50   2     | 82   R     | 114   r    
51   3     | 83   S     | 115   s    
52   4     | 84   T     | 116   t    
53   5     | 85   U     | 117   u    
54   6     | 86   V     | 118   v    
55   7     | 87   W     | 119   w    
56   8     | 88   X     | 120   x    
57   9     | 89   Y     | 121   y    
58   :     | 90   Z     | 122   z    
59   ;     | 91   [     | 123   {    
60   <     | 92   \     | 124   |    
61   =     | 93   ]     | 125   }    
62   >     | 94   ^     | 126   ~    
63   ?     | 95   _     | 127       

Теперь нам просто нужна общая очистка, которая составляет большую часть байтов в этом ответе.

bsDEL<esc>              " Change the literal 0x7f character to "DEL"
          F <C-v>27kd   " Remove a space from the lines that have too many
H5l                     " Move to the first space character
   RSpace<esc>          " And replace it with "Space"
Ä                       " Duplicate this line
 Ò-                     " And replace it with '-'s
   Ä                    " Duplicate this line
    3R                  " And replace it with three copies of the following string:
      Dec  Chr³ | <esc> " 'Dec  Chr   | '

Î35|D                   " Remove all but the first 35 characters of each line

5

F #, 222 байта

let c,p=String.concat" | ",printfn"%s"
Seq.replicate 3"Dec  Chr  "|>c|>p
p(String.replicate 34"-")
for i=32 to 63 do[for j in[i;i+32;i+64]->sprintf"%-5d%-5s"j (match j with 32->"Space"|127->"DEL"|_->string(char j))]|>c|>p

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


Могу ли я попросить безгольфную версию этого, пожалуйста? Я действительно новичок в изучении F #, и я хотел бы правильно понять, как ты это сделал!
Ciaran_McCarthy

1
Первая строка объединяет две функции с односимвольными именами. Теперь, если вы делаете ["ab"; "cd"] |> c |> pэто объединяет с "|" символы и печатает их, как «ab | cd», что является основной идеей для печати таблицы. Все остальное довольно просто, просто избегая пробелов, где это возможно.
Асик

4

постоянный ток , 167 байт

[[Space]nq]sp[[DEL]nq]sq[[ ]n]sc[Dec  Chr]dsen[   | ]dsfnlenlfnlen10P34[[-]n1-d0<a]dsax10P0[[32+dndZ2=c[  ]ndd32=pd127=qP[    ]n]dswx[ | ]nlwx[ | ]nlwx10P95-d32>b]dsbx

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

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

[[Space]nq]sp     # p is a macro that prints "Space" and then quits from the call one level up
[[DEL]nq]sq       # q is a macro that prints "DEL" and then quits from the call one level up
[[ ]n]sc          # c is a macro that prints a space
[Dec  Chr]dsen    # Save the string "Dec  Chr" in register e, and print it.
[   | ]dsfn       # Save the string "   | " in register f, and print it.
len               # Print "Dec  Chr" again.
lfn               # Print "   | " again.
len               # Print "Dec  Chr" again.
10P               # Print a newline.
34                # Push 34 on the stack.

[[-]n1-d0<a]dsa   # a is a macro that repeatedly prints "-" and decrements the top of the stack, while the top of the stack is positive.

x10P              # Execute macro a, followed by a newline. (This prints the line of hyphens.)

0                 # Push 0 on the stack.

[                 # Starting a large macro (which will be stored in register b) for printing the table row by row.

[32+dndZ2=c[  ]ndd32=pd127=qP[    ]n]dsw

                  # w is a macro which:
                        (1) adds 32 to the top of the stack;
                        (2) prints it as a number;
                        (3) uses Z to compute the number of characters the number required to print that number;
                        (4) if it required 2 characters to print the number, calls the macro c to print an extra space
                        (5) prints the string "Space" (for ASCII code 32) or the string "DEL" (for ASCII code 127) or the appropriate character, followed by the right number of spaces

x                 # Execute macro w to print an entry in column 1.
[ | ]n            # Print a column divider.
lwx               # Execute macro w to print an entry in column 2 (ASCII code 32 higher than the previous entry).
[ | ]n            # Print a column divider.
lwx               # Execute macro w to print an entry in column 3 (ASCII code 32 higher than the previous entry).

10P               # Print a newline.
95-               # Subtract 95 to adjust to go to the beginning of the next line.

d32>b             # If the top of stack is <= 32, execute macro b again, effectively looping to print all the rows of the table.

]dsb              # End the definition of the large macro, and store it in register b.

x                 # Execute the macro that's in b (with 0 at the top of the stack initially).

4

Perl, 120 байт

$,="| ";say+("Dec  Chr   ")x3;say"-"x32;say map{sprintf"%-5s%-6s",$_,$_-32?$_-127?chr:DEL:Space}$_,$_+32,$_+64for 32..63

Запустить с -Eфлагом:

perl -E '$,="| ";say+("Dec  Chr   ")x3;say"-"x32;say map{sprintf"%-5s%-6s",$_,$_-32?$_-127?chr:DEL:Space}$_,$_+32,$_+64for 32..63'

-2 байта благодаря @GB .


Если я немного понимаю Perl, возможно, вы можете сократить 2 пробела, используя «% -5s» вместо «% -3s» (кстати, это то, что я делаю в ruby)
GB

3

C 179 байт

i;f(){for(;i++<37;)printf(i<4?"Dec  Chr%s":"-",i<3?"   | ":"\n");printf("\n32   Space | ");for(i=64;i<127;i+=i>95?-63:32)printf("%-5d%-6c%s",i,i,i>95?"\n":"| ");puts("127  DEL");}

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

Semi-ungolfed:

i;
f() {
  for(;i++<37;) printf(i<4?"Dec  Chr%s":"-",i<3?"   | ":"\n");

  printf("\n32   Space | ");
  for(i=64;i<127;i+=i>95?-63:32) printf("%-5d%-6c%s",i,i,i>95?"\n":"| ");
  puts("127  DEL");
}

3

Рубин, 124 байта

 puts [["Dec  Chr   "]*3*"| ",?-*34,(0..31).map{|d|(1..3).map{|x|"%-5s%-6s"%[y=x*32+d,y<33?"Space":y>126?"DEL":y.chr]}*"| "}]

3

V , 151 150 148 136 135 130 129 125 байт

12 байтов сохранено благодаря @ nmjcman101 за использование <C-v>g<C-a>вместо цифрline('.')

2 байта сэкономлено благодаря @DJMcMayhem за удаление строк с начальными пробелами с помощью ÇÓ/dи с помощью удаления лишних пробелов и перестановки

Этот ответ конкурирует с V- ответом @ nmjcman101 (который использует :set ve=all). Но теперь я нашел способ удалить эти A ^[и сохранил несколько байтов, и мы находимся на равном количестве

iSpace 
¬!~Ó./&ò
iDELí^/31   
HlgGo| 63ÙkGld/Sp
$p/`
G$d/@
$p/64
G$d/S
$pÇÓ/d
/d
hdê/32
O34é-O!| !| !Ó!/Dec  Chr   

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

HexDump:

00000000: 6953 7061 6365 200a 1bac 217e d32e 2f26  iSpace ...!~../&
00000010: f20a 6944 454c 1bed 5e2f 3331 2020 200a  ..iDEL..^/31   .
00000020: 1648 6c67 0147 6f7c 201b 3633 d96b 1647  .Hlg.Go| .63.k.G
00000030: 6c64 2f53 700a 2470 2f60 0a16 4724 642f  ld/Sp.$p/`..G$d/
00000040: 400a 2470 2f36 340a 1647 2464 2f53 0a24  @.$p/64..G$d/S.$
00000050: 70c7 d32f 640a 2f64 0a68 64ea 2f33 320a  p../d./d.hd./32.
00000060: 4f1b 3334 e92d 4f21 7c20 217c 2021 1bd3  O.34.-O!| !| !..
00000070: 212f 4465 6320 2043 6872 2020 20         !/Dec  Chr 

Объяснение (неполное и устаревшее)

Стратегия здесь в том, что я использую номера строк для генерации кодовых точек ASCII.

Примечание: ^[есть 0x1b, ^VестьC-v

Сначала мы генерируем все символы.

iSpace             " insert Space
^[¬!~              " insert every character between ! and ~

Текущий буфер выглядит так

Space
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

Теперь мы вставляем новую строку между этими символами

     Ó./&ò         " insert a newline before every character (:s/./&\r/g)

Вот капля в замене 32 SPACE ... 127 DELчасти вашего кода: Попробуйте онлайн! Он использует эту аккуратную вещь, где вы можете выделить кучу чисел, а затем g^Aделает ее возрастающей последовательностью (новая в Vim 8?)
nmjcman101

@ nmjmcman101 Да, это было добавлено в 7.4., но официально добавлено в 8. Еще лучше было бы использовать команду нормы. Попробуйте онлайн!
DJMcMayhem

В любом случае, как только вы поймете, что вы можете сделать a, :set ve=allа затем курсор переместится в места, где нет текста, что позволит вам легче вставлять трубы и копировать / вставлять в нужные вам места, не разбрызгивая их A <esc>везде
nmjcman101

@ nmjcman101 g^AСпасибо, это сэкономило мне 12 байтов :)
Kritixi Lithos

@DJMcMayhem По какой-то причине использование нормы, а затем увеличение чисел не работает
Kritixi Lithos

3

V , 130 120 99 байт

Саб 100 клуб. Я больше не убежден, что :se ve=allэто лучший способ сделать это. Это лишние ... 11 байтов только для записи |! Но это то, что у меня есть.

Я публикую это почти в конкуренции с ответом @KritixiLuthos, :se ve=allчтобы избежать некоторых A <esc>. Я не уверен, что какой-либо из этих методов еще лучше, так что, надеюсь, это может вдохновить некоторых игроков в гольф на обеих сторонах, и посмотреть, какой метод принесет пользу

Я также наполовину ожидаю, что @DJMcMayhem наденет обе наши штаны

iSpace
¬!~Ó./&ò
iDELí^/31   
Hlg:se ve=all
12|êr|2ñ031j$x)PñHd)ÄÒ-Ä3RDec  Chr³ | /d
hdêÎ35|D

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

Hexdump для любопытных (если есть интерес, я просто изменю это на скрытый блок символов в стиле vim)

00000000: 6953 7061 6365 0a1b ac21 7ed3 2e2f 26f2  iSpace...!~../&.
00000010: 0a69 4445 4c1b ed5e 2f33 3120 2020 0a16  .iDEL..^/31   ..
00000020: 486c 6701 3a73 6520 7665 3d61 6c6c 0a31  Hlg.:se ve=all.1
00000030: 327c 16ea 727c 32f1 3016 3331 6a24 7829  2|..r|2.0.31j$x)
00000040: 50f1 4864 29c4 d22d c433 5244 6563 2020  P.Hd)..-.3RDec  
00000050: 4368 72b3 207c 201b 2f64 0a68 64ea ce33  Chr. | ./d.hd..3
00000060: 357c 44                                  5|D

1
Глобальная команда может быть сокращена на довольно много, но. С одной стороны, ddнеявно, если вы просто делаете d. Вы также можете сделать то, <M-s>что всегда эквивалентно \sрегулярному выражению. Таким образом , вы могли бы сократить его: ç^ó*/d. Но если вы отключите глобальную команду для инверсии, :g!вы можете искать каждую строку, не соответствующую непробельному символу. ÇÓ/dчто эквивалентно:g!/\S/normal dd
DJMcMayhem

3

AWK , 200 байт

BEGIN{b="-----------";a="Dec  Chr   ";print a"|",a"|",a"\n-"b b b;for(a=31;a++<63;){printf"%-5d%-6s| %-5d%-6c| %-5d%-5s\n",a,a<33?"Space":sprintf("%c",a),a+32,a+32,a+64,a<63?sprintf("%c",a+64):"DEL"}}

отформатирован:

BEGIN {
  b="-----------"
  a="Dec  Chr   "
  print a"|",a"|",a"\n-"b b b
  for(a=31;a++<63;) {
    printf "%-5d%-6s| %-5d%-6c| %-5d%-5s\n",
      a,    a<33 ? "Space" : sprintf("%c", a),
      a+32, a+32,
      a+64, a<63 ? sprintf("%c", a+64) : "DEL"
  }
}

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


2

C 188 байт

f(){i=31;printf("Dec Chr | Dec Chr | Dec Chr");printf("\n--------------------------");for(;i<63;i++)printf("\n%d%4c  | %d%4c  | %d%4c",(i+1),(i+1),(i+33),(i+33),(i+65),(i+65));puts("DEL");

Обычно выглядит так:

f()
{
    int  i=31;
    printf("Dec Chr | Dec Chr | Dec Chr");
    printf("\n--------------------------"); 
    for(;i<63;i++)  
      printf("\n%d%4c  | %d%4c  | %d%4c", (i+1),(i+1),(i+33),(i+33),  (i+65),(i+65));
    puts("DEL");
}

2

C (249 байт)

Новые строки добавлены для ясности.

#define L(s,e)for(i=s;i<e;++i)
#define P printf
main(i){L(0,3)P("Dec  Chr  %s",i<2?" | ":"\n");
L(0,34)P("-");P("\n");L(32,64){P("%-5d", i);
i==32?P("Space"):P("%-5c",i);
P(" | %-5d%-5c | %-5d ",i+32,i+32,i+64);
i==63?P("DEL"):P("%-5c",i+64);P("\n");}}

Вы можете определенно сохранить несколько байтов, сделав Pbe printf(, как показано здесь: repl.it/JBRD
Zacharý

И, удалив пробел на четвертой строке.
Захари

2

Java, 434 422 321 байт

class A{public static void main(String[]a){
    int k=1,r,s=32;
    for(;k<4;k++)
        o("Dec   Chr  ",k);
    for(;k<37;k++)                                                                              
        o("-",k==36?3:4);
    for(k=r=s;!(k==64&&r==-63);r=k>95?-63:s,k+=r)
        o(k+"   "+((k>99)?"":" ")+(k==s?"Space":k==127?"DEL  ":((char)k+"    ")),k/s);
    }
    static void o(String s,int j){
        System.out.print(s+(j==4?"":j==3?"\n":"|"));
    }
}

Ява, вероятно, не лучший язык для этого, так как есть накладные расходы на классы и метод main ...

Вы можете исключить метод main, используя статическую декларацию, уменьшив обратный отсчет байтов:

class A{
    static{...}

но это приводит к ошибке (после успешного запуска):

Exception in thread "main" java.lang.NoSuchMethodException: A.main([Ljava.lang.String;)
    at java.lang.Class.getMethod(Class.java:1786)
    ...

Число байтов в int включает переводы строки или отступы.


Я не думаю, что вам нужно пробел после void main(){, а также между while(s.length()<5)и s+=" ". (Если вы не учли это в подсчете байтов). И вы можете сохранить несколько байтов, изменяя d="Dec",c="Chr"к d=p("Dec"),c=p("Chr")и делая изменения ваших звонков p(d)и p(c)к dи c.
Захари

434 удалял все ненужные пробелы. Ваше предложение снижает его до 425. Спасибо!
xirt


Выполнено. Примечание: программа значительно изменилась с тех пор (сокращена далее), поэтому комментарии выше могут быть
неактуальны

2

Tcl , 233 байта

lassign {"Dec  Chr" "   | " 31} h S i
set H $h$S$h$S$h\n[string repe - 34]
proc p x {format %-5d%c $x $x}
time {set H "$H
[p [incr i]]  $S[p [expr $i+32]]  $S[p [expr $i+64]]"} 32
puts [regsub {\ {8}} [regsub \177 $H DEL] "   Space"]

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


Я запустил это, и я получаю, 32 например, (вместо '' ' Space), и 33!(без пробела между 33 и !).
NoOneIsHere

@SeeOneRhino: Вы явно не обращаете внимания на код. Я изменил код ссылки после того, как вставил сюда, в попытке сыграть в нее еще больше, но у меня пока не получилось. Я только что перешел на страницу и прокомментировал свою неудачную попытку и вставил код отсюда: если вы зайдете туда сейчас, вы увидите код, абсолютно равный, и увидите, что он печатает правильно!
sergiol

Извините, я не увидел вашу правку по ссылке. Я предположил, что код был таким же, как вы разместили здесь.
NoOneIsHere

Нет проблем, это была моя вина
sergiol

@SeeOneRhino: я достиг этого! Я перехитрил себя!
sergiol

2

R , 235 228 221 212 байт

y=apply(rbind(rep("Dec  Chr  ",3),1,matrix(sapply(1:96,function(i)paste(i+31,rep(" ",i<69),"if"(i<2,"Space","if"(i>95,"DEL",intToUtf8(c(i+31,rep(32,4))))))),nrow=32)),1,paste,collapse=" | ")
y[2]=strrep("-",34)
y

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

Я очень старался получить меньше 200 байт, но они pasteи collapseубивают меня. Возвращает список строк.


1

JavaScript (ES6), 258 байт

a="Dec  Chr   | ".repeat(2)+"Dec  Chr\n"+"-".repeat(34);for(b=32;64>b;b++)a+="\n"+b+"   "+(32==b?"Space  ":String.fromCharCode(b)+"      ")+"| "+(b+32)+"   "+String.fromCharCode(b+32)+"     | "+(b+64)+(35<b?"  ":"   ")+(63==b?"DEL":String.fromCharCode(b+64))

console.log(a)

1

PowerShell , 159 байт

,'Dec  Chr'*3-join'   | '
'-'*34
32..63|%{($_,($_+32),($_+64)|%{"$_".PadRight(5)+"$(([char]$_,('Space','DEL')[$_-ne32])[$_-in32,127])".padRight(5)})-join' | '}

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

Первые две строки просто создают буквенные строки и оставляют их на конвейере. Первый использует оператор запятой ,для создания массива, а затем -joinобъединяет этот массив для создания заголовков. Второе - просто умножение прямой строки.

Третья линия перебирает 32..63и каждая итерация отправляет три значения $_, ($_+32)и ($_+64)во внутреннем цикле. Внутренний цикл выполняет обработку PadRightзначения (добавляет соответствующие пробелы для заполнения 5символов). Затем строка объединяется +с результатом вложенного псевдо-троичного ( )[ ]. Псевдо-троичное выбирает либо charпредставление этого числа, либо другое, Spaceили, DELесли это подходящее значение. Опять мы PadRightсоответствующие персонажи.

Эти три строки (например, 32 Space, 64 @, 96 `) заключены в круглые скобки и -joinред с маркерами столбцов в одну строку. Каждая из этих 32 строк затем остается на конвейере. В конце выполнения неявно Write-Outputвставляет новую строку между элементами в конвейере, поэтому мы получаем это бесплатно.


1

Perl, 165 155 байт

$s='Dec  Chr   ';$_=join"\n",("$s| $s| $s","-"x34,map{join"| ",map{sprintf'%1$-5d%1$-6c',$_}($_,$_+32,$_+64)}32..63);s/ {8}/   Space/;s/\x7f.*/DEL\n/;print

1

Python 2, 1564 218 байт

Мой первый гольф, извините за очевидные ошибки

print("Dec  Chr   | "*3)[:-2]+"\n"+"-"*34+"\n32   Space | 64   @     | 96   `"
for n in range(33,63):print"| ".join([str(n+x).ljust(5)+chr(n+x).ljust(6)for x in [0,32,64]])
print"63   ?     | 95   _     | 127  DEL"

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

Если вам интересно, первая версия была строкой в ​​кодировке base64.


@FlipTack Изменил это на фактическое решение
sagiksp

Необязательные пробелы в ljust(6) for.
Yytsi

Еще один на x in [. И IIRC квадратные скобки внутри joinмогут удалить.
Yytsi

1

05AB1E , 82 76 байт

žQSDÇƵQ¸«.Bs𔇲”:"DEL"¸«.B)øvyð2×ý})3äøvy… | ©ý}®”†…  Chr  ÿ”3ר¨'-34×.Á.Á»

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

Все еще игра в гольф, это может быть улучшено много.


žQSDÇƵQ¸«.Bs𔇲”:"DEL"¸«.B)ø толкает дополненные числа текстовым эквивалентом:

[['32 ', 'Space'], ['33 ', '!    '], ['34 ', '"    '], ['35 ', '#    '], ['36 ', '$    '], ['37 ', '%    '], ['38 ', '&    '], ['39 ', "'    "], ['40 ', '(    '], ['41 ', ')    '], ['42 ', '*    '], ['43 ', '+    '], ['44 ', ',    '], ['45 ', '-    '], ['46 ', '.    '], ['47 ', '/    '], ['48 ', '0    '], ['49 ', '1    '], ['50 ', '2    '], ['51 ', '3    '], ['52 ', '4    '], ['53 ', '5    '], ['54 ', '6    '], ['55 ', '7    '], ['56 ', '8    '], ['57 ', '9    '], ['58 ', ':    '], ['59 ', ';    '], ['60 ', '<    '], ['61 ', '=    '], ['62 ', '>    '], ['63 ', '?    '], ['64 ', '@    '], ['65 ', 'A    '], ['66 ', 'B    '], ['67 ', 'C    '], ['68 ', 'D    '], ['69 ', 'E    '], ['70 ', 'F    '], ['71 ', 'G    '], ['72 ', 'H    '], ['73 ', 'I    '], ['74 ', 'J    '], ['75 ', 'K    '], ['76 ', 'L    '], ['77 ', 'M    '], ['78 ', 'N    '], ['79 ', 'O    '], ['80 ', 'P    '], ['81 ', 'Q    '], ['82 ', 'R    '], ['83 ', 'S    '], ['84 ', 'T    '], ['85 ', 'U    '], ['86 ', 'V    '], ['87 ', 'W    '], ['88 ', 'X    '], ['89 ', 'Y    '], ['90 ', 'Z    '], ['91 ', '[    '], ['92 ', '\\    '], ['93 ', ']    '], ['94 ', '^    '], ['95 ', '_    '], ['96 ', '`    '], ['97 ', 'a    '], ['98 ', 'b    '], ['99 ', 'c    '], ['100', 'd    '], ['101', 'e    '], ['102', 'f    '], ['103', 'g    '], ['104', 'h    '], ['105', 'i    '], ['106', 'j    '], ['107', 'k    '], ['108', 'l    '], ['109', 'm    '], ['110', 'n    '], ['111', 'o    '], ['112', 'p    '], ['113', 'q    '], ['114', 'r    '], ['115', 's    '], ['116', 't    '], ['117', 'u    '], ['118', 'v    '], ['119', 'w    '], ['120', 'x    '], ['121', 'y    '], ['122', 'z    '], ['123', '{    '], ['124', '|    '], ['125', '}    '], ['126', '~    '], ['127', 'DEL  ']]

vyð2×ý})3äøvy… | ©ý} объединяет их в таблицу:

['32   Space | 64   @     | 96   `    ', '33   !     | 65   A     | 97   a    ', '34   "     | 66   B     | 98   b    ', '35   #     | 67   C     | 99   c    ', '36   $     | 68   D     | 100  d    ', '37   %     | 69   E     | 101  e    ', '38   &     | 70   F     | 102  f    ', "39   '     | 71   G     | 103  g    ", '40   (     | 72   H     | 104  h    ', '41   )     | 73   I     | 105  i    ', '42   *     | 74   J     | 106  j    ', '43   +     | 75   K     | 107  k    ', '44   ,     | 76   L     | 108  l    ', '45   -     | 77   M     | 109  m    ', '46   .     | 78   N     | 110  n    ', '47   /     | 79   O     | 111  o    ', '48   0     | 80   P     | 112  p    ', '49   1     | 81   Q     | 113  q    ', '50   2     | 82   R     | 114  r    ', '51   3     | 83   S     | 115  s    ', '52   4     | 84   T     | 116  t    ', '53   5     | 85   U     | 117  u    ', '54   6     | 86   V     | 118  v    ', '55   7     | 87   W     | 119  w    ', '56   8     | 88   X     | 120  x    ', '57   9     | 89   Y     | 121  y    ', '58   :     | 90   Z     | 122  z    ', '59   ;     | 91   [     | 123  {    ', '60   <     | 92   \\     | 124  |    ', '61   =     | 93   ]     | 125  }    ', '62   >     | 94   ^     | 126  ~    ', '63   ?     | 95   _     | 127  DEL  ']

®”†… Chr ÿ”3ר¨'-34×.Á.Á» заботится о заголовочной части таблицы:

Dec  Chr   | Dec  Chr   | Dec  Chr   
----------------------------------
32   Space | 64   @     | 96   `    
33   !     | 65   A     | 97   a    
34   "     | 66   B     | 98   b    
35   #     | 67   C     | 99   c    
36   $     | 68   D     | 100  d    
37   %     | 69   E     | 101  e    
38   &     | 70   F     | 102  f    
39   '     | 71   G     | 103  g    
40   (     | 72   H     | 104  h    
41   )     | 73   I     | 105  i    
42   *     | 74   J     | 106  j    
43   +     | 75   K     | 107  k    
44   ,     | 76   L     | 108  l    
45   -     | 77   M     | 109  m    
46   .     | 78   N     | 110  n    
47   /     | 79   O     | 111  o    
48   0     | 80   P     | 112  p    
49   1     | 81   Q     | 113  q    
50   2     | 82   R     | 114  r    
51   3     | 83   S     | 115  s    
52   4     | 84   T     | 116  t    
53   5     | 85   U     | 117  u    
54   6     | 86   V     | 118  v    
55   7     | 87   W     | 119  w    
56   8     | 88   X     | 120  x    
57   9     | 89   Y     | 121  y    
58   :     | 90   Z     | 122  z    
59   ;     | 91   [     | 123  {    
60   <     | 92   \     | 124  |    
61   =     | 93   ]     | 125  }    
62   >     | 94   ^     | 126  ~    
63   ?     | 95   _     | 127  DEL  

1

PHP, 163 149 147 байт

<?=($p=str_pad)(D,31,"ec Chr   | D"),$p("
",32,"-");whhile($i<96)printf("%s%-4d%-6s",$i%3?"| ":"
",$o=$i%3*32+32+$i/3,$i++?$i<96?chr($o):DEL:Space);

сломать

                        # print header
<?=($p=str_pad)(D,31,"ec Chr   | D"),$p("\n",32,"-");
while($i<96)            # loop $i from 0 to 96
    printf("%s%-4d%-6s",    # print formatted:
                            # string, 4 space decimal leftbound, 6 space string leftbound
        $i%3?"| ":"\n",                 # linebreak for 1st column, pipe+space else
        $o=$i%3*32+32+$i/3,             # ($i mapped to) ASCII value
        $i++?$i<96?chr($o):DEL:Space    # character
    );

Использование %-Nстоит того байта, который сохраняют правые числа и символ.


На мой взгляд, выглядит лучше с тем же количеством байтов. Попробуйте онлайн!
Йорг Хюльсерманн


0

T-SQL, 242 байта

DECLARE @ INT=32PRINT'Dec  Chr   | Dec  Chr   | Dec  Chr
'+REPLICATE('-',34)L:PRINT CONCAT(@,'   ',IIF(@=32,'Space | ',CHAR(@)+'     | '),@+32,'   ',CHAR(@+32),'     | ',@+64,SPACE(5-LEN(@+64)),IIF(@=63,'DEL',CHAR(@+64)))SET @+=1IF @<64GOTO L

отформатирован:

DECLARE @ INT=32
PRINT'Dec  Chr   | Dec  Chr   | Dec  Chr
' + REPLICATE('-',34)
L:
    PRINT CONCAT(@,'   ',IIF(@=32,'Space | ',CHAR(@)+'     | ')
                ,@+32,'   ',CHAR(@+32),'     | ',
                 @+64,SPACE(5-LEN(@+64)),IIF(@=63,'DEL',CHAR(@+64)))
    SET @+=1
IF @<64 GOTO L

Пробовал несколько вариантов, включая замену различных общих строк другими переменными, но это была самая короткая версия, которую я нашел.



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