告诉我我的控制台尺寸!


41

任意两位十进制格式 *的输出端子尺寸(列和行)。例如,输出可能是80x25


启示提示
*输出必须在单个或两个连续的行上同时具有两个度量,并且输出的前导和/或尾随行可能不超过一个(可选地,后跟换行)。(最多四行)行不得超过max(cols,1 + len(str(cols))+ len(str(ro‌ws))))。


2
我从未见过一个简短的挑战。恭喜!
Xcoder先生17年

13
@ Mr.Xcoder我专门在单行...
亚当

您将获得一线职位的学位!您确实擅长,不,非常擅长
于此

“一致格式”到底是什么意思?
费利佩·纳尔迪·巴蒂斯塔

1
@FelipeNardiBatista我暂时要说是,但如果导致荒谬,请还原。
阿达姆(Adám)'17

Answers:


27

* sh,9

stty size

输出:

97 364

也可以在bash中使用。
numbermaniac

2
或类似posix的系统上的任何其他外壳。
mvds

1
给定在此站点上看到的某些语言的名称,需要花费更长的时间才能知道* sh在这里是指“ bash,zsh,csh,破折号等”。而不是名称由星号后跟字母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。这可能需要带到Meta中,因为该功能确实可以多次工作,但它只会产生有害的副作用。

为什么“堆栈在输入时始终包含0”?我不知道堆栈被清零的任何规则。我猜您在谈论弹出返回值并认为该值将为0?是否可以保证使用COM二进制文件?
科迪·格雷

@CodyGray:在COM程序中,堆栈最初包含指向PSP开头(偏移量0)的近指针,因此RET将跳回到PSP:0,其中包含对EXIT的调用。stackoverflow.com/a/12593311/371250
ninjalj

啊,谢谢您的澄清,@ ninjalj。(顺带一提,您回答的好答案,顺便说一句。尽管很多年前对PSP的实现进行了反向工程,但我实际上忘记了有关PSP的所有细节。)但是,如果您将指针从堆栈中弹出而不回推,则不要您RET在函数末尾中断了指令?
科迪·格雷

@CodyGray:您会注意到,该程序通过退出INT 20h,而不是通过退出RET,这完全是因为POPs退出后RET不再起作用。
ninjalj

18

重击,22 20个字符

echo $COLUMNS $LINES

谢谢:

样品运行:

bash-4.3$ echo $COLUMNS $LINES
80 24

仅需再增加1个字节,echo $COLUMNS\x$LINES就可以o / p80x24
Pandya's

@Pandya是的,但不是必须的。
阿达姆(Adám)'17年

7
不知道这是否符合新的输出格式要求,但是您可能只是让$ COLUMNS \ x $ LINES输出“ bash:90x50:未找到命令”。假设这不适用于本地化,或者该命令确实存在!
Muzer's

14

xterm,6个字节

由于您不需要特定的甲酸盐,只需使用以下resize命令(的6个字符)xterm

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

1
真好 但是您可能想要编写一个标准标头,例如#xterm, 6 bytes
阿达姆(Adám)'17年

@Adám根据问题可以接受这种输出吗?
潘迪


@Adám好的。刚刚添加的标题:)
潘迪(Pandya)

这不是特定于xterm的。还要注意,输出取决于您的外壳。
celtschk

13

sh,20个字节

tput lines;tput cols

..太明显了,也许..


3
tcols; !:0 cols在bash中保存一个字节
marcosm'5

@marcos你的意思是tput lines;!:0 cols吧?
节食者

12

Python 3,30个字节

import os
os.get_terminal_size

由于它在TIO中不起作用,因此在此处使用了替代方法:

在线尝试!


1
为什么不只是os呢?
乔纳森·艾伦

2
...由于操作系统的原因,它无法在TIO上运行,因此需要指定。它确实可以在Windows上运行。还import osos.比短from...
乔纳森·艾伦

我可以确认它可以在Window 10上正常运行,而无需进行任何修改
Ferrybig '17

在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
替换m[0]为可以赢得两个字节*m
YSC

您可以通过将mmain作为参数来节省一个字节:main(short m){ioctl(0,21523,&m);printf("%dx%d",m,(&m)[1]);}
mvds

main(int m){ioctl(0,21523,&m);printf("%x",m);}将为46个字节,大小打印在基数16中,并且cols和行之间没有分隔符(可能的前导零除外)。
mvds


8

C#,59个字节

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

编译为Func<int, string,但是不使用输入。


不起作用;我发现这将返回调用AllocConsole()时控制台的大小,而不是控制台标准输入和输出实际连接到的大小。这里的问题:stackoverflow.com/questions/35688348/… 当我问这个问题时,我隐瞒的是我实际上是在Windows环境中运行的,其中stdin&stdout连接到ssh管道。win32 ssh实现未提供必需的。
约书亚记

7

NodeJS,50 48 46字节

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

用途process.stdout小号columnsrows值。


感谢@ETHproductions,将console.log添加到控制台输出中:)
Pete TNT

没问题:-)输出可以是任何一致的格式,所以我认为您可以通过这样做节省几个字节console.log([s.columns,s.rows])
ETHproductions's

5
1字节关闭:with(process.stdout)console.log(columns,rows)
Brian McCutchon

1
和几个字节off(如果此数): with(process.stdout)write(columns+[rows])。或者,如果不算在内:with(process.stdout)write(columns+' '+rows)
markasoftware's

1
@Markasoftware哦,这很聪明。不过,我认为第一个不算重要。
布赖恩·麦卡顿

6

Ruby,41 36 21 + 13 = 34字节

使用命令行标志运行 -rio/console

p IO.console.winsize

这是我的第一场Ruby高尔夫比赛,所以告诉我是否有什么可以做得更好的。

多亏了SztupY,节省了5个字节

通过操作节省了2个字节


这将输出高度,然后将宽度作为长度两个列表。

输出示例:

[25, 80]

您可以将需求移到-r命令行参数中,该参数仅增加2个字节
SztupY

不需要单引号io/console,如果不加引号,则没有外壳将对其执行不需要的扩展。
manatwork


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]

获取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]
Felipe Nardi Batista

嗯@FelipeNardiBatista可能是正确的,你需要骗子。
亚当

1
@FelipeNardiBatista是否con必要?这绝对是第一行,我相信con永远是第一行吗?我想说一个standard系统也只有一个模式输出,这是我们应该假设的?
colsw

1
@ConnorLSW只是我的系统运行正常,但您的答案在这里根本行不通
Felipe Nardi Batista


3

批处理,25 19 18 17字节

通过直接传递给“ find”命令节省了6个字节。
感谢Adám/ OP,节省了1个字节。
感谢OP发表评论,节省了1个字节。

mode con|find "n"

由于echo处于打开状态,因此这将输出命令本身,但是正如OP评论的,引出线是可以的。


根据您的设置,它可能仅使用13个字节。但是,似乎使用COM端口进行任何操作都会导致输出过于冗长。

mode|find "n"

保存一个字节s:n
阿达姆(Adám)'17年

1
@FelipeNardiBatista是的,我的说我有9001条线。这只是一个设置:“属性”>“布局”>“屏幕缓冲区大小”。
阿达姆(Adám)'17年

@FelipeNardiBatista Windows控制台尺寸与窗口尺寸不同。这就是为什么当您缩小窗口时会显示滚动条的原因。对于OP来说,这个确切的解决方案是可以的。
敬酒工程师

@AdámDangit,我寻找了一个较短的字符串,但不知道我是如何忽略它的。可能是因为我刚开始,mode但是发现添加`con`比使用来查找两组不同的字符要短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);}}
Caius Jard,

(如果答案比较短,我不确定如何打高尔夫球;我是编辑,评论还是发表自己的
想法

@CaiusJard您可以发布自己的答案或评论改进内容,然后由回答者决定是否要合并它。
TheLethalCoder

我想,只是无法及时编辑我的评论...尽管几乎同时发布了我自己的答案(包括它),所以我保证我不会刻薄你的灵感:)。我不太确定我是否在本质上是在编写返回答案的函数,而不是整个应用程序,这很骗人-所有其他答案几乎都是整个应用程序,但是CSharppPad.com再次会接受您的“唯一函数”版本并运行它..我想应该看一下打高尔夫球的规则
Caius Jard

@CaiusJard隐式允许使用函数/方法,除非在挑战本身中明确禁止使用。因此,匿名函数很好,请查看我的答案,以了解效果良好的版本。
TheLethalCoder

2

Java 8(无库),Windows,270字节

由亚当的推荐另行发布。

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
Conor O'Brien's

刚刚尝试过,Runtime.exec()将其解释为试图执行cmd/c结果CreateProcess error=2。:(
F. George

2

8th24 16 12字节

在Anders Tornblad评论后修订。

con:size? .s

返回打印堆栈内容的行和列的控制台当前大小。

输出:

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

2
由于问题允许使用任何输出格式,因此您真的需要swap吗?
Anders Tornblad '17

@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中,默认值为“管道”。如您所见,这比使用Runtime.getRuntime().exec()(也已弃用)并BufferedReader通过冗长而费解的调用构造一个方法要短得多,这是Java API设计人员显然不愿意为方便起见添加重载的结果。


我希望ProcessBuilder可以在Windows上运行,但是mode命令输出的行数超过4行:(
F. George

1

红色,19字节

system/console/size

输出:

>> system/console/size
== 106x26

也可以像上一个问题一样获得屏幕分辨率



1

Kotlin + Jline 2,58个字节

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

因为为什么不。事实证明,标准库实际上没有办法确定控制台的大小,因此需要引入一个库,以免您想启动另一个进程并解析输入流…… 如果有人这样做,那真是太可惜了。


不要在一个帖子中添加两个答案。
亚当

@Adám这是事后的想法,所以我认为这很好。您有足够的代表直接编辑它,如果您真的相信带有人为限制的270b应该是一个单独的答案。
F. George

每个提交都与使用相同语言的其他提交竞争。Java本质上是冗长的,但是您的Java是最短(也是唯一)的Java提交。另外,虽然我可以编辑您的信息,但无法以您的名字发布单独的答案。
阿达姆(Adám)'17年

我暗示如果您删除Java答案,我将自己重新发布它。而且,尽管您认为答案是目前最短的Java答案,但它是在不使用任何外部库的限制下进行编码的。为了解决您的争论,我将其标记为非竞争性,并在以后编写适当的Java答案。
F. George

将其发布为Java(没有库),然后使用…进行另一个提交,称为Java。那将使你得到我的三票。
2015年

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

这会将大小输出为二进制数据。不知道这是否算作“任何格式”。您可能需要一些额外的东西(更少的东西,hexdump,od,ascii表)(或自动为您完成的深奥的终端模拟器),以使其易于阅读。用法示例:

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

终端大小为204列乘58行。

感谢@ Random832使用od代替hexdump


1
我认为十六进制正在推动它。所有其他答案都使用十进制,因此我将把这一要求添加到OP中。抱歉。
2015年

1
od -s将以小数形式执行,并且比hexdump短
Random832 '17

@ Random832很酷,不知道,+ 1!但是,当规则从“任何格式”更改为非常特定的格式(例如:主流终端仿真器中的
asci
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.