Скажите мне мои размеры консоли!


41

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


Вдохновение . Подскажите .
* Выходные данные должны иметь оба показателя в одной или двух последовательных строках, и может быть не более одной лидирующей и / или конечной строки выходных данных (необязательно сопровождаемой новой строкой). Строки (до четырех) не должны превышать max (столбцы, 1 + len (строка (столбцы)) + len (строка (строки))).


2
Я никогда не видел более короткий голос против. Congrats!
г-н Xcoder

13
@ Mr.Xcoder Я специализируюсь на однострочниках ...
Adám

Вы собираетесь получить степень в постах с одним выравниванием! Вы действительно хороши, нет, очень хороши в этом
:)

что именно означает «согласованный формат»?
Фелипе Нарди Батиста

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

Ответы:


27

* ш, 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? Кроме того, я не уверен, что тебе позволено бить кулаком ds. Это может потребоваться для Meta, так как функция работает более одного раза, она имеет нежелательные побочные эффекты.

Почему «в стеке всегда содержится 0 при входе»? Я не знаю ни одного правила, что стек обнуляется. Я полагаю, вы говорите о получении возвращаемого значения и думаете, что это будет 0? Это гарантировано для двоичного файла COM?
Коди Грей,

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

Ах, спасибо за разъяснения, @ninjalj. (Отличный ответ, на который вы ссылаетесь, кстати. Я забыл практически все подробности о 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

@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 Является ли этот тип продукции приемлемым в зависимости от вопроса?
Pandya


@ Адам в порядке. Просто добавил заголовок :)
Pandya

Это не зависит от xterm. Обратите внимание, что вывод зависит от вашей оболочки.
celtschk

13

ш, 20 байтов

tput lines;tput cols

.. Слишком очевидно, может быть ..


3
tput cols; !: 0 cols сохраняет один байт в bash
marcosm

@ Маркос, ты имеешь в виду tput lines;!:0 cols, верно?
Дитер

12

Python 3 , 30 байт

import os
os.get_terminal_size

Поскольку это не работает в TIO, там используется альтернатива:

Попробуйте онлайн!


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

2
... он не будет работать на TIO из-за операционной системы, поэтому нужно указать. Это делает работу на Windows. Также import osи os.короче чем from....
Джонатан Аллан

Я могу подтвердить, что он работает на Window 10 без каких-либо изменений
Ferrybig

Работает и на Mac
Mr. 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.
СМУ

Вы можете сохранить один байт, mmain(short m){ioctl(0,21523,&m);printf("%dx%d",m,(&m)[1]);}
указав

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 для вывода на консоль :)
Пит ТНТ

Нет проблем :-) Вывод может быть в любом согласованном формате, поэтому я думаю, что вы можете сэкономить пару байтов, выполнив 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

Это мой первый Ruby Golf, так что скажите мне, что я могу сделать лучше?

5 байтов сэкономлено благодаря SztupY

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команда утилита окна по умолчанию

Meta Post относительно использования 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]
Фелипе Нарди Батиста

Ах @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"

Это выводит саму команду, так как эхо включено, но, как прокомментировал OP , передняя строка в порядке.


В зависимости от вашей настройки, он может работать только с 13 байтами. Тем не менее, кажется, что использование чего-либо с использованием COM-портов приведет к чрезмерно подробному выводу.

mode|find "n"

Сохранить байт s:n.
Адам

1
@FelipeNardiBatista Да, и мой говорит, что у меня есть 9001 линия. Это просто настройка: Свойства> Макет> Размер буфера экрана.
Адам

@FelipeNardiBatista Размеры консоли Windows не совпадают с размерами окна. Вот почему полосы прокрутки появляются, когда вы уменьшаете размер окна. Согласно ОП , это точное решение в порядке.
Инженер Тост

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

@ Адам Основываясь на ваш комментарий , это было бы действительно: @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);}

Однако вы можете также указать размер буфера , у нас снова будет 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 примет вашу версию "единственной функции" и запусти его .. должен посмотреть правила игры в гольф, я думаю
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]);}}

Ungolfed:

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.
Конор О'Брайен,

Только что попробовал, 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?
Андерс Торнблад

@ Андерс Tornblad - Спасибо за ваш мудрый комментарий. Я улучшил свой код.
Поместье Хаоса

2

Java + * nix, 113

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

Ungolfed:

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сквозного длинного и запутанного вызова, который является результатом явного нежелания разработчиков API Java добавить перегрузку для удобства.


Я хотел ProcessBuilderбы работать на Windows, но modeкоманда выводит более 4 строк :(
F. George


1

Commodore 64 BASIC, 7 байтов

?"40x25

C64 имеет текстовую консоль фиксированного размера 40 х 25 символов. Нет необходимости запрашивать размер консоли, что хорошо, так как нет способа запросить ее.


Это похоже на обман, хотя, если быть честным, вопрос (и его вдохновение) специально не запрещает его.
Коди Грей


1

Kotlin + Jline 2 , 58 байт

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

Потому что почему бы и нет. Оказывается, стандартная библиотека на самом деле не имеет возможности определить размер консоли, поэтому необходимо добавить библиотеку, чтобы вы не захотели запустить другой процесс и проанализировать входной поток ... было бы обидно, если бы кто-то сделал это ...


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

@ Adám Это скорее запоздалая мысль, так что я думаю, что все в порядке. У вас достаточно представителя, чтобы редактировать его напрямую, сделайте это, если вы действительно уверены, что 270b с произвольными ограничениями - это отдельный ответ.
Ф. Джордж

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

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

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


1

C (Linux, только C89), 45 41

вдохновлено https://codegolf.stackexchange.com/a/118696/42186 @dieter

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

это выводит размер в виде двоичных данных. Не уверен, считается ли это «любым форматом». Вам понадобится что-то дополнительное (less, hexdump, od, ascii table) (или эзотерический эмулятор терминала, который автоматически сделает это за вас), чтобы сделать его читаемым человеком. Пример использования:

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

Размер терминала составляет 204 столбца на 58 строк.

Спасибо @ Random832 за использование odвместо hexdump.


1
Я думаю, что hex подталкивает его. Все остальные ответы используют десятичную дробь, поэтому я собираюсь добавить это требование в ОП. Сожалею.
Адам

1
od -s будет делать это в десятичном
формате

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