Diga-me as dimensões do meu console!


41

Dimensões do terminal de saída (colunas e linhas) em qualquer formato decimal de dois números *. Por exemplo, uma saída poderia ser 80x25.


Inspiração . Prompt .
* A saída deve ter as duas medidas em uma única ou duas linhas consecutivas e pode haver não mais do que uma linha de saída inicial e / ou final (opcionalmente seguida por uma nova linha). As (até quatro) linhas não devem ter mais que max (cols, 1 + len (str (cols)) + len (str (ro‌ ws))).


2
Eu nunca vi um desafio votado mais curto. Parabéns!
Sr. Xcoder

13
@ Mr.Xcoder Especializei-me em one-liners ...
Adám

Você está prestes a se formar em posts únicos! Você é realmente bom, não, muito bom nisso
:)

o que significa 'formato consistente' exatamente?
Felipe Nardi Batista

11
@FelipeNardiBatista Vou dizer que sim por enquanto, mas reverter se isso levar a absurdos.
Adám

Respostas:


27

* sh, 9

stty size

Saída:

97 364

Também funciona no bash.
Numbermaniac #

2
Ou qualquer outro shell em um sistema semelhante ao posix.
Mvds 4/17

11
Dados os nomes de alguns idiomas vistos neste site, leva mais tempo para descobrir que * sh aqui se refere a "bash, zsh, csh, dash, etc." em vez de uma língua cujo nome é composto por um asterisco seguido pelas letras s e h :-)
ShreevatsaR

Tecnicamente, você nem precisa de um shell para executar um programa. Portanto, a shdesignação realmente não faz sentido de qualquer maneira.
Mvds 5/05

20

Código de máquina 8086, 11 bytes (em função, não concorrente)

Não é realmente competitivo, pois não possui saída visível. Isso está apenas mostrando a maneira mais curta de encontrar as dimensões atuais da tela, sem o código padrão necessário para a impressão.

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

Como funciona:

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

Código de máquina 8086, 48 bytes (como um programa completo)

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

Como funciona:

                |   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

Tenho certeza de que um envio de função precisaria de um ret? Além disso, não tenho certeza se você tem permissão para espancar ds. Isso pode precisar ser levado para o Meta, pois a função funciona mais de uma vez, apenas tem efeitos colaterais indesejados.

Por que "a pilha sempre contém 0 na entrada"? Não conheço nenhuma regra de que a pilha seja zerada. Eu acho que você está falando em aumentar o valor de retorno e pensar que será 0? Isso é garantido para um binário COM?
Cody Grey #

@CodyGray: em um programa COM, a pilha contém inicialmente um ponteiro próximo ao início do PSP (deslocamento 0), portanto o RET retornará ao PSP: 0, que contém uma chamada para EXIT. stackoverflow.com/a/12593311/371250
ninjalj

Ah, obrigado pelo esclarecimento, @ninjalj. (Ótima resposta que você vinculou, BTW. Eu tinha esquecido praticamente todos os detalhes sobre o PSP, apesar de ter feito a engenharia reversa de sua implementação há muitos anos.) Mas se você remover esse ponteiro da pilha sem empurrá-la para trás, não você quebra a RETinstrução no final da função?
Cody Grey

@CodyGray: você notará que o programa sai via INT 20h, e não via RET, exatamente porque depois de sair do POPing via RETnão funciona mais.
Ninjalj 6/06

18

Bash, 22 20 caracteres

echo $COLUMNS $LINES

Graças a:

  • Maçaneta para formato de saída ideal (2 caracteres)

Exemplo de execução:

bash-4.3$ echo $COLUMNS $LINES
80 24

Com apenas mais 1 byte, echo $COLUMNS\x$LINESpode o / p80x24
Pandya

@ Pandya True, mas não é necessário.
Adám

7
Não tenho certeza se isso está de acordo com os novos requisitos de formato de saída, mas você pode ter apenas $ COLUMNS \ x $ LINES na saída "bash: 90x50: comando não encontrado". Suponha que isso não funcione com a localização ou se esse comando realmente existe!
Muzer 3/17/17

14

xterm, 6 bytes

Como você não precisa de formato específico, pode simplesmente usar o resizecomando (6 caracteres) de xterm:

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

11
Agradável. Mas você pode escrever um cabeçalho padrão, como #xterm, 6 bytes.
Adám

@ Adám Esse tipo de saída é aceitável de acordo com a pergunta?
Pandya


@ Adám ok. Acabei de adicionar o cabeçalho :)
Pandya

Isso não é específico ao xterm. Observe também que a saída depende do seu shell.
Celtschk

13

sh, 20 bytes

tput lines;tput cols

.. Muito óbvio, talvez ..


3
cols; !: 0 cols salva um byte em bash
marcosm

@ marcos você quer dizer tput lines;!:0 cols, certo?
Dieter3 de

12

Python 3 , 30 bytes

import os
os.get_terminal_size

Como ele não funciona no TIO, uma alternativa é usada lá:

Experimente online!


11
Por que não apenas os?
Jonathan Allan

2
... não funcionará no TIO, devido ao sistema operacional, portanto, é necessário especificar. Ele faz o trabalho no Windows. Também import ose os.é menor que from....
Jonathan Allan

Eu posso confirmar que funciona na Janela 10 sem modificações
Ferrybig

Funciona no mac também
Mr. Xcoder

11
Tecnicamente Python 3.3+
matsjoyce

11

C (somente Linux), 63 61

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

4
Você pode ganhar dois bytes substituindo m[0]por *m.
YSC

Você pode salvar um byte, margumentando como principal:main(short m){ioctl(0,21523,&m);printf("%dx%d",m,(&m)[1]);}
mvds

main(int m){ioctl(0,21523,&m);printf("%x",m);}teria 46 bytes, com tamanhos impressos na base 16 e sem separador (além dos possíveis zeros à esquerda) entre colunas e linhas.
Mvds #


8

C #, 59 bytes

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

Compila para a Func<int, string, no entanto, a entrada não é usada.


Não funciona; Descobri que isso retorna o tamanho que o console teria se AllocConsole () fosse chamado, e não o tamanho ao qual a entrada e a saída padrão do console estão realmente conectadas. Pergunta aqui: stackoverflow.com/questions/35688348/… O que retive ao fazer a pergunta é que eu estava realmente executando em um ambiente Windows com o stdin & stdout conectado a um pipeline ssh. A implementação win32 ssh não fornece o necessário.
Joshua

7

NodeJS, 50 48 46 bytes

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

Usos process.stdouts columnse rowsvalores.


@ETHproductions obrigado, console.log adicionado a saída para o console :)
Pete TNT

Não tem problema :-) A saída pode estar em qualquer formato consistente, então eu acho que você pode salvar alguns bytes fazendo isso console.log([s.columns,s.rows]).
ETHproductions

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

11
E mais alguns bytes off (se isso conta): with(process.stdout)write(columns+[rows]). Ou, se não contar:with(process.stdout)write(columns+' '+rows)
markasoftware

11
@ Markasoftware Ooh, isso é inteligente. Acho que o primeiro não deve contar.
Brian McCutchon

6

Ruby, 41 36 21 + 13 = 34 bytes

Executar com o sinalizador de linha de comando -rio/console

p IO.console.winsize

Este é o meu primeiro golfe Ruby, então me diga se há algo que eu possa fazer melhor.

5 bytes economizados graças ao SztupY

2 bytes economizados graças ao manatwork


Isso gera altura e largura como uma lista de comprimento dois.

Exemplo de saída:

[25, 80]

você pode potencialmente mover o requer para o parâmetro de linha de comando -r que fica a apenas 2 bytes extras
SztupY

Não há necessidade de aspas simples io/console, nenhum shell executará uma expansão indesejada nele se não for indicado.
manatwork

6

GNU adiante, 7 bytes

form .s

form - urows ucols gforth "form"

O número de linhas e colunas no terminal.

Saída de amostra

<2> 24 80

Experimente Online!


4

C # 94 bytes (aplicativo inteiro)

A resposta completa do aplicativo MetaColon pode ser bastante reduzida:

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

4

Modo PowerShell +, 11 bytes?

A saída pode não ser aceitável na forma atual.

o modecomando é um utilitário padrão do Windows

Meta Post sobre o uso de modesem especificarcon

(mode)[3,4]

obtém a saída do modo:

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

então a quarta e a quinta linhas ( [3,4]) produzindo:

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

Salve dois bytes:(mode)[3,4]-replace"\D"
Adám 3/17/17

para este trabalho aqui, eu preciso usar(mode con)[3..4]
Felipe Nardi Batista

Ah, @FelipeNardiBatista provavelmente está certo de que você precisa de um golpe.
Adám

11
@FelipeNardiBatista é connecessário? isso recebe absolutamente as primeiras linhas, e acredito que conseja sempre a primeira? Eu diria que um standardsistema também terá apenas uma saída para o modo, e é isso que devemos assumir?
Colsw

11
@ConnorLSW É que o meu sistema funciona bem, mas a sua resposta simplesmente não funciona aqui
Felipe Nardi Batista

4

Rápido, 99 bytes

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

Obrigado ao pessoal do Vapor pelo pacote do console .


3

Lote, 25 19 18 17 bytes

Economizou 6 bytes canalizando diretamente para o comando "find".
Economizou 1 byte graças a Adám / OP .
Guardado 1 byte graças a um comentário de OP .

mode con|find "n"

Isso gera o próprio comando, já que o eco está ativado, mas, como comentado pelo OP , uma linha inicial está OK.


Dependendo da sua configuração, ele pode funcionar com apenas 13 bytes. No entanto, parece que ter qualquer coisa usando portas COM causará saída excessivamente detalhada.

mode|find "n"

Salve um byte s:n.
Adám 3/17/17

11
@FelipeNardiBatista Sim, e o meu diz que tenho 9001 linhas. É apenas uma configuração: Propriedades> Layout> Tamanho do buffer da tela.
Adám 3/17/17

As dimensões do console do Windows @FelipeNardiBatista não são iguais às dimensões da janela. É por isso que as barras de rolagem aparecem quando você diminui a janela. Por OP , esta solução exata está OK.
Engineer Toast

@ Adám Dangit, procurei uma corda mais curta e não sei como a ignorei. Provavelmente porque eu comecei com apenas modemas descobri que adicionar `con` era mais curto do que procurar por dois conjuntos diferentes de caracteres findstr.
Engineer Toast

@ Adám Com base no seu comentário , isso seria válido @mode|find "L" /i:? Retorna Linhas, Colunas e Atraso do Teclado com 17 bytes em vez dos 18 acima. As linhas iniciais / finais precisam estar vazias?
Engineer Toast

3

C #, 85 bytes

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

Se você deseja um código de aplicativo completo, teríamos 115 101 94 bytes :

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

No entanto, você também pode significar o tamanho do buffer , teríamos 85 bytes novamente

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

Ou como um código de aplicativo completo (obviamente 115 101 94 Bytes novamente):

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

Economizou 14 bytes em todo o código do aplicativo com a ajuda de Caius Jard


11
Aplicativo inteiro de 104 bytes, talvez você possa estender a lógica a suas outras variações:using c=System.Console;class P{static void Main(){c.WriteLine(c.WindowWidth);c.Write(c.WindowHeight);}}
Caius Jard

(Não tenho certeza como o golfe se eu tiver uma resposta mais curto; fazer o seu editar i, comentário seu, ou postar minha própria?)
Caio Jard

@CaiusJard Você pode postar sua própria resposta ou comentar uma melhoria e deixar o respondente decidir se deseja incorporá-la ou não.
TheLethalCoder

Eu queria, mas não consegui editar o meu comentário a tempo ... Publiquei minha própria resposta (que incluía) virtualmente simultaneamente, por isso, acho que não estava cortando sua inspiração :). Não tenho certeza se eu acho que é trapaça essencialmente escrever uma função que retorna a resposta, em vez de um aplicativo inteiro - todas as outras respostas são praticamente um aplicativo inteiro, mas o CSharppPad.com aceita sua versão de "única função" e executá-lo .. deve procurar-se o regime de golfe eu acho
Caio Jard

As funções / métodos do @CaiusJard são permitidos implicitamente, a menos que sejam explicitamente proibidos no desafio. Portanto, uma função anônima é boa; veja minha resposta para uma versão que funciona bem.
TheLethalCoder

2

Java 8 (sem bibliotecas), Windows, 270 bytes

Postagem separada por recomendação de 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]);}}

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

Tente em cmd/c modevez de cmd /c mode.
Conor O'Brien

Apenas tentei, Runtime.exec () interpreta isso como uma tentativa de executar cmd/cresultando em CreateProcess error=2. :(
F. George

2

8 , 24 16 12 bytes

Revisado após o comentário de Anders Tornblad.

con:size? .s

Retorna o tamanho atual do console em linhas e colunas, imprimindo o conteúdo da pilha.

Saída:

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

2
Como a pergunta permite qualquer formato de saída, você realmente precisa swap?
Anders Tornblad

@ Andres Tornblad - Obrigado pelo seu comentário sábio. Eu melhorei meu código.
Chaos Manor

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.inheritIOfaz com que uma entrada / saída do processo filho seja herdada; esse é o padrão em C com exec. Em Java, o padrão é "canalizado". Como você pode ver, isso é muito mais curto do que usar Runtime.getRuntime().exec()(que também é preterido) e construir uma BufferedReaderchamada longa e complicada que é o resultado da aparente falta de vontade dos designers da API Java de adicionar uma sobrecarga por conveniência.


Desejo ProcessBuilderiria funcionar no Windows, mas as modesaídas de comando mais de 4 linhas :(
F. George

1

Vermelho , 19 bytes

system/console/size

Saída:

>> system/console/size
== 106x26

Também pode obter a resolução da tela como na pergunta anterior


1

Commodore 64 BASIC, 7 bytes

?"40x25

O C64 possui um console de texto de tamanho fixo de 40 x 25 caracteres. Não é necessário consultar o tamanho do console, o que é uma coisa boa, pois não há como consultá-lo.


Parece trapaça, apesar de justa, a questão (nem a sua inspiração) não a proíbe especificamente.
Cody Grey #


1

Kotlin + Jline 2 , 58 bytes

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

Porque porque não? Acontece que a lib padrão, na verdade, não tem como determinar o tamanho do console, por isso é necessário puxar uma biblioteca, para que você não queira iniciar outro processo e analisar o fluxo de entrada ... seria uma pena se alguém fizesse isso.


Não coloque duas respostas em um post.
Adám 4/17/17

@ Adám É mais uma reflexão tardia, então eu acho que está bem. Você tem representante suficiente para editá-lo diretamente, faça-o se realmente acredita que um 270b com restrições arbitrárias deve ser uma resposta separada.
F. George

Cada envio concorre com outros envios no mesmo idioma. Java é inerentemente detalhado, mas o seu é o menor (e único) envio de Java. Além disso, embora eu possa editar sua postagem, não posso postar uma resposta separada em seu nome.
Adám 4/17/17

Eu estava implicando que, se você remover minha resposta Java, eu também a republicarei. E embora você tenha um argumento de que a resposta atualmente é a resposta Java mais curta, ela é codificada sob restrição de não usar bibliotecas externas. Para abordar seu argumento, vou marcá-lo como não concorrente e codificar uma resposta Java adequada mais tarde.
F. George

Publique como Java (sem bibliotecas) e faça outro envio chamado Java com… . Isso vai lhe dar três votos positivos.
Adám 4/17/17

1

Empilhados , 7 bytes

termdim

Deixa a saída na pilha, como é permitido por padrão. Exemplo de uso:

λ stacked -pe "termdim"
(117 26)

Bônus: termdim'x'#`tê-lo 117x26.


1

C (linux, somente C89), 45 41

inspirado por https://codegolf.stackexchange.com/a/118696/42186 por @dieter

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

isso gera o tamanho como dados binários. Não tenho certeza se isso conta como "qualquer formato". Você precisaria de algo extra (tabela hexdump, od, ascii) (ou um emulador de terminal esotérico que faça isso automaticamente para você) para torná-lo legível por humanos. Exemplo de uso:

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

O tamanho do terminal é 204 cols por 58 linhas.

Obrigado a @ Random832 por usar em odvez de hexdump.


11
Eu acho que o hex está pressionando. Todas as outras respostas usam decimal, portanto, adicionarei esse requisito ao OP. Desculpe.
Adám 4/17/17

11
od-s irá fazê-lo em decimal e é menor do que hexdump
Random832

@ Random832 Legal, não sabia disso, +1! Mas esta resposta tornou-se de qualquer maneira inválida, quando as regras alterada de "qualquer formato" para um formato muito específico (algo como: base 10 em ascii no ensino regular emuladores de terminais)
MVDS
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.