Powiedz mi, jakie są wymiary mojej konsoli!


41

Wyjściowe wymiary terminali (kolumny i wiersze) w dowolnym dwucyfrowym formacie dziesiętnym *. Na przykład wyjście może być 80x25.


Inspiracja . Szybka .
* Dane wyjściowe muszą mieć obie miary w jednym lub dwóch kolejnych wierszach, i może nie być więcej niż jedna linia wyjściowa i / lub końcowa (opcjonalnie po niej nowa linia). (Maksymalnie cztery) wiersze nie mogą być dłuższe niż max (cols, 1 + len (str (cols)) + len (str (ro‌ ws))).


2
Nigdy nie widziałem krótszego uprzywilejowanego wyzwania. Gratulacje!
Pan Xcoder

13
@ Mr.Xcoder Specjalizuję się w jedno-liniowych…
Adám

Zaraz zdobędziesz stopień naukowy w postach z jedną podszewką! Jesteś naprawdę dobry, nie, bardzo dobry w tym
:)

co dokładnie oznacza „spójny format”?
Felipe Nardi Batista

1
@FelipeNardiBatista Na razie powiem tak, ale cofnij się, jeśli doprowadzi to do absurdów.
Adám

Odpowiedzi:


27

* sh, 9

stty size

Wynik:

97 364

Działa również w bash.
numbermaniac

2
Lub dowolną inną powłokę w systemie podobnym do posix.
mvds

1
Biorąc pod uwagę nazwy niektórych języków widocznych na tej stronie, odkrycie, że * sh tutaj odnosi się do „bash, zsh, csh, dash itp.”, Zajmuje więcej czasu. zamiast języka, którego nazwa składa się z gwiazdki, po której następują litery si h :-)
ShreevatsaR

Technicznie nie potrzebujesz nawet powłoki, aby uruchomić program. Tak więc shoznaczenie tak naprawdę nie ma sensu.
mvds

20

Kod maszynowy 8086, 11 bajtów (jako funkcja, niekonkurujący)

Nie bardzo konkuruje, ponieważ nie ma widocznych wyników. To tylko pokazuje najkrótszą drogę do znalezienia aktualnych wymiarów ekranu, bez kodu płyty grzewczej wymaganego do drukowania.

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

Jak to działa:

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

Kod maszynowy 8086, 48 bajtów (jako kompletny program)

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

Jak to działa:

                |   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

Jestem prawie pewien, że przesłanie funkcji wymagałoby ret? Nie jestem też pewien, czy wolno ci się ślinić ds. Może to wymagać przeniesienia do Meta, ponieważ funkcja działa więcej niż jeden raz, po prostu ma niepożądane skutki uboczne.

Dlaczego „stos zawsze zawiera 0 przy wejściu”? Nie znam żadnej reguły zerowania stosu. Myślę, że mówisz o podaniu wartości zwracanej i myślisz, że będzie to 0? Czy to jest gwarantowane dla pliku binarnego COM?
Cody Gray

@CodyGray: w programie COM stos początkowo zawiera wskaźnik prawie do początku PSP (przesunięcie 0), więc RET wróci do PSP: 0, który zawiera wywołanie EXIT. stackoverflow.com/a/12593311/371250
ninjalj

Ach, dziękuję za wyjaśnienie, @ninjalj. (Świetna odpowiedź, którą połączyłeś, BTW. Zapomniałem praktycznie wszystkich szczegółów na temat PSP, pomimo wielu lat temu inżynierii wstecznej.) Ale jeśli zdejmiesz ten wskaźnik ze stosu, nie odsuwając go, nie rób tego złamałeś RETinstrukcję na końcu funkcji?
Cody Gray,

@CodyGray: zauważysz, że program wychodzi przez INT 20h, a nie przez RET, dokładnie dlatego, że po POPing wyjście przez RETnie działa.
ninjalj

18

Bash, 22 20 znaków

echo $COLUMNS $LINES

Dzięki:

  • Klamka dla optymalnego formatu wyjściowego (2 znaki)

Przykładowy przebieg:

bash-4.3$ echo $COLUMNS $LINES
80 24

Z jeszcze 1 bajtem, echo $COLUMNS\x$LINESmoże o / p80x24
Pandya

@ Pandya Prawda, ale nie jest to konieczne.
Adám

7
Nie jestem pewien, czy jest to zgodne z nowymi wymaganiami formatu wyjściowego, ale możesz po prostu mieć $ COLUMNS \ x $ LINES do wypisania „bash: 90x50: polecenie nie znaleziono”. Załóżmy, że to nie działa z lokalizacją lub jeśli to polecenie faktycznie istnieje!
Muzer

14

xterm, 6 bajtów

Ponieważ nie potrzebujesz określonego mrówczanu, możesz po prostu użyć polecenia resize(6 znaków) z xterm:

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

1
Miły. Ale możesz chcieć napisać standardowy nagłówek, na przykład #xterm, 6 bytes.
Adám

@ Adám Czy tego rodzaju wyniki są dopuszczalne zgodnie z pytaniem?
Pandya


@ Adám ok. Właśnie dodałem nagłówek :)
Pandya

To nie jest specyficzne dla Xterm. Zauważ też, że wynik zależy od twojej powłoki.
celtschk

13

sh, 20 bajtów

tput lines;tput cols

.. Może zbyt oczywiste


3
tput cols; !: 0 kols zapisuje jeden bajt w bash
marcosm

@ marcos masz na myśli tput lines;!:0 cols, prawda?
dieter

12

Python 3 , 30 bajtów

import os
os.get_terminal_size

Ponieważ nie działa w TIO, stosowana jest tam alternatywa:

Wypróbuj online!


1
Dlaczego nie tylko os?
Jonathan Allan

2
... ze względu na system operacyjny nie będzie działać na TIO, więc musisz to określić. To czyni pracę w systemie Windows. Również import osi os.jest krótszy niż from....
Jonathan Allan

Mogę potwierdzić, że działa w
systemie

Działa również na
Macu

1
Technicznie Python 3.3+
matsjoyce

11

C (tylko Linux), 63 61

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

4
Możesz wygrać dwa bajty, zastępując m[0]przez *m.
YSC

Możesz zapisać jeden bajt, margumentując argument main:main(short m){ioctl(0,21523,&m);printf("%dx%d",m,(&m)[1]);}
mvds

main(int m){ioctl(0,21523,&m);printf("%x",m);}byłoby 46 bajtów, z rozmiarami wydrukowanymi w podstawie 16 i bez separatora (innego niż możliwe zera wiodące) między kolumnami i wierszami.
mvds


8

C #, 59 bajtów

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

Kompiluje się Func<int, stringjednak, ale dane wejściowe nie są używane.


Nie działa; Zauważyłem, że zwraca rozmiar, jaki miałaby konsola, gdyby wywołano AllocConsole (), a nie rozmiar, do którego są faktycznie podłączone standardowe wejścia i wyjścia konsoli. Pytanie tutaj: stackoverflow.com/questions/35688348/... To, co powstrzymywałem podczas zadawania pytania, to to, że faktycznie działałem w środowisku Windows ze stdin i stdout podłączonymi do potoku ssh. Implementacja ssh dla win32 nie zapewnia koniecznego.
Jozuego

7

NodeJS, 50 48 46 bajtów

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

Wykorzystuje process.stdouts columnsi rowswartości.


Dzięki @ETHproductions, dodano console.log do wyjścia na konsolę :)
Pete TNT

Nie ma problemu :-) Dane wyjściowe mogą być w dowolnym spójnym formacie, więc myślę, że możesz zaoszczędzić kilka bajtów console.log([s.columns,s.rows]).
ETHprodukcje

5
1 bajt off:with(process.stdout)console.log(columns,rows)
Brian McCutchon

1
I jeszcze kilka bajtów off (jeśli ten liczy) with(process.stdout)write(columns+[rows]). Lub, jeśli to się nie liczy:with(process.stdout)write(columns+' '+rows)
markasoftware

1
@ Markasoftware Ooh, to sprytne. Nie sądzę jednak, żeby pierwszy się liczył.
Brian McCutchon

6

Rubin, 41 36 21 + 13 = 34 bajty

Uruchom z flagą wiersza poleceń -rio/console

p IO.console.winsize

To mój pierwszy golf Ruby, więc powiedz mi, czy mogę coś zrobić lepiej.

5 bajtów zaoszczędzonych dzięki SztupY

2 bajty zapisane dzięki manatwork


Wyjściowa wysokość, a następnie szerokość jako lista długości dwóch.

Przykładowe dane wyjściowe:

[25, 80]

potencjalnie możesz przenieść wymagania do parametru wiersza polecenia -r, który ma tylko 2 dodatkowe bajty
SztupY

Nie ma potrzeby stosowania pojedynczych cudzysłowów io/console, żadna powłoka nie wykona na niej niepożądanego rozszerzenia, jeśli pozostanie bez cudzysłowu.
manatwork

6

GNU Forth, 7 bajtów

form .s

form - urows ucols gforth „form”

Liczba linii i kolumn w terminalu.

Przykładowe dane wyjściowe

<2> 24 80

Wypróbuj online!


4

C # 94 bajtów (cała aplikacja)

Całą odpowiedź aplikacji MetaColon można znacznie skrócić:

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

4

Tryb PowerShell +, 11 bajtów?

Dane wyjściowe mogą być nie do zaakceptowania w obecnej formie.

modePolecenie to narzędzie domyślne okna

Meta Post dotyczący korzystania modebez podawaniacon

(mode)[3,4]

pobiera wyjście z trybu:

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

następnie wyjście z czwartej i piątej linii ( [3,4]):

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

Zaoszczędź dwa bajty:(mode)[3,4]-replace"\D"
Adám

aby to zadziałało, muszę użyć(mode con)[3..4]
Felipe Nardi Batista

Ah @FelipeNardiBatista prawdopodobnie ma rację, że potrzebujesz con.
Adám

1
@FelipeNardiBatista jest conkonieczne? dostaje to pierwsze wiersze absolutnie i wierzę, że conzawsze jest pierwszy? powiedziałbym, że standardsystem będzie miał tylko jedno wyjście dla trybu, co powinniśmy założyć?
colsw

1
@ConnorLSW Po prostu mój system działa dobrze, ale twoja odpowiedź po prostu tu nie działa
Felipe Nardi Batista

4

Szybki, 99 bajtów

import Foundation;var w=winsize();ioctl(STDOUT_FILENO,UInt(TIOCGWINSZ),&w);print(w.ws_col,w.ws_row)

Dziękujemy chłopakom z Vapor za pakiet konsoli .


3

Partia, 25 19 18 17 bajtów

Zapisano 6 bajtów, przesyłając bezpośrednio do polecenia „znajdź”.
Zaoszczędzono 1 bajt dzięki Adám / OP .
Zapisano 1 bajt dzięki komentarzowi OP .

mode con|find "n"

To powoduje wypisanie samego polecenia, ponieważ echo jest włączone, ale, jak skomentował OP , linia wiodąca jest OK.


W zależności od konfiguracji może działać tylko z 13 bajtami. Wydaje się jednak, że posiadanie czegokolwiek przy użyciu portów COM spowoduje nadmiernie szczegółowe wyjście.

mode|find "n"

Zapisz bajt s:n.
Adám

1
@FelipeNardiBatista Tak, a moja mówi, że mam 9001 linii. To tylko ustawienie: Właściwości> Układ> Rozmiar bufora ekranu.
Adám

@FelipeNardiBatista Wymiary konsoli Windows nie są takie same jak wymiary okna. Właśnie dlatego paski przewijania pojawiają się, gdy okno jest mniejsze. W przypadku OP to dokładne rozwiązanie jest OK.
Inżynier Toast

@ Adám Dangit, szukałem krótszego ciągu i nie wiem, jak go przeoczyłem. Prawdopodobnie dlatego, że zacząłem od, modeale odkryłem, że dodanie `con` było krótsze niż szukanie dwóch różnych zestawów znaków findstr.
Inżynier Toast

@ Adám Czy na podstawie Twojego komentarza byłoby to prawidłowe @mode|find "L" /i:? Zwraca linie, kolumny i opóźnienie klawiatury z 17 bajtami zamiast 18 powyżej. Czy te linie wiodące / końcowe muszą być puste?
Inżynier Toast

3

C #, 85 bajtów

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

Jeśli chcesz cały kod aplikacji, mielibyśmy 115 101 94 bajtów :

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

Jednak można oznaczać bufora rozmiar jak dobrze, że mamy 85 bajtów ponownie

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

Lub jako cały kod aplikacji (oczywiście ponownie 115 101 94 bajtów ):

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

Za pomocą Caiusa Jarda zapisano 14 bajtów w całym kodzie aplikacji


1
104 bajty cała aplikacja, być może możesz rozszerzyć logikę na inne warianty:using c=System.Console;class P{static void Main(){c.WriteLine(c.WindowWidth);c.Write(c.WindowHeight);}}
Caius Jard

(Nie jestem pewien, jak grać w golfa, jeśli mam krótszą odpowiedź; czy mogę edytować twoje, komentować twoje, czy publikować własne?)
Caius Jard

@CaiusJard Możesz opublikować własną odpowiedź lub skomentować poprawkę i pozwolić, aby odpowiadający zdecydował, czy chce ją uwzględnić, czy nie.
TheLethalCoder

Chciałem, po prostu nie mogłem edytować mojego komentarza na czas ... Wysłałem własną odpowiedź (która ją zawierała) praktycznie jednocześnie, więc uważam, że nie niszczyłem twojej inspiracji :). Nie jestem pewien, czy czuję, że oszustwo polega na pisaniu funkcji, która zwraca odpowiedź, a nie całej aplikacji - wszystkie pozostałe odpowiedzi są prawie całą aplikacją, ale potem CSharppPad.com zaakceptuje twoją wersję „wyłącznej funkcji” i uruchomcie go ... chyba powinien sprawdzić zasady gry w golfa
Caius Jard

@CaiusJard Funkcje / metody są dozwolone niejawnie, chyba że jest to wyraźnie zabronione w samym wyzwaniu. Dlatego anonimowa funkcja jest w porządku, zobacz moją odpowiedź na wersję, która działa dobrze.
TheLethalCoder

2

Java 8 (bez bibliotek), Windows, 270 bajtów

Publikowanie osobno według rekomendacji Adama.

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

Nie golfowany:

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

Spróbuj cmd/c modezamiast cmd /c mode.
Conor O'Brien

Właśnie wypróbowane, Runtime.exec () interpretuje to jako próbę wykonania cmd/cskutkującą CreateProcess error=2. :(
F. George

2

8 , 24 16 12 bajtów

Poprawiono po komentarzu Andersa Tornblada.

con:size? .s

Zwraca bieżący rozmiar konsoli w wierszach i kolumnach drukujących zawartość stosu.

Wynik:

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

2
Ponieważ pytanie dopuszcza dowolny format wyjściowy, czy naprawdę potrzebujesz swap?
Anders Tornblad

@Anders Tornblad - Dziękujemy za mądry komentarz. Poprawiłem swój kod.
Chaos Manor

2

Java + * nix, 113

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

Nie golfowany:

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

ProcessBuilder.inheritIOpowoduje dziedziczenie wejścia / wyjścia procesu potomnego; jest to ustawienie domyślne w C z exec. W Javie wartością domyślną jest „potokowy”. Jak widać, jest to o wiele krótsze niż używanie Runtime.getRuntime().exec()(co jest również przestarzałe) i konstruowanie BufferedReaderdługiego i skomplikowanego wywołania, które jest wynikiem wyraźnej niechęci projektantów Java API do dodawania przeciążenia dla wygody.


Życzę ProcessBuilderbędzie działać w systemie Windows, ale modewyjścia polecenia więcej niż 4 linie :(
F. George

1

Czerwone , 19 bajty

system/console/size

Wynik:

>> system/console/size
== 106x26

Można również uzyskać rozdzielczość ekranu, jak w poprzednim pytaniu


1

Commodore 64 BASIC, 7 bajtów

?"40x25

C64 ma stałą konsolę tekstową o wymiarach 40 x 25 znaków. Zapytanie o rozmiar konsoli nie jest konieczne, co jest dobre, ponieważ nie ma możliwości sprawdzenia go.


Wydaje się, że to oszustwo, choć szczerze mówiąc, pytanie (ani jego inspiracja) nie zabrania tego.
Cody Gray,


1

Kotlin + Jline 2 , 58 bajtów

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

Bo czemu nie. Okazuje się, że standardowa biblioteka nie ma sposobu na określenie wielkości konsoli, więc wymagane jest wciągnięcie biblioteki, aby nie chcieć złotego uruchamiania innego procesu i analizowania strumienia wejściowego ... byłoby wstydem, gdyby ktoś to zrobił ...


Nie umieszczaj dwóch odpowiedzi w jednym poście.
Adám

@ Adám To bardziej refleksja, więc myślę, że jest w porządku. Masz wystarczającą liczbę przedstawicieli, aby edytować go bezpośrednio, zrób to, jeśli naprawdę uważasz, że 270b z arbitralnymi ograniczeniami powinien być osobną odpowiedzią.
F. George

Każde zgłoszenie konkuruje z innymi zgłoszeniami w tym samym języku. Java jest z natury gadatliwa, ale twoje jest najkrótszym (i jedynym) przesłaniem Java. Ponadto, mimo że mogę edytować Twój post, nie mogę opublikować osobnej odpowiedzi w Twoim imieniu.
Adám

Sugerowałem, że jeśli usuniesz moją odpowiedź Java, sam ją ponownie opublikuję. I chociaż masz rację, że odpowiedź jest obecnie najkrótszą odpowiedzią Java, jest ona kodowana pod warunkiem, że nie używa zewnętrznych bibliotek. Aby odpowiedzieć na twój argument, oznaczę go jako niekonkurujący i koduję poprawną odpowiedź Java później.
F. George

Zakładać go jako Java (bez bibliotek) i dokonać innego przedstawienie o nazwie Java z ... . Otrzymasz ode mnie trzy głosy poparcia.
Adám

1

Ułożone , 7 bajtów

termdim

Pozostawia dane wyjściowe na stosie, co jest dozwolone domyślnie. Przykładowe użycie:

λ stacked -pe "termdim"
(117 26)

Bonus: termdim'x'#`mieć 117x26.


1

C (linux, tylko C89), 45 41

inspirowane https://codegolf.stackexchange.com/a/118696/42186 przez @dieter

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

daje to rozmiar jako dane binarne. Nie jestem pewien, czy liczy się to jako „dowolny format”. Potrzebujesz czegoś dodatkowego (mniej, zrzut heksadecymalny, od, tabela ascii) (lub ezoterycznego emulatora terminala, który automatycznie robi to za Ciebie), aby był czytelny dla człowieka. Przykładowe użycie:

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

Rozmiar terminala wynosi 204 kolumny na 58 wierszy.

Dzięki @ Random832 za korzystanie odzamiast hexdump.


1
Myślę, że hex to popycha. Wszystkie pozostałe odpowiedzi używają dziesiętnych, więc dodam ten wymóg do OP. Przepraszam.
Adám

1
od -s zrobi to w systemie dziesiętnym i jest krótszy niż
zrzut heksowy

@ Random832 Cool, nie wiedziałem o tym, +1! Ale ta odpowiedź i tak stała się nieprawidłowa, kiedy reguły zmieniły się z „dowolnego formatu” na bardzo konkretny format (coś w rodzaju: base 10 in ascii w głównych emulatorach terminali)
mvds
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.