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))).

Adám
źródło
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
mvds
źródło
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  |[email protected]|
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
użytkownik5434231
źródło
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
człowiek w pracy
źródło
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;
Pandya
źródło
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

dieter
źródło
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!

Felipe Nardi Batista
źródło
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]);}
dieter
źródło
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

APL (Dyalog) , 3 bajty

(Już opublikowanie odpowiedzi, ponieważ to naprawdę nie jest moje wyzwanie).

⎕SDS creen D imensions

Przykładowy przebieg:

      ⎕SD
25 79
Adám
źródło
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.

TheLethalCoder
źródło
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.

Pete TNT
źródło
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]
Kreator pszenicy
źródło
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!

zepelin
źródło
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);}}
Caius Jard
źródło
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
colsw
źródło
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 .

Caleb Kleveter
źródło
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"
Inżynier Toast
źródło
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

MetaColon
źródło
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]);
    }
}
F. George
źródło
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
Dwór Chaosu
źródło
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.

Brian McCutchon
źródło
Ż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

Naukowy ja
źródło
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.

znak
źródło
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ł ...

F. George
źródło
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.

Conor O'Brien
źródło
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.

mvds
źródło
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