Скажіть мені мої розміри консолі!


41

Розміри вихідного терміналу (стовпці та рядки) у будь-якому десятковому форматі *. Наприклад, вихід може бути 80x25.


Натхнення . Підкажіть .
* Вихідні дані повинні мати обидва заходи в одній або двох послідовних лініях, і не може бути більше однієї провідної та / або кінцевої лінії виводу (необов'язково супроводжується новим рядком). (До чотирьох) рядків має бути не більше max (cols, 1 + len (str (cols)) + + len (str (ro‌ ws))).


2
Я ніколи не бачив коротших схвальних викликів. Вітаю!
Містер Xcoder

13
@ Mr.Xcoder Я спеціалізувався на
одностроях

Ви збираєтесь отримати ступінь в однокладових посадах! Ви справді добрі, ні, дуже хороші в цьому:)) ...
Містер Xcoder

що саме означає "узгоджений формат"?
Феліпе Нарді Батіста

1
@FelipeNardiBatista Я зараз скажу так, але поверніться, якщо це призведе до абсурдів.
Адам

Відповіді:


27

* ш, 9

stty size

Вихід:

97 364

Також працює в bash.
numbermaniac

2
Або будь-яка інша оболонка в системі, що нагадує позикс.
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? Крім того, я не впевнений, що вам дозволено клопотати ds. Це може знадобитися для Meta, оскільки функція працює не один раз, вона просто має небажані побічні ефекти.

Чому "стек завжди містить 0 при вході"? Я не знаю жодного правила, що стек стає нульовим. Я думаю, ти говориш про те, що буде повернуто значення і думаєш, що це буде 0? Чи гарантовано це для бінарного COM?
Коді Грей

@CodyGray: у програмі COM стек спочатку містить близький покажчик на початок PSP (зміщення 0), тому RET відскакує назад до PSP: 0, який містить виклик EXIT. stackoverflow.com/a/12593311/371250
ninjalj

Ах, дякую за уточнення, @ninjalj. (Чудова відповідь, яку ви зв'язали, BTW. Я забув практично всі подробиці про PSP, незважаючи на те, що багато років тому розробив реверсивну її реалізацію.) Але якщо ви вискочите цей покажчик зі стека, не відштовхуючи його назад, не робіть цього ви порушите RETінструкцію в кінці функції?
Коді Грей

@CodyGray: ви зауважите, що програма виходить через INT 20h, а не через RET, саме тому, що після POPing вихід із програми RETвже не працює.
ніндзя

18

Баш, 22 20 символів

echo $COLUMNS $LINES

Завдяки:

Проба зразка:

bash-4.3$ echo $COLUMNS $LINES
80 24

Маючи ще 1 байт, echo $COLUMNS\x$LINESможе о / р80x24
Пандія

@Pandya Щоправда, але не потрібно.
Адам

7
Не впевнений, чи відповідає це новим вимогам формат виводу, але ви можете просто мати $ COLUMNS \ x $ LINES для виведення "bash: 90x50: команда не знайдена". Припустимо, це не працює з локалізацією, або якщо ця команда існує насправді !.
Мюзер

14

xterm, 6 байт

Оскільки вам не потрібен конкретний формат, ви можете просто скористатися командою resize(6 символів) xterm:

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

1
Приємно. Але ви можете написати стандартний заголовок, наприклад #xterm, 6 bytes.
Адам

@ Adám Чи прийнятний цей тип висновку відповідно до питання?
Пандія


@ Adám нормально. Щойно доданий заголовок :)
Pandya

Це не xterm. Зауважте також, що вихід залежить від вашої оболонки.
Celtschk

13

ш, 20 байт

tput lines;tput cols

.. Занадто очевидно, можливо ..


3
tput cols; !: 0 cols рятує один байт у bash
marcosm

@marcos ти маєш на увазі tput lines;!:0 cols, правда?
дітер

12

Python 3 , 30 байт

import os
os.get_terminal_size

Оскільки це не працює в TIO, там використовується альтернатива:

Спробуйте в Інтернеті!


1
Чому б не просто os?
Джонатан Аллан

2
... це не буде працювати на TIO, завдяки операційній системі, тому потрібно вказати. Це робить роботу на Windows. Також import osі os.коротше, ніж from....
Джонатан Аллан

Я можу підтвердити, що він працює у Вікні 10 без будь-яких змін
Феррібіг

Працює і над 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.
ВАТ

Ви можете зберегти один байт, зробивши mаргумент 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);}буде 46 байт, розміри друкуються в базі 16 і не мають роздільника (крім можливих провідних нулів) між значками та рядками.
mvds


8

C #, 59 байт

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

Компілюється в a 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.stdouts columnsта rowsзначення.


Дякуємо @ETHproductions, додав console.log до виводу на консоль :)
Pete TNT

Немає проблем :-) Вихід може бути в будь-якому послідовному форматі, тому, я думаю, ви можете зберегти пару байтів, виконавши це console.log([s.columns,s.rows]).
ETHproductions

5
1 байт відключений:with(process.stdout)console.log(columns,rows)
Брайан МакКучон

1
І ще кілька байтів від (якщо це вважається) with(process.stdout)write(columns+[rows]). Або, якщо він не враховує:with(process.stdout)write(columns+' '+rows)
markasoftware

1
@Markasoftware О, це розумно. Я не думаю, що першим слід вважати.
Брайан Маккотчон

6

Рубі, 41 36 21 + 13 = 34 байти

Виконати з прапором командного рядка -rio/console

p IO.console.winsize

Це мій перший гольф Рубі, тому скажіть мені, чи є щось, що я можу зробити краще.

5 байт збережено завдяки SztupY

2 байти збережено завдяки маневреній роботі


Це виводить висоту та ширину у вигляді списку довжини два.

Приклад виводу:

[25, 80]

ви можете потенційно перемістити
вимоги в

Немає необхідності в одинарних лапках io/console, жодна оболонка не буде виконувати небажане розширення на ній, якщо не залишиться без котирування.
манастирство


4

C # 94 байт (цілий додаток)

Відповідь на всю програму MetaColon можна досить скоротити:

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

4

PowerShell + режим, 11 байт?

Вихід може бути неприйнятним у поточній формі.

modeкоманда утиліта вікна по замовчуванням

Meta Post щодо використання 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]виводить 4-й та 5-й рядки ( ):

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

Збережіть два байти:(mode)[3,4]-replace"\D"
Адам

щоб це працювало тут, мені потрібно скористатися(mode con)[3..4]
Феліпе Нарді Батіста

Ах @FelipeNardiBatista, напевно, вірно, що вам потрібен кон.
Адам

1
@FelipeNardiBatista потрібен con? це отримує перші рядки абсолютно, і я вважаю, conце завжди перше? Я б сказав, що standardсистема також матиме лише один вихід для режиму, що ми повинні вважати?
colsw

1
@ConnorLSW Це просто те, що моя система працює нормально, але ваша відповідь тут просто не працює
Феліпе Нарді Батіста


3

Пакетна, 25 19 18 17 байт

Збережено 6 байтів, перейшовши безпосередньо в команду "знайти".
Збережено 1 байт завдяки Adám / OP .
Збережено 1 байт завдяки коментарю OP .

mode con|find "n"

Це виводить саму команду, оскільки відлунне ввімкнено, але, як коментує ОП , провідний рядок у порядку.


Залежно від налаштування, він може працювати лише з 13 байтами. Однак, здається, що наявність чого-небудь, що використовує порти COM, спричинить надмірно багатослівний вихід.

mode|find "n"

Зберегти байт s:n.
Адам

1
@FelipeNardiBatista Так, і мій говорить, що у мене є 9001 рядок. Це лише налаштування: Властивості> Макет> Розмір буфера екрана.
Адам

@FelipeNardiBatista Розміри консолі Windows не збігаються з розмірами вікна. Ось чому смуги прокрутки з’являються, коли ви зробите вікно меншим. За ОП це точно рішення.
Інженер Тост

@ Adám Dangit, я шукав коротшу струну і не знаю, як я її не помітив. Це, мабуть, тому, що я почав із просто, modeале виявив, що додавання `con` було коротше, ніж пошук двох різних наборів символів findstr.
Інженер Тост

@ Adám На основі Вашого коментаря , чи дійсно це @mode|find "L" /i:? Він повертає рядки, стовпці та затримку клавіатури з 17 байтами замість 18 вище. Чи повинні ті провідні / кінцеві лінії бути порожніми?
Інженер Тост

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

Однак ви могли б означати Buffer розмір , а також, ми повинні були б 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);}

Збережено 14 байт у всьому коді програми за допомогою Caius Jard


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 знову сприйме вашу "єдину функцію" версію і запускайте його .. слід шукати правила гри в гольф, я здогадуюсь
Кайус Джард

@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

Щойно спробував, Runtime.exec () інтерпретує це як намагання виконати в cmd/cрезультаті CreateProcess error=2. :(
Ф. Джордж

2

8 , 24 16 12 байт

Переглянуто після коментаря Андерса Торнблада.

con:size? .s

Повертає поточний розмір консолі у рядах та стовпцях, що друкують вміст стеку.

Вихід:

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

2
Оскільки питання дозволяє отримати будь-який вихідний формат, вам справді потрібен swap?
Андерс Торнблад

@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 рядків :(
Ф. Джордж


1

Commodore 64 BASIC, 7 байт

?"40x25

Текстова консоль C64 має фіксований розмір розміром 40 х 25 символів. Не потрібно запитувати розмір консолі, що є хорошою справою, оскільки немає можливості її запитувати.


Це схоже на обман, хоча це, справедливо кажучи, питання (ані його натхнення) конкретно не забороняє.
Коді Грей


1

Котлін + Jline 2 , 58 байт

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

Бо чому б ні. Виявляється, стандартна вкладка насправді не має можливості визначити розмір консолі, тому потрібно втягнути в бібліотеку, щоб не захотіти золота запустити інший процес і проаналізувати вхідний потік ... було б прикро, якщо хтось зробив це.


Не кладіть дві відповіді в один допис.
Адам

@ Adám Це більше думка, тому я думаю, що це добре. У вас є достатня кількість представників, щоб безпосередньо її відредагувати, зробіть це, якщо ви дійсно вважаєте, що 270b з довільними обмеженнями має бути окремою відповіддю.
Ф. Георгій

Кожне подання конкурує з іншими поданнями на тій же мові. Java по суті є багатослівним, але ваш - найкоротший (і єдиний) подання Java. Крім того, хоча я можу редагувати ваше повідомлення, я не можу опублікувати окрему відповідь на ваше ім’я.
Адам

Я мав на увазі, що якщо ви видалите мою відповідь на Java, я сам її репостую. І хоча у вас є пункт про те, що відповідь на даний момент є найкоротшою відповіддю на Java, вона кодується з обмеженням використання жодних зовнішніх бібліотек. Для того, щоб вирішити ваш аргумент, я позначу його як неконкурентоспроможний і пізніше кодую належну відповідь Java.
Ф. Джордж

Опублікуйте його як Java (немає бібліотек) та зробіть ще одне подання під назвою Java з… . Це отримає від вас три нагороди.
Адам

1

Складено , 7 байт

termdim

Залишає вихід у стеку, як це дозволено за замовчуванням. Приклад використання:

λ stacked -pe "termdim"
(117 26)

Бонус: termdim'x'#`мати його 117x26.


1

C (лише Linux, C89), 45 41

натхненний https://codegolf.stackexchange.com/a/118696/42186 автор @dieter

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

це виводить розмір у вигляді двійкових даних. Не впевнений, чи вважається це "будь-яким форматом". Вам знадобиться щось додаткове (менше, таблиця hexdump, od, ascii) (або езотеричний емулятор терміналу, який автоматично робить це для вас), щоб зробити його читабельним. Приклад використання:

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

Розмір терміналу - 204 cols на 58 рядів.

Дякуємо @ Random832 за використання odзамість hexdump.


1
Я думаю, що Hex підштовхує це. У всіх інших відповідях використовується десяткова, тому я збираюся додати цю вимогу до ОП. Вибачте.
Адам

1
od -s зробить це у десятковій формі та коротше, ніж шістнадцятковий
Random832

@ Random832 Класно, не знав цього, +1! Але ця відповідь все-таки стала недійсною, коли правила змінилися з "будь-якого формату" на дуже специфічний формат (щось на кшталт: база 10 в ascii в емуляторах основного терміналу)
mvds
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.