任意两位十进制格式 *的输出端子尺寸(列和行)。例如,输出可能是80x25
。
启示。提示。
*输出必须在单个或两个连续的行上同时具有两个度量,并且输出的前导和/或尾随行可能不超过一个(可选地,后跟换行)。(最多四行)行不得超过max(cols,1 + len(str(cols))+ len(str(rows))))。
任意两位十进制格式 *的输出端子尺寸(列和行)。例如,输出可能是80x25
。
启示。提示。
*输出必须在单个或两个连续的行上同时具有两个度量,并且输出的前导和/或尾随行可能不超过一个(可选地,后跟换行)。(最多四行)行不得超过max(cols,1 + len(str(cols))+ len(str(rows))))。
Answers:
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
在函数末尾中断了指令?
INT 20h
,而不是通过退出RET
,这完全是因为POPs退出后RET
不再起作用。
echo $COLUMNS\x$LINES
就可以o / p80x24
由于您不需要特定的甲酸盐,只需使用以下resize
命令(的6个字符)xterm
:
$ resize
COLUMNS=120;
LINES=31;
export COLUMNS LINES;
#xterm, 6 bytes
。
os
呢?
import os
和os.
比短from...
。
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
小号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)
以当前形式输出可能不可接受。
该mode
命令是默认的Windows实用程序
关于mode
不指定使用情况的元发布con
(mode)[3,4]
获取mode的输出:
<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
系统也只有一个模式输出,这是我们应该假设的?
import Foundation;var w=winsize();ioctl(STDOUT_FILENO,UInt(TIOCGWINSZ),&w);print(w.ws_col,w.ws_row)
感谢Vapor的控制台软件包。
通过直接传递给“ find”命令节省了6个字节。
感谢Adám/ OP,节省了1个字节。
感谢OP发表评论,节省了1个字节。
mode con|find "n"
由于echo处于打开状态,因此这将输出命令本身,但是正如OP所评论的,引出线是可以的。
根据您的设置,它可能仅使用13个字节。但是,似乎使用COM端口进行任何操作都会导致输出过于冗长。
mode|find "n"
s:
→ n
。
mode
但是发现添加`con`比使用来查找两组不同的字符要短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中,默认值为“管道”。如您所见,这比使用Runtime.getRuntime().exec()
(也已弃用)并BufferedReader
通过冗长而费解的调用构造一个方法要短得多,这是Java API设计人员显然不愿意为方便起见添加重载的结果。
ProcessBuilder
可以在Windows上运行,但是mode
命令输出的行数超过4行:(
?"40x25
C64具有40 x 25个字符的固定大小的文本控制台。无需查询控制台大小,这是一件好事,因为无法查询它。
{print(jline.TerminalFactory.get().run{"$width $height"})}
因为为什么不。事实证明,标准库实际上没有办法确定控制台的大小,因此需要引入一个库,以免您想启动另一个进程并解析输入流…… 如果有人这样做,那真是太可惜了。
灵感来自@dieter 的https://codegolf.stackexchange.com/a/118696/42186
main(m){ioctl(0,21523,&m);write(1,&m,4);}
这会将大小输出为二进制数据。不知道这是否算作“任何格式”。您可能需要一些额外的东西(更少的东西,hexdump,od,ascii表)(或自动为您完成的深奥的终端模拟器),以使其易于阅读。用法示例:
$ ./a.out | od -sAn
58 204
终端大小为204列乘58行。
感谢@ Random832使用od
代替hexdump
。