任意の2桁の10進数形式での出力端末の寸法(列と行)*。たとえば、出力は次のようになります80x25
。
インスピレーション。プロンプト。
*出力には、1つまたは2つの連続する行に両方のメジャーが必要です。また、出力の先頭および/または末尾の行は1つだけです(オプションで改行が続く場合があります)。(最大4)行は、max(cols、1 + len(str(cols))+ len(str(ro ws)))より長くてはなりません。
任意の2桁の10進数形式での出力端末の寸法(列と行)*。たとえば、出力は次のようになります80x25
。
インスピレーション。プロンプト。
*出力には、1つまたは2つの連続する行に両方のメジャーが必要です。また、出力の先頭および/または末尾の行は1つだけです(オプションで改行が続く場合があります)。(最大4)行は、max(cols、1 + len(str(cols))+ len(str(ro ws)))より長くてはなりません。
回答:
stty size
出力:
97 364
sh
とにかく、指定は本当に意味をなさない。
目に見える出力がないため、実際には競合していません。これは、印刷に必要な定型コードを使用せずに、現在の画面サイズを見つける最短の方法を示しています。
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
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
。この関数は複数回機能するため、メタに持ち込む必要があるかもしれませんが、それは単に望ましくない副作用があります。
RET
関数の最後で命令を中断しますか?
INT 20h
ではなく経由RET
でプログラムが終了することに注意してくださいRET
。経由で終了するPOPが機能しなくなったためです。
echo $COLUMNS $LINES
おかげで:
サンプル実行:
bash-4.3$ echo $COLUMNS $LINES
80 24
echo $COLUMNS\x$LINES
できますo / p80x24
os
?
import os
、os.
はより短いですfrom...
。
short m[4];main(){ioctl(0,21523,m);printf("%dx%d",*m,m[1]);}
m[0]
ことで*m
。
m
mainの引数を作成することにより、1バイトを保存できますmain(short m){ioctl(0,21523,&m);printf("%dx%d",m,(&m)[1]);}
main(int m){ioctl(0,21523,&m);printf("%x",m);}
サイズはベース16で印刷され、列と行の間にセパレータ(可能な先行ゼロ以外)が印刷されない46バイトになります。
using c=System.Console;_=>c.WindowWidth+"x"+c.WindowHeight;
にコンパイルされFunc<int, string
ますが、入力は使用されません。
> s=process.stdout;console.log(s.columns,s.rows)
80 25
process.stdout
s columns
とrows
値を使用します。
console.log([s.columns,s.rows])
。
with(process.stdout)console.log(columns,rows)
with(process.stdout)write(columns+[rows])
。または、カウントされない場合:with(process.stdout)write(columns+' '+rows)
コマンドラインフラグで実行 -rio/console
p IO.console.winsize
これが私の最初のルビーゴルフですので、もっとうまくできることがあるなら教えてください。
SztupYのおかげで5バイト節約
マナトワークのおかげで2バイト節約
これは、長さ2のリストとして高さと幅を出力します。
出力例:
[25, 80]
io/console
に単一引用符は必要ありません。引用符を付けないままにしておくと、シェルはその上で望ましくない拡張を実行しません。
現在の形式では出力が受け入れられない場合があります。
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
(mode)[3,4]-replace"\D"
(mode con)[3..4]
con
ですか?これは絶対に最初の行を取得します、そして私con
は常に最初だと思いますか?私が言うと思いstandard
システムはまた、唯一の我々が想定するべきものであるモードのための1つの出力を、持っているのだろうか?
import Foundation;var w=winsize();ioctl(STDOUT_FILENO,UInt(TIOCGWINSZ),&w);print(w.ws_col,w.ws_row)
彼らのコンソールパッケージの蒸気の人に感謝します。
「find」コマンドに直接パイピングすることで6バイトを保存しました。Adám/ OPの
おかげで1バイト節約されました。OPのコメントの
おかげで1バイト節約されました。
mode con|find "n"
エコーがオンになっているため、コマンド自体が出力されますが、OPでコメントされているように、先頭の行は問題ありません。
設定によっては、わずか13バイトで動作する場合があります。ただし、COMポートを使用するものがあると、過度に詳細な出力が発生するようです。
mode|find "n"
s:
→ n
。
mode
たが、「con」を追加することはで2つの異なる文字セットを探すよりも短いことがわかったからだろうfindstr
。
()=>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バイトを保存
using c=System.Console;class P{static void Main(){c.WriteLine(c.WindowWidth);c.Write(c.WindowHeight);}}
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
。
cmd/c
結果はになりCreateProcess error=2
ます。:(
Anders Tornbladのコメントの後に改訂。
con:size? .s
スタックの内容を印刷する行と列でコンソールの現在のサイズを返します。
出力:
2 n: 000000000285e5e0 1 300
1 n: 000000000285e4c0 1 90
swap
ですか?
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行以上を出力します:(
?"40x25
C64には、40 x 25文字の固定サイズのテキストコンソールがあります。コンソールサイズを照会する必要はありません。照会する方法がないため、これは良いことです。
{print(jline.TerminalFactory.get().run{"$width $height"})}
理由はありません。標準ライブラリには実際にコンソールサイズを決定する方法がないため、別のプロセスを起動して入力ストリームを解析したい場合は、ライブラリを取り込む必要があります... 誰かがそれをした場合は残念です。
termdim
デフォルトで許可されているように、出力をスタックに残します。使用例:
λ stacked -pe "termdim"
(117 26)
ボーナス:termdim'x'#`
それを持っている117x26
。
@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
ます。