ASCIIテーブルを印刷します


28

タスクは、ASCIIテーブルのn文字を表示することです。

印刷する最後の文字のインデックスとなるパラメーターnを受け取る関数(またはパラメーターとして引数を受け取るプログラム、STDINも使用できます)を作成できます。

タスクは非常に単純なので、例として、Python 2.7で可能な実装を示します。

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

私が言ったように、それは簡単な仕事です。これがコードゴルフであり、最短のコードが勝ちです!

編集

一部の人が指摘したように、このコードは結果を出力しません。私は英語で問題を説明するのに苦労するかもしれないので、それは単なる例です;-)。

EDIT2

最短のコードでなくても、プログラミング言語で回答を投稿してください。興味深い実装がいくつかあるかもしれません!

EDIT3

結果を出力するように例を修正しました。


1.関数でなければなりませんか?2.参照コードによると、nは印刷されない最初の文字になります。
デニス14年

2
実際には、参照コードは何も印刷しません。文字のリストを返すだけで、REPLが結果に対して必要な処理を実行できるようにします。
マナトワーク14年

1
誰かが下票について説明してもらえますか?私の英語がそんなに上手でなければ申し訳ありません。質問内に不明な点がある場合は教えてください。
oopbase 14年

1
for x in range(input()):print chr(x)サンプルを編集する場合は、実際に文字を印刷します。
FryAmTheEggman 14年

2
nota [i for i in range(n)]は非常に似ていますrange(n)
njzk2 14年

回答:


19

CJam、4バイト

ric,

STDINから読み取る完全なプログラム(オンラインインタープリターの入力フィールド)。

これはrange(chr(int(input()))),引数が文字の場合に文字の配列を返すという事実を利用して、単に実行されます。

c,入力が既にスタック上にあると仮定した場合に備えて、dibs on (2バイト)を呼び出します。


入力を指定する必要がありますか?オンラインランナーは、コード自体を出力するだけです。
マナトワーク14年

12
@manatwork:ちょっと待って。これらを投稿するときは急ぐ必要があります
デニス14年

私はこれに少し混乱しています。0の文字(別名0c)は、他の文字が印刷されないようにします。ric、(正常に動作するようです。これは、コードが動作しないことを意味します。
kaine 14年

1
@kaine:Internet ExplorerはC ++で記述されており、ヌル終了文字列を使用しません。よると、この、ヌル文字はHTML 5での解析エラーです。ブラウザはそれを に置き換えるか、ドキュメントの処理を中止する必要があります。
デニス14年

4
nASCII文字の最初の数ダースは印刷できない文字であるため、十分な大きさのを入力する必要があることに注意してください。楽しい事実:このプログラムは、Unicodeテーブルも出力します。たとえば、n = 9999
Sanchises 14年

25

ブレインファック- 169 146 142バイト

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

制限事項:

  • EOFは0でなければなりません
  • 8ビットのラッピングセルが必要
  • ^のため、256によるmods入力

ここでは最短の答えではありませんが、ちょっと、脳みそファック!これは、桁数を保証せずに人間が読める入力を必要とするという事実を除いて、本当に、本当に良い頭脳の挑戦です。入力を3文字にするために先頭にゼロを付ける必要があったかもしれませんが、それは何が楽しいですか?:Dこの方法で入力を取得する場合の1つの大きな問題は、brainfuckの唯一の分岐またはループ構造が、現在のセルがゼロかどうかをチェックすることです。入力にゼロを含めることができる場合、コードが取得すべきではない分岐を取得する可能性があります。この問題を解決するために、入力の各桁に1を加えた値を保存し、最後の可能な瞬間に超過分を差し引きます。そうすることで、ゼロがどこにあるかを常に把握できます。

これは、入力を解析することなく、頭の痛い挑戦だったと言っていました。何故ですか?さて、数値入力を受け取らないふりをしましょう。チャレンジは「入力のバイトを与え、そのバイトより下のすべてのASCII文字を出力する」ことです。私の答えは次のとおりです。


brainfuck-8バイト

,[->.+<]

それはまったく違います!実際のプログラムは、135個の命令を使用して入力を収集します(プログラムの95%以上!)。これは人間が入力するからです。数をバイトとして保存し、それを私に与えください。

(面白い事実:仮想プログラムを理解したら、おめでとうございます!Brainfuckを完全に理解しています。言語全体には8つのコマンドしかなく、そのプログラムはたまたまそれぞれを1回しか使用しません。)

説明

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

1
出力部分にいくつかのバイトを保存できます。 >[-]<[->.+<]現在のセルの隣のセルを0に設定し、現在のセルをカウントダウンしながら、隣のセルを増やしながら値を出力します。
シュジャール14年

@shuそれは素晴らしい点です!私はそれをまったく考えていませんでした。短くなることに加えて、大きな入力での窒息に伴う問題を修正し、おそらくより高速になります!ありがとう:)
地下

ええ、今ではずっとずっと速くなっています。>[-]<すでに空のセルの横にいたので、この部品も必要ありませんでした。:)
地下


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(インゴバークによる)

これはリストを逆に印刷しますが、OPは最初の n文字で、順番に並んでいるはないと言っています。

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

Befunge98に移動しないと、これ以上ゴルフができないかもしれません(「;」演算子については、 @ Kasranの回答を

ここで試してください:


ここからインラインインタープリターを使用したことを気にしないでください :)
IngoBürk14年

これは5バイト短いですので、質問は、我々は、任意の順序でそれを状態を印刷しなければならないこと:&> #- #1:# :#,_@(それはちょうど逆にそれを印刷します)
インゴ・バーク

合計15のバイトを削り取りました。改行のため、編集して投稿します。
インゴバーク14年

余分なゴルフでよくやった:)インライン通訳については、私はそれが存在することを知りませんでした。それは素晴らしい、ありがとう:)
karhell 14年

インタプリタはリンクされたチャレンジから新しく追加されました。私はあなたの答えを見たときに実際にそれを使うと思った。:)
IngoBürk14年

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、@ IngoBü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
関数を書くことが許可されているので、クラス全体とすべての必要はありません。
インゴバーク14年

1
@RodolfoDiasよろしいですか?明らかに、++i<n+1と同等である必要があります++i<=n。ただし、=そこに注意してください!1バイト節約するだけです。わたしにはできる。
インゴバーク14年

1
それで、void f(int n){int i=0;for(;++i<=n;System.out.print((char)i));}62バイトになります。少なくとも今はゴルフにこれ以上は出てこない。:)
IngoBürk14年

6

APL、5

⎕UCS⍳

使用例:

⎕UCS⍳256

1
dfnを作成する必要はありません。「UCS」だけで問題なく動作します。5文字
モリスズッカ14

1
127を超えるコードポイントをサポートする必要はありません。↑AVだけで問題ありません。4文字
アダム

6

JavaScriptが、ES6 - 52の 58 56 53 44 42バイト

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

これをFirefoxコンソールに貼り付けます。として実行f(NUM)ます。

最初のものが入力を適切に受け入れなかったため、長くする必要がありました。

ダウン3、edc65に感謝!Swivelのおかげで44まで低下!


1
これは実際にはパラメーターも入力も処理しません。
マナトワーク

70を別の数値に変更するだけです。それが入力です。
Scimonster

さて、6バイトのコストで入力を取得するように更新しました。
Scimonster

3
-2:f = n => [... Array(n)]。map((v、i)=> String.fromCharCode(i))
edc65 14年

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 14年

@ nyuszika7h今では
ジョンドヴォルザーク14年

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

編集:putcharの戻り値を活用することで改善
編集2:再帰により別の文字で削減


1
putchは非標準の関数です。また、なぜこの答えがダウン投票されたのかと尋ねてもいいですか?
スタンデュッデ

@Stuntddude putcharを使用する代替バージョンを追加しますが、これがなぜ投票されないのかわかりません。結局のところ、それは短いものの一つです。
タクラ

4

Perl、17バイト

say chr for 0..$_

1
括弧が多すぎます。print chr for 0..$ARGV[0]
マナトワーク14年

あなたが正しい!私はperlの使用ので、それはしばらくしている
Demnogonis

1
shift代わりに$ARGV[0]を使用して、2バイトを節約できます。
nyuszika7h 14年

別の行に文字を印刷できる場合は、を使用できますsay。また、を使用して1行で実行すると、文字数は短くなります-n。文字echo "90" | perl -nE'say chr for 0..$_'としてカウントされ18ます。17以下のためのsay chr for 0..$_プラス1のためにn
hmatt1 14年

あなたが正しい。しかしsay、perlのすべてのバージョンで動作するわけではありません。
デムノゴニス14年

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 14年

...しかし、そのエイリアス定義の文字もカウントする必要があります... :

3

J-5バイト

{.&a.

{.はHead、a.Alphabet(すべての文字のリスト)、および&Bondsで、次のようなモナド動詞を生成します。

{.&a. 100 NB. first 100 characters

:これは対話的に機能しないようです。JconsoleとjQtは翻訳を設定し、一部の制御文字の代わりにボックス文字を出力するようです。スクリプトまたはコマンドラインから、それでも動作します:

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

アルファベットが正確にASCIIではないことに注意してください。
FUZxxl

まで{.&a. 127、それはないですか?
jpjacobs

いいえ、Jには一部の制御文字の代わりにボックス描画文字があるためです。
FUZxxl

実際、これをファイルに書き込み、16進ビューアで検査すると、Jが正しい値(0x00 0x01、...)を出力することがわかります。これらの値を制御文字ではなくボックス描画文字として解釈するのは、Jインタプリタ/ IDEのみです。それは、使用している他のすべての言語charまたは同等のものとまったく同じです。
jpjacobs

UNIXボックスでテストし、実際にいくつかのコードポイントに対してUnicode文字を出力したため、これは奇妙です。
FUZxxl


3

Brainfuck、44バイト

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

末尾の改行のない10進数の文字列が必要です。

オンラインでお試しください。

[0, max_cell_size]Brainfuck の範囲の整数を読み取ることは難しくありません。自分でクリーンな方法を発明することをお勧めします。これは初心者レベルの練習だと思います。(セルの数値を印刷する逆の操作はより複雑であり、中間レベルのタスクと見なすことができます。)

2568ビット実装で処理できる58バイトのバージョンは次のとおりです。

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


なぜ私はこれを考えていないのですか???これは独創的です!!!
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

~,''+

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

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                                               ;

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.


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


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

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

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.

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])]))

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)


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


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.

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.