コンソールの寸法を教えてください!


41

任意の2桁の10進数形式での出力端末の寸法(列と行)*。たとえば、出力は次のようになります80x25


インスピレーションプロンプト
*出力には、1つまたは2つの連続する行に両方のメジャーが必要です。また、出力の先頭および/または末尾の行は1つだけです(オプションで改行が続く場合があります)。(最大4)行は、max(cols、1 + len(str(cols))+ len(str(ro‌ ws)))より長くてはなりません。


2
私はこれまで短い挑戦を見ていない。おめでとうございます!
ミスターXcoder

13
@ Mr.Xcoder私はワンライナーを専門としています…
アダム

1行の投稿で学位を取得しようとしています!あなたはそれで非常に良い、いや、確かに優れている:...))
ミスターXcoder

「一貫した形式」とは正確に何を意味するのでしょうか?
フェリペナルディバティスタ

1
@FelipeNardiBatista今のところはいと言いますが、これが不条理につながる場合は元に戻します。
アダム

回答:


27

* sh、9

stty size

出力:

97 364

bashでも機能します。
numbermaniac

2
または、posixのようなシステム上の他のシェル。
mvds

1
このサイトで見られるいくつかの言語の名前を考えると、ここで* shが「bash、zsh、csh、dashなど」を指すことを理解するのに時間がかかります。名前がアスタリスクの後に文字sとhが続く言語ではなく:
ShreevatsaR

技術的には、プログラムを実行するのにシェルさえ必要ありません。shとにかく、指定は本当に意味をなさない。
mvds

20

8086マシンコード、11バイト(関数として、非競合)

目に見える出力がないため、実際には競合していません。これは、印刷に必要な定型コードを使用せずに、現在の画面サイズを見つける最短の方法を示しています。

00000000  6a 40 1f a0 84 00 40 8a  26 4a 00                 |j@....@.&J.|
0000000b

使い方:

6a 40           |   push 0x40       ; bios data segment
1f              |   pop ds
a0 84 00        |   mov al, [0x84]  ; console rows - 1
40              |   inc ax
8a 26 4a 00     |   mov ah, [0x4a]  ; console columns

8086マシンコード、48バイト(完全なプログラムとして)

00000000  1f bf 30 01 a0 84 04 40  e8 1a 00 b0 78 aa a0 4a  |..0....@....x..J|
00000010  04 e8 11 00 8d 8d d0 fe  8d 75 ff 06 1f fd ac cd  |.........u......|
00000020  29 e2 fb cd 20 d4 0a 0c  30 aa c1 e8 08 75 f6 c3  |)... ...0....u..|
00000030

使い方:

                |   org 0x100
                |   use16
1f              |       pop ds              ; clear ds (the stack always contains 0 on entry)
bf 30 01        |       mov di, d           ; set destination ptr
a0 84 04        |       mov al, [0x484]     ; console rows - 1
40              |       inc ax
e8 1a 00        |       call to_ascii       ; convert to ascii
b0 78           |       mov al, 'x'
aa              |       stosb
a0 4a 04        |       mov al, [0x44a]     ; console columns
e8 11 00        |       call to_ascii
8d 8d d0 fe     |       lea cx, [di-d]      ; number of characters to print
8d 75 ff        |       lea si, [di-1]      ; set source ptr
06              |       push es
1f              |       pop ds
fd              |       std                 ; reverse direction flag
ac              |   @@: lodsb               ; load (al = *si--)
cd 29           |       int 0x29            ; print al to console, bypassing stdout
e2 fb           |       loop @b             ; repeat while (--cx != 0)
cd 20           |       int 0x20            ; terminate
                |   
                |   to_ascii:
d4 0a           |       aam 10              ; ah = (al / 10), al = (al % 10)
0c 30           |       or al, 0x30         ; convert al to ascii number
aa              |       stosb               ; store (*di++ = al)
c1 e8 08        |       shr ax, 8           ; shift ah to al
75 f6           |       jnz to_ascii        ; repeat if non-zero
c3              |       ret
                |   
                |   d rb 0

関数の送信にはret?が必要になると確信しています。また、あなたが強盗をすることを許可されているかどうかはわかりませんds。この関数は複数回機能するため、メタに持ち込む必要があるかもしれませんが、それは単に望ましくない副作用があります。

なぜ「スタックのエントリには常に0が含まれる」のですか?スタックがゼロになるというルールは知りません。私はあなたが戻り値をポップし、それが0になるだろうと考えていると思いますか?COMバイナリに対して保証されていますか?
コーディグレー

@CodyGray:COMプログラムでは、スタックには最初にPSPの開始点へのニアポインター(オフセット0)が含まれているため、RETはPSP:0に戻り、EXITへの呼び出しが含まれます。stackoverflow.com/a/12593311/371250
ninjalj

ああ、説明をありがとう、@ ninjalj。(あなたがリンクした素晴らしい答え、ところで。私は何年も前にその実装をリバースエンジニアリングしたにもかかわらず、PSPに関する詳細のほとんどすべてを忘れていました。)RET関数の最後で命令を中断しますか?
コーディグレー

@CodyGray:経由INT 20hではなく経由RETでプログラムが終了することに注意してくださいRET。経由で終了するPOPが機能しなくなったためです。
-ninjalj

18

Bash、22 20文字

echo $COLUMNS $LINES

おかげで:

サンプル実行:

bash-4.3$ echo $COLUMNS $LINES
80 24

あと1バイトで、echo $COLUMNS\x$LINESできますo / p80x24
パンディア

@Pandya本当ですが、必須ではありません。
アダム

7
これが新しい出力形式の要件に準拠しているかどうかはわかりませんが、「bash:90x50:command not found」を出力するために$ COLUMNS \ x $ LINESを設定するだけで済みます。ただし、ローカライズでは機能しない場合、またはそのコマンドが実際に存在する場合を想定してください。
ミューザー

14

xterm、6バイト

特定のギ酸塩は必要ないので、単純にresize(6文字)コマンドを使用できますxterm

$ resize
COLUMNS=120;
LINES=31;
export COLUMNS LINES;

1
いいね ただし、などの標準ヘッダーを作成することもできます#xterm, 6 bytes
アダム

@Adámこのタイプの出力は質問に従って受け入れられますか?
パンディア


@AdámOK。ヘッダーを追加しました:)
パンディア

これはxterm固有ではありません。また、出力はシェルに依存することに注意してください。
celtschk

13

sh、20バイト

tput lines;tput cols

..あまりにも明白な、多分..


3
tput cols; !:0 colsは1バイトをbashに保存します
marcosm

@marcosという意味tput lines;!:0 colsですか?
ディーター

12

Python 3、30バイト

import os
os.get_terminal_size

TIOでは機能しないため、代替手段が使用されます。

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


1
どうしてos
ジョナサンアラン

2
...オペレーティングシステムが原因でTIOで動作しないため、指定する必要があります。それはありません Windows上で作業を。またimport osos.はより短いですfrom...
ジョナサンアラン

私はそれがどんな変更を加えることなくウィンドウ10上で動作を確認することができます
Ferrybig

あまりにもMac上で動作します
ミスターXcoder

1
技術的にPython 3.3以降
matsjoyce

11

C(Linuxのみ)、63 61

short m[4];main(){ioctl(0,21523,m);printf("%dx%d",*m,m[1]);}

4
あなたは置き換えることで2バイトに勝つことができるm[0]ことで*m
YSC

mmainの引数を作成することにより、1バイトを保存できますmain(short m){ioctl(0,21523,&m);printf("%dx%d",m,(&m)[1]);}
。– mvds

main(int m){ioctl(0,21523,&m);printf("%x",m);}サイズはベース16で印刷され、列と行の間にセパレータ(可能な先行ゼロ以外)が印刷されない46バイトになります。
mvds


8

C#、59バイト

using c=System.Console;_=>c.WindowWidth+"x"+c.WindowHeight;

にコンパイルされFunc<int, stringますが、入力は使用されません。


動作しません; これは、コンソールの標準入力と出力が実際に接続されているサイズではなく、AllocConsole()が呼び出された場合のコンソールのサイズを返します。ここでの質問:stackoverflow.com/questions/35688348/…質問をする ときに私が差し控えたのは、実際にsshパイプラインに接続されたstdinとstdoutを備えたWindows環境で実行していたということです。win32 ssh実装では、必要なものは提供されません。
ジョシュア

7

NodeJS、50 48 46バイト

> s=process.stdout;console.log(s.columns,s.rows)
80 25

process.stdouts columnsrows値を使用します。


@ETHproductionsに感謝し、console.logをコンソールへの出力に追加しました:)
ピートTNT

問題ありません:-)出力は任意の一貫した形式にすることができるので、を実行することで数バイト節約できると思いますconsole.log([s.columns,s.rows])
ETHproductions

5
1バイトオフ:with(process.stdout)console.log(columns,rows)
ブライアンマックラッチン

1
そして、さらにいくつかは(このカウントであれば)バイトoff: with(process.stdout)write(columns+[rows])。または、カウントされない場合:with(process.stdout)write(columns+' '+rows)
markasoftware

1
@Markasoftwareああ、それは賢い。ただし、最初のものは重要ではないと思います。
ブライアンマックラッチン

6

ルビー、41 36 21 + 13 = 34バイト

コマンドラインフラグで実行 -rio/console

p IO.console.winsize

これが私の最初のルビーゴルフですので、もっとうまくできることがあるなら教えてください。

SztupYのおかげで5バイト節約

マナトワークのおかげで2バイト節約


これは、長さ2のリストとして高さと幅を出力します。

出力例:

[25, 80]

必要なものを-rコマンドラインパラメーターに移動することができますが、これはたった2バイトです
-SztupY

前後io/consoleに単一引用符は必要ありません。引用符を付けないままにしておくと、シェルはその上で望ましくない拡張を実行しません。
マナトワーク


4

C#94バイト(アプリ全体)

MetaColonのアプリ全体の答えは、かなり短くすることができます。

using c=System.Console;class P{static void Main(){c.Write(c.WindowWidth+' '+c.WindowHeight);}}

4

PowerShell +モード、11バイト?

現在の形式では出力が受け入れられない場合があります。

modeコマンドは、デフォルトのWindowsユーティリティです

mode指定なしの使用に関するメタ投稿con

(mode)[3,4]

モードの出力を取得します。

<Whitespace>
Status for device CON:
----------------------
    Lines:          3000
    Columns:        120
    Keyboard rate:  31
    Keyboard delay: 1
    Code page:      850

次に、4行目と5行目([3,4])の出力:

PS H:\> (mode)[3,4]
    Lines:          3000
    Columns:        120

2バイト節約します(mode)[3,4]-replace"\D"
。–アダム

ここでこれを機能させるには、使用する必要があります(mode con)[3..4]
フェリペナルディバティスタ

ああ@FelipeNardiBatistaはおそらくあなたが詐欺を必要とすることは正しいです。
アダム

1
@FelipeNardiBatistaは必要conですか?これは絶対に最初の行を取得します、そして私conは常に最初だと思いますか?私が言うと思いstandardシステムはまた、唯一の我々が想定するべきものであるモードのための1つの出力を、持っているのだろうか?
colsw

1
@ConnorLSWそれは私のシステムが正常に動作するということだけですが、あなたの答えはここでは単に動作しません
フェリペナルディバティスタ


3

バッチ、25 19 18 17バイト

「find」コマンドに直接パイピングすることで6バイトを保存しました。Adám/ OPの
おかげで1バイト節約されましたOPのコメントの
おかげで1バイト節約されました

mode con|find "n"

エコーがオンになっているため、コマンド自体が出力されますが、OPコメントされているように、先頭の行は問題ありません。


設定によっては、わずか13バイトで動作する場合があります。ただし、COMポートを使用するものがあると、過度に詳細な出力が発生するようです。

mode|find "n"

バイトを保存s:n
アダム

1
@FelipeNardiBatistaええ、私は9001行を持っていると言います。それは単なる設定です:プロパティ>レイアウト>画面バッファサイズ。
アダム

@FelipeNardiBatista Windowsコンソールの寸法は、ウィンドウの寸法と同じではありません。そのため、ウィンドウを小さくするとスクロールバーが表示されます。OPごとに、この正確な解決策は問題ありません。
エンジニアトースト

@AdámDangit、私は短い文字列を探しましたが、どのように見落としていたかわかりません。たぶん私はただ始めmodeたが、「con」を追加することはで2つの異なる文字セットを探すよりも短いことがわかったからだろうfindstr
エンジニアトースト

@Adám あなたのコメントに基づいてこれは有効@mode|find "L" /iでしょうか?上記の18ではなく、17バイトの行、列、およびキーボード遅延を返します。これらの先頭/末尾の行は空にする必要がありますか?
エンジニアトースト

3

C#、85バイト

()=>System.Console.Write(System.Console.WindowWidth+"x"+System.Console.WindowHeight);

アプリケーションコード全体が必要な場合、115 101 94バイトになります。

using C=System.Console;class P{static void Main()=>C.Write(C.WindowWidth+"x"+C.WindowHeight);}

ただし、バッファサイズも意味する可能性があります。85バイトが再びあります。

()=>System.Console.Write(System.Console.BufferWidth+"x"+System.Console.BufferHeight);

または、アプリケーションコード全体として(明らかに115 101 94バイト

using C=System.Console;class P{static void Main()=>C.Write(C.BufferWidth+"x"+C.BufferHeight);}

Caius Jardの助けを借りて、アプリケーションコード全体で14バイトを保存


1
104は、全体のアプリをバイト、おそらくあなたは、他の変形にロジックを拡張することができます:using c=System.Console;class P{static void Main(){c.WriteLine(c.WindowWidth);c.Write(c.WindowHeight);}}
キーズJard

(短い回答がある場合、ゴルフの方法がわかりません。あなたのものを編集したり、コメントしたり、自分で投稿したりしますか?)
Caius Jard

@CaiusJard独自の回答を投稿したり、改善点をコメントしたりして、回答者にそれを組み込むかどうかを決定させることができます。
TheLethalCoder

時間内にコメントを編集することはできませんでした...自分の答え(それを含む)をほぼ同時に投稿しましたが、私はあなたのインスピレーションを傷つけていなかったと思います:)。アプリ全体ではなく、答えを返す関数を本質的に書くのがカンニングだと思うかどうかはあまりわかりません。他のすべての答えはアプリ全体ですが、CSharppPad.comは「唯一の関数」バージョンを受け入れます。そしてそれを実行...ゴルフに関する規則を調べる必要があり、私は推測する
カイウスJard

@CaiusJard関数/メソッドは、チャレンジ自体で明示的に禁止されていない限り、暗黙的に許可されます。したがって、匿名関数は問題ありません。うまく機能するバージョンについては私の答えをご覧ください。
TheLethalCoder

2

Java 8(ライブラリーなし)、Windows、270バイト

Adamの推奨により別々に投稿する。

interface B{static void main(String[] a)throws Exception{Object[]r=new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec("cmd /c mode").getInputStream())).lines().toArray();System.out.print(r[3]+"\n"+r[4]);}}

ゴルフをしていない:

interface B {
    static void main(String[] a) throws Exception {
        Object[] r = new java.io.BufferedReader(new java.io.InputStreamReader(
                Runtime.getRuntime().exec("cmd /c mode").getInputStream())
        ).lines().toArray();
        System.out.print(r[3] + "\n" + r[4]);
    }
}

cmd/c mode代わりに試してくださいcmd /c mode
コナーオブライエン

試しただけで、Runtime.exec()はそれを実行しようとして解釈し、cmd/c結果はになりCreateProcess error=2ます。:(
F.ジョージ

2

8番目24 16 12バイト

Anders Tornbladのコメントの後に改訂。

con:size? .s

スタックの内容を印刷する行と列でコンソールの現在のサイズを返します。

出力:

2  n: 000000000285e5e0 1   300
1  n: 000000000285e4c0 1   90

2
質問は任意の出力形式を許可するため、本当に必要swapですか?
アンダーストーンブラッド

@Anders Tornblad-賢明なコメントをありがとう。コードを改善しました。
カオスマナー

2

Java + * nix、113

interface B{static void main(String[] a)throws Exception{new ProcessBuilder("stty","size").inheritIO().start();}}

ゴルフをしていない:

interface B{
    static void main(String[] a)throws Exception{
        new ProcessBuilder("stty","size").inheritIO().start();
    }
}

ProcessBuilder.inheritIO子プロセスの入出力が継承されます。これはCのデフォルトですexec。Javaでは、デフォルトは「piped」です。ご覧のように、これは、Java APIデザイナーが利便性のためにオーバーロードを追加したがらないために、長く複雑な呼び出しを使用してRuntime.getRuntime().exec()(これも非推奨です)使用して構築するよりもずっと短いBufferedReaderです。


ProcessBuilderはWindows上で動作したいのですが、modeコマンドは4行以上を出力します:(
F.ジョージ


1

Commodore 64 BASIC、7バイト

?"40x25

C64には、40 x 25文字の固定サイズのテキストコンソールがあります。コンソールサイズを照会する必要はありません。照会する方法がないため、これは良いことです。


これは不正行為のように思えますが、公平であるとはいえ、この質問(またはそのインスピレーション)はそれを特に禁止していません。
コーディグレー


1

Kotlin + Jline 2、58バイト

{print(jline.TerminalFactory.get().run{"$width $height"})}

理由はありません。標準ライブラリには実際にコンソールサイズを決定する方法がないため、別のプロセスを起動して入力ストリームを解析したい場合は、ライブラリを取り込む必要があります... 誰かがそれをした場合は残念です。


1つの投稿に2つの回答を入れないでください。
アダム

@Adámあとから考え直したので、大丈夫だと思います。直接編集するのに十分な担当者がいるので、任意の制限のある270bが個別の回答であると本当に信じている場合はそうしてください。
F.ジョージ

各提出物は、同じ言語の他の提出物と競合します。Javaは本質的に冗長ですが、あなたのものは最も短い(そして唯一の)Java提出です。また、私はあなたの投稿を編集できますが、あなたの名前で別の回答を投稿することはできません。
アダム

Javaの回答を削除すると、自分で再投稿することになりました。そして、あなたは答えが現在最も短いJavaの答えであるという点を持っていますが、外部ライブラリを使用しないという制限の下でコーディングされています。あなたの議論に対処するために、私はそれを非競合としてマークし、後で適切なJavaの答えをコーディングします。
F.ジョージ

それをJava(ライブラリーなし)として投稿し、Javaと呼ばれる別の投稿を…で行います。それで、私から3つの賛成票が得られます。
アダム

1

積み上げ、7バイト

termdim

デフォルトで許可されているように、出力をスタックに残します。使用例:

λ stacked -pe "termdim"
(117 26)

ボーナス:termdim'x'#`それを持っている117x26


1

C(Linux、C89のみ)、45 41

@dieterによるhttps://codegolf.stackexchange.com/a/118696/42186に触発された

main(m){ioctl(0,21523,&m);write(1,&m,4);}

これにより、サイズがバイナリデータとして出力されます。これが「任意の形式」としてカウントされるかどうかはわかりません。人間が読めるようにするには、何か追加(less、hexdump、od、asciiテーブル)(またはこれを自動的に行う難解なターミナルエミュレータ)が必要です。使用例:

$ ./a.out | od -sAn
     58    204

端末のサイズは、204列x 58行です。

od代わりに使用してくれた@ Random832に感謝しhexdumpます。


1
ヘックスがそれを推進していると思います。他のすべての答えは10進数を使用するため、この要件をOPに追加します。ごめんなさい。
アダム

1
od -sは10進数でそれを行い、hexdumpよりも短い
Random832

@ Random832クール、それを知らなかった、+ 1!しかし、ルールが「任意の形式」から非常に特定の形式(メインストリーム端末エミュレーターのasciiの基数10など)に変更されたとき、この回答はとにかく無効になりました
mvds
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.