내 콘솔 크기를 알려주세요!


41

소수점 이하 두 자릿수 형식으로 출력 터미널 치수 (열 및 행) *. 예를 들어, 출력은입니다 80x25.


영감 . 프롬프트 .
* 출력은 하나 또는 두 개의 연속 라인에서 두 측정 값을 가져야하며, 하나 이상의 선행 및 / 또는 후행 출력 라인이있을 수 있습니다 (선택적으로 개행). (최대 4 줄)은 max (cols, 1 + len (str (cols)) + len (str (ro‌ws))보다 길지 않아야합니다.


2
나는 더 짧은 upvoted 도전을 본 적이 없다. 축하합니다!
Mr. Xcoder

13
@ Mr.Xcoder 나는 하나의 라이너를 전문으로…
Adám

한 줄짜리 게시물에서 학위를 받으려고합니다! 당신은 참으로 훌륭합니다, 아니오, 아주 잘합니다
:)

'일관된 형식'이란 정확히 무엇을 의미합니까?
Felipe Nardi Batista

1
@FelipeNardiBatista 지금은 '예'라고 말하지만 이것이 부조리로 이어지면 되돌릴 수 있습니다.
Adám

답변:


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? 가 필요할 것이라고 확신합니다 . 또한, 당신이 clobber 할 수 있는지 확실하지 않습니다 ds. 함수가 두 번 이상 작동하므로 원하지 않는 부작용이 있기 때문에 메타로 가져와야 할 수도 있습니다.

"스택에 항상 스택에 0이 포함되는"이유는 무엇입니까? 스택이 제로화되는 규칙을 모르겠습니다. 반환 값을 팝하고 0이 될 것이라고 생각하는 것 같아요? COM 바이너리에 대해 보장됩니까?
코디 그레이

@CodyGray : COM 프로그램에서 스택에는 처음에 PSP 시작 (오프셋 0)에 가까운 포인터가 포함되어 있으므로 RET은 PSP : 0으로 되돌아가 EXIT에 대한 호출을 포함합니다. stackoverflow.com/a/12593311/371250
ninjalj

아, 감사합니다, @ninjalj. (당신이 BTW를 연결 한 훌륭한 답변입니다. 수년 전에 구현을 리버스 엔지니어링 했음에도 불구하고 PSP에 대한 거의 모든 세부 사항을 잊어 버렸습니다.) 그러나 포인터를 뒤로 밀지 않고 스택에서 튀어 나오면하지 마십시오. RET함수의 끝에서 명령 을 깰 까요?
코디 그레이

@CodyGray : POPing 종료 후 더 이상 작동하지 않기 때문에 프로그램이 via INT 20h가 아닌을 통해 RET종료됩니다 RET.
ninjalj

18

배쉬, 22 20 자

echo $COLUMNS $LINES

덕분에 :

샘플 실행 :

bash-4.3$ echo $COLUMNS $LINES
80 24

1 바이트 만 더 echo $COLUMNS\x$LINES있으면 o / p 가능80x24
Pandya

@Pandya True이지만 필수는 아닙니다.
Adám

7
이것이 새로운 출력 형식 요구 사항을 준수하는지 확실하지 않지만 $ COLUMNS \ x $ LINES를 사용하여 "bash : 90x50 : command not found"를 출력 할 수 있습니다. 그래도 현지화에서 작동하지 않거나 해당 명령이 실제로 존재한다고 가정하십시오.
Muzer

14

xterm, 6 바이트

특정 형식이 필요하지 않으므로 다음의 resize(6 문자) 명령을 간단히 사용할 수 있습니다 xterm.

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

1
좋은. 그러나 같은 표준 헤더를 작성하고 싶을 수도 있습니다 #xterm, 6 bytes.
Adám

@ Adám이 유형의 출력은 질문에 따라 허용됩니까?
Pandya


@ Adám ok. 방금 추가 한 헤더 :)
Pandya

이것은 xterm별로 다릅니다. 또한 출력은 쉘에 따라 다릅니다.
celtschk

13

sh, 20 바이트

tput lines;tput cols

.. 너무 분명 할 것입니다 ..


3
입력 열; ! : 0 cols는 bash에 1 바이트를 저장합니다
marcosm

@marcos 그렇죠 tput lines;!:0 cols?
Dieter

12

파이썬 3 , 30 바이트

import os
os.get_terminal_size

TIO에서는 작동하지 않으므로 다음과 같은 대안이 사용됩니다.

온라인으로 사용해보십시오!


1
왜 안돼 os?
Jonathan Allan

2
... 운영 체제로 인해 TIO에서 작동하지 않으므로 지정해야합니다. 그것은 않습니다 Windows에서 작업을. 또한 import osos.보다 짧은 from....
Jonathan Allan

수정없이 Window 10에서 작동하는지 확인할 수 있습니다
Ferrybig

맥에서도 작동
Mr. Xcoder

1
기술적으로 파이썬 3.3 이상
matsjoyce

11

C (리눅스 만 해당), 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으로 인쇄되고 열과 행 사이에 구분 기호 (가능한 선행 0 제외)가없는 46 바이트입니다.
mvds


8

C #, 59 바이트

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

Func<int, string그러나로 컴파일 하면 입력이 사용되지 않습니다.


작동하지 않습니다. 콘솔 표준 입력 및 출력이 실제로 연결된 크기가 아니라 AllocConsole ()이 호출 된 경우 콘솔의 크기를 반환한다는 것을 알았습니다. 질문 : stackoverflow.com/questions/35688348/… 질문을 할 때 내가 보류 한 것은 실제로 stdin & stdout이 ssh 파이프 라인에 연결된 Windows 환경에서 실행 중이라는 것입니다. win32 ssh 구현은 필요한 기능을 제공하지 않습니다.
Joshua

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)
Brian McCutchon

1
그리고 몇 바이트 더 떨어져 (이것이 중요하다면) : with(process.stdout)write(columns+[rows]). 또는 계산에 포함되지 않는 경우 :with(process.stdout)write(columns+' '+rows)
markasoftware

1
@Markasoftware Ooh, 영리합니다. 그래도 첫 번째는 중요하지 않다고 생각합니다.
Brian McCutchon

6

루비, 41 36 21 + 13 = 34 바이트

명령 행 플래그로 실행 -rio/console

p IO.console.winsize

이것이 나의 첫번째 루비 골프이다. 그래서 내가 더 잘 할 수있는 것이 있는지 말해주세요.

SztupY 덕분에 5 바이트 절약

manatwork 덕분에 2 바이트 절약


이렇게하면 높이와 너비가 길이 2 목록으로 출력됩니다.

출력 예 :

[25, 80]

잠재적으로 2 개의 여분 바이트 인 -r 명령 행 매개 변수로 요구 사항을 이동할 수 있습니다.
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]

모드의 출력을 얻습니다.

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

그런 다음 네 번째 및 다섯 번째 줄 ( [3,4])이 출력됩니다.

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

2 바이트를 절약하십시오 :(mode)[3,4]-replace"\D"
Adám

이 작업을하려면 여기를 사용해야합니다.(mode con)[3..4]
Felipe Nardi Batista

아 @ @FelipeNardiBatista 아마 당신이 사기가 필요합니다.
Adám

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

1
@FelipeNardiBatista 그래, 내 말에 9001 라인이 있다고합니다. 속성> 레이아웃> 스크린 버퍼 크기 설정입니다.
Adám

@FelipeNardiBatista Windows 콘솔 크기는 창 크기와 다릅니다. 이것이 창을 작게 만들 때 스크롤 막대가 나타나는 이유입니다. OP 당 이 정확한 솔루션은 괜찮습니다.
엔지니어 토스트

@ Adám Dangit, 나는 더 짧은 줄을 찾았고 그것을 어떻게 간과했는지 모릅니다. 아마 내가 시작한 것이기 때문에 아마도 modecon을 추가하는 것이 두 개의 다른 문자 집합을 찾는 것보다 짧다는 것을 알았습니다 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

(짧은 답변이 있으면 골프를 치는 방법을 잘 모르겠습니다. 편집하거나 의견을 말하거나 직접 게시 하시겠습니까?)
Caius Jard

@CaiusJard 당신은 당신의 자신의 답변을 게시하거나 개선점을 언급하고 답변자가 통합할지 여부를 결정하게 할 수 있습니다.
TheLethalCoder

나는 제 시간에 내 의견을 편집 할 수없고 싶었습니다 ... 거의 동시에 자신의 답변 (포함)을 게시 했으므로 영감을 얻지 못했습니다 :). 전체 앱이 아니라 응답을 반환하는 함수를 작성하는 것이 바람을 피우고 있다고 생각하는지 여부는 확실하지 않습니다. 다른 모든 답변은 거의 전체 앱이지만 CSharppPad.com은 "단일 기능"버전을 수락합니다. 그리고 그것을 실행 .. 골프에 대한 규칙을 찾아봐야 할 것 같아요
Caius 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.
코너 O'Brien

실행하려고처럼 시도, Runtime.exec의 () 해석 cmd/c의 결과 CreateProcess error=2. :(
F. George

2

8 , 24 16 12 바이트

Anders Tornblad의 의견에 따라 수정되었습니다.

con:size? .s

스택 내용을 인쇄하는 콘솔의 현재 크기를 행과 열로 반환합니다.

산출:

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

2
질문에 모든 출력 형식이 허용되므로 실제로 필요 swap합니까?
Anders Tornblad

@Anders Tornblad-현명한 의견에 감사드립니다. 코드를 개선했습니다.
카오스 매너

2

자바 + * 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"입니다. 보시다시피, 이것은 Runtime.getRuntime().exec()( 더 이상 사용 되지 않는) 사용 BufferedReader하고 Java API 디자이너가 편의를 위해 과부하를 추가하지 않으려는 명백한 결과로 길고 복잡한 호출을 통해 생성하는 것보다 훨씬 짧습니다 .


나는 ProcessBuilderWindows에서 작동하기를 원하지만 mode명령은 4 줄 이상을 출력합니다 :(
F. George

1

빨강 , 19 바이트

system/console/size

산출:

>> system/console/size
== 106x26

이전 질문 에서와 같이 화면 해상도를 얻을 수도 있습니다


1

코모도어 64 베이직, 7 바이트

?"40x25

C64에는 40 x 25 자의 고정 크기 텍스트 콘솔이 있습니다. 콘솔 크기를 쿼리 할 필요는 없습니다. 콘솔을 쿼리 할 방법이 없기 때문에 좋습니다.


이것은 불공평하지만, 그 질문 (또는 그 영감도)이 구체적으로 금지하지 않는 것처럼 보입니다.
코디 그레이


1

코 틀린 + Jline 2 , 58 바이트

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

왜 안돼? 표준 lib는 실제로 콘솔 크기를 결정할 수있는 방법이 없으므로 다른 프로세스를 시작하고 입력 스트림을 파싱하지 않으려면 라이브러리를 가져와야합니다. 누군가 그렇게하면 부끄러운 일입니다.


한 게시물에 두 가지 답변을 넣지 마십시오.
Adám

@ Adám 나중에 생각하는 것이 많으므로 괜찮습니다. 직접 편집 할 수있는 충분한 담당자가 있습니다. 임의의 제한이있는 270b가 별도의 대답이어야한다고 생각하면 그렇게하십시오.
F. George

각 제출물은 동일한 언어로 다른 제출물과 경쟁합니다. Java는 본질적으로 장황하지만, 가장 짧은 (그리고 유일한) Java 제출입니다. 또한 게시물을 수정할 수는 있지만 귀하의 이름으로 별도의 답변을 게시 할 수는 없습니다.
Adám

Java 답변을 제거하면 직접 다시 게시 할 것입니다. 그리고 답변이 현재 가장 짧은 Java 답변이라는 점을 알고 있지만 외부 라이브러리를 사용하지 않는 것으로 제한됩니다. 귀하의 주장을 해결하기 위해, 나는 논쟁이 아닌 것으로 표시하고 나중에 적절한 Java 응답을 코딩합니다.
F. George

Java (라이브러리 없음) 로 게시하고 …으로 Java 라는 또 다른 제출을하십시오 . 그것은 당신에게 3 가지 공감대를 얻을 것입니다.
Adám

1

스택 형 , 7 바이트

termdim

기본적으로 허용되는대로 출력을 스택에 남겨 둡니다. 사용법 예 :

λ stacked -pe "termdim"
(117 26)

보너스 : termdim'x'#`가지고 있습니다 117x26.


1

C (리눅스, 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 열 x 58 열입니다.

od대신에 @ Random832을 사용해 주셔서 감사합니다 hexdump.


1
16 진수가 추진하고 있다고 생각합니다. 다른 모든 답변은 십진수를 사용 하므로이 요구 사항을 OP에 추가 할 것입니다. 죄송합니다.
Adám

1
od -s는 십진수로 할 것이고 hexdump보다 짧습니다
Random832

@ Random832 Cool, 몰랐어요, +1! 그러나이 답변은 규칙이 "모든 형식"에서 매우 특정한 형식 (주류 터미널 에뮬레이터에서 ascii의 기본 10)으로 변경되었을 때 무효화되었습니다.
mvds
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.