¡Dime las dimensiones de mi consola!

41

Dimensiones del terminal de salida (columnas y filas) en cualquier formato decimal de dos números *. Por ejemplo, una salida podría ser 80x25.


La inspiración . Pronto .
* La salida debe tener ambas medidas en una o dos líneas consecutivas, y no puede haber más de una línea de salida inicial y / o final (opcionalmente seguida de una nueva línea). Las (hasta cuatro) líneas no deben ser más largas que max (cols, 1 + len (str (cols)) + len (str (ro‌ ws))).

Adán
fuente
2
Nunca he visto un desafío votado más corto. Felicidades!
Sr. Xcoder
13
@ Mr.Xcoder Me especializo en frases sencillas ...
Adám
¡Estás a punto de obtener un título en publicaciones de una sola línea! De hecho eres bueno, no, muy bueno en eso
:)
¿Qué significa exactamente "formato coherente"?
Felipe Nardi Batista
1
@FelipeNardiBatista Diré que sí por ahora, pero volveré si esto lleva a lo absurdo.
Adám

Respuestas:

27

* sh, 9

stty size

Salida:

97 364
mvds
fuente
También funciona en bash.
numbermaniac
2
O cualquier otro shell en un sistema tipo posix.
mvds
1
Dados los nombres de algunos idiomas vistos en este sitio, lleva más tiempo darse cuenta de que * sh aquí se refiere a "bash, zsh, csh, dash, etc." en lugar de un idioma cuyo nombre consiste en un asterisco seguido de las letras
syh
Técnicamente, ni siquiera necesita un shell para ejecutar un programa. Entonces, la shdesignación realmente no tiene sentido de todos modos.
mvds
20

Código de máquina 8086, 11 bytes (como función, no competitiva)

Realmente no compite ya que no tiene salida visible. Esto solo muestra la forma más corta de encontrar las dimensiones actuales de la pantalla, sin el código repetitivo requerido para la impresión.

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

Cómo 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 un programa completo)

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

Cómo 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
usuario5434231
fuente
Estoy bastante seguro de que una presentación de función necesitaría un ret? Además, no estoy seguro de que se te permita golpear ds. Es posible que esto deba llevarse a Meta, ya que la función funciona más de una vez, solo tiene efectos secundarios no deseados.
¿Por qué "la pila siempre contiene 0 en la entrada"? No conozco ninguna regla de que la pila se ponga a cero. ¿Supongo que estás hablando de hacer estallar el valor de retorno y pensar que será 0? ¿Está garantizado para un binario COM?
Cody Gray
@CodyGray: en un programa COM, la pila inicialmente contiene un puntero cercano al inicio de la PSP (desplazamiento 0), por lo que RET volverá a PSP: 0, que contiene una llamada para SALIR. stackoverflow.com/a/12593311/371250
ninjalj
Ah, gracias por la aclaración, @ninjalj. (Gran respuesta que vinculó, por cierto. Me había olvidado de casi todos los detalles sobre la PSP, a pesar de haber realizado ingeniería inversa en su implementación hace muchos años). Pero si saca el puntero de la pila sin empujarlo hacia atrás, no lo haga. ¿Rompe la RETinstrucción al final de la función?
Cody Gray
@CodyGray: notará que el programa sale a través de INT 20h, no a través de RET, exactamente porque después de salir de POPing RETya no funciona.
ninjalj
18

Bash, 22 20 caracteres

echo $COLUMNS $LINES

Gracias a:

  • Pomo de la puerta para un formato de salida óptimo (2 caracteres)

Ejecución de muestra:

bash-4.3$ echo $COLUMNS $LINES
80 24
hombre trabajando
fuente
Con solo 1 byte más, echo $COLUMNS\x$LINESpuede o / p80x24
Pandya
@Pandya True, pero no es necesario.
Adám
77
No estoy seguro de si esto cumple con los nuevos requisitos de formato de salida, pero podría tener $ COLUMNS \ x $ LINES para generar "bash: 90x50: comando no encontrado". Supongamos que eso no funciona con la localización o si ese comando realmente existe.
Muzer
14

xterm, 6 bytes

Como no necesita formato específico, simplemente puede usar el resizecomando (6 caracteres) de xterm:

$ resize
COLUMNS=120;
LINES=31;
export COLUMNS LINES;
Pandya
fuente
1
Agradable. Pero es posible que desee escribir un encabezado estándar, como #xterm, 6 bytes.
Adám
@ Adám ¿Es este tipo de salida aceptable según la pregunta?
Pandya
@ Adám ok. Encabezado recién agregado :)
Pandya
Esto no es específico de xterm. Tenga en cuenta también que la salida depende de su shell.
celtschk
13

sh, 20 bytes

tput lines;tput cols

... Demasiado obvio, tal vez ...

dieter
fuente
3
tput cols; !: 0 cols ahorra un byte en bash
marcosm
@marcos quieres decir tput lines;!:0 cols, ¿verdad?
Dieter
12

Python 3 , 30 bytes

import os
os.get_terminal_size

Como no funciona en TIO, allí se usa una alternativa:

Pruébalo en línea!

Felipe Nardi Batista
fuente
1
¿Por qué no solo os?
Jonathan Allan
2
... no funcionará en TIO, debido al sistema operativo, por lo que es necesario especificarlo. Se hace el trabajo en Windows. Además import osy os.es más corto que from....
Jonathan Allan
Puedo confirmar que funciona en Windows 10 sin modificaciones
Ferrybig
Funciona también en mac
Mr. Xcoder
1
Técnicamente Python 3.3+
matsjoyce
11

C (solo Linux), 63 61

short m[4];main(){ioctl(0,21523,m);printf("%dx%d",*m,m[1]);}
dieter
fuente
44
Puede ganar dos bytes reemplazando m[0]por *m.
YSC
Puede guardar un byte haciendo mun argumento de 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);}sería de 46 bytes, con tamaños impresos en la base 16 y sin separador (aparte de los posibles ceros a la izquierda) entre columnas y filas.
mvds
8

C #, 59 bytes

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

Compila a a Func<int, string, sin embargo, la entrada no se utiliza.

TheLethalCoder
fuente
No funciona; Descubrí que esto devuelve el tamaño que tendría la consola si se llamara a AllocConsole (), no el tamaño al que están realmente conectadas las entradas y salidas estándar de la consola. Pregunta aquí: stackoverflow.com/questions/35688348/… Lo que contuve al hacer la pregunta es que realmente estaba corriendo en un entorno Windows con stdin & stdout conectado a una tubería ssh. La implementación de win32 ssh no proporciona lo necesario.
Joshua
7

NodoJS, 50 48 46 bytes

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

Usos process.stdouts columnsy rowsvalores.

Pete TNT
fuente
Gracias @ETHproductions, agregó console.log a la salida a la consola :)
Pete TNT
No hay problema :-) La salida puede estar en cualquier formato consistente, así que creo que puede guardar un par de bytes al hacerlo console.log([s.columns,s.rows]).
ETHproductions
55
1 byte apagado:with(process.stdout)console.log(columns,rows)
Brian McCutchon,
1
Y unos cuantos más bytes fuera (si esto cuenta): with(process.stdout)write(columns+[rows]). O, si no cuenta:with(process.stdout)write(columns+' '+rows)
markasoftware
1
@Markasoftware Ooh, eso es inteligente. Sin embargo, no creo que el primero deba contar.
Brian McCutchon
6

Ruby, 41 36 21 + 13 = 34 bytes

Ejecutar con la bandera de línea de comando -rio/console

p IO.console.winsize

Este es mi primer golf Ruby, así que dime si hay algo que pueda hacer mejor.

5 bytes guardados gracias a SztupY

2 bytes guardados gracias a manatwork


Esto genera la altura y luego el ancho como una lista de longitud dos.

Salida de ejemplo:

[25, 80]
Asistente de trigo
fuente
potencialmente puede mover los requisitos al parámetro de línea de comando -r que solo tiene 2 bytes adicionales
SztupY
Sin necesidad de comillas simples io/console, ningún shell realizará una expansión no deseada si no se cita .
manatwork
6

GNU adelante, 7 bytes

form .s

form - urou ucols gforth "form"

El número de líneas y columnas en la terminal.

Salida de muestra

<2> 24 80

¡Pruébelo en línea!

zepelín
fuente
4

C # 94 bytes (aplicación completa)

La respuesta completa de la aplicación MetaColon se puede acortar bastante:

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

Modo PowerShell +, ¿11 bytes?

La salida puede no ser aceptable en la forma actual.

el modecomando es una utilidad predeterminada de windows

Meta Post sobre el uso de modesin especificarcon

(mode)[3,4]

obtiene la salida del modo:

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

luego las líneas 4 y 5 ( [3,4]) generan:

PS H:\> (mode)[3,4]
    Lines:          3000
    Columns:        120
colsw
fuente
Ahorre dos bytes:(mode)[3,4]-replace"\D"
Adám
para que esto funcione aquí, necesito usar(mode con)[3..4]
Felipe Nardi Batista
Ah, @FelipeNardiBatista probablemente tenga razón en que necesitas estafa.
Adám
1
@FelipeNardiBatista es connecesario? esto obtiene las primeras líneas absolutamente, y creo conque siempre es primero? Yo diría que un standardsistema solo tendrá una salida para el modo, ¿qué es lo que deberíamos asumir?
colsw
1
@ConnorLSW Es solo que mi sistema funciona bien, pero su respuesta simplemente no funciona aquí
Felipe Nardi Batista
4

Swift, 99 bytes

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

Gracias a los chicos de Vapor por su paquete de consola .

Caleb Kleveter
fuente
3

Lote, 25 19 18 17 bytes

Se guardaron 6 bytes canalizando directamente al comando "buscar".
Guardado 1 byte gracias a Adám / OP .
Guardado 1 byte gracias al comentario de OP .

mode con|find "n"

Esto genera el comando en sí ya que echo está activado pero, como comentó OP , una línea inicial está bien.


Dependiendo de su configuración, puede funcionar con solo 13 bytes. Sin embargo, parece que tener algo que use puertos COM provocará una salida demasiado detallada.

mode|find "n"
Tostadas de ingeniero
fuente
Guardar un byte s:n.
Adám
1
@FelipeNardiBatista Sí, y el mío dice que tengo 9001 líneas. Es solo una configuración: Propiedades> Diseño> Tamaño del búfer de pantalla.
Adám
Las dimensiones de la consola de Windows de @FelipeNardiBatista no son las mismas que las dimensiones de la ventana. Es por eso que aparecen barras de desplazamiento cuando hace que la ventana sea más pequeña. Por OP , esta solución exacta está bien.
Engineer Toast
@ Adám Dangit, busqué una cadena más corta y no sé cómo lo pasé por alto. Probablemente sea porque comencé con, modepero descubrí que agregar 'con' era más corto que buscar dos conjuntos de caracteres diferentes findstr.
Engineer Toast
@ Adám Según su comentario , ¿sería válido esto @mode|find "L" /i? Devuelve líneas, columnas y retraso del teclado con 17 bytes en lugar de los 18 anteriores. ¿Es necesario que esas líneas iniciales / finales estén vacías?
Engineer Toast
3

C #, 85 bytes

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

Si desea un código de aplicación completo, tendríamos 115 101 94 Bytes :

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

Sin embargo, también podría indicar el tamaño del búfer , tendríamos 85 bytes nuevamente

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

O como un código de aplicación completo (obviamente 115101 94 Bytes nuevamente):

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

Guardado 14 Bytes en todo el código de la aplicación con la ayuda de Caius Jard

MetaColon
fuente
1
Aplicación completa de 104 bytes, quizás pueda extender la lógica a sus otras variaciones:using c=System.Console;class P{static void Main(){c.WriteLine(c.WindowWidth);c.Write(c.WindowHeight);}}
Caius Jard
(No estoy seguro de cómo jugar al golf si tengo una respuesta más corta; ¿edito la suya, comento la suya o publico la mía?)
Caius Jard
@CaiusJard Puede publicar su propia respuesta o comentar una mejora y dejar que el respondedor decida si desea incorporarla o no.
TheLethalCoder
Quería hacerlo, pero no pude editar mi comentario a tiempo ... Publiqué mi propia respuesta (que lo incluía) virtualmente simultáneamente, así que supongo que no estaba robando tu inspiración :). No estoy muy seguro de si siento que es una trampa estar esencialmente escribiendo una función que devuelve la respuesta, en lugar de una aplicación completa: todas las otras respuestas son prácticamente una aplicación completa, pero CSharppPad.com aceptará su versión de "función única". y ejecutarlo ... debería buscar las reglas sobre el golf, supongo
Caius Jard
@CaiusJard Las funciones / métodos están permitidos implícitamente a menos que se deshabiliten explícitamente en el desafío en sí. Por lo tanto, una función anónima está bien, vea mi respuesta para una versión que funcione bien.
TheLethalCoder
2

Java 8 (sin bibliotecas), Windows, 270 bytes

Publicar por separado por recomendación 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]);}}

Sin golf:

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
fuente
Intenta en cmd/c modelugar de cmd /c mode.
Conor O'Brien
Acabo de intentarlo, Runtime.exec () lo interpreta como un intento de ejecución que cmd/cresulta en CreateProcess error=2. :(
F. George
2

8 , 24 16 12 bytes

Revisado después del comentario de Anders Tornblad.

con:size? .s

Devuelve el tamaño actual de la consola en filas y columnas que imprimen el contenido de la pila.

Salida:

2  n: 000000000285e5e0 1   300
1  n: 000000000285e4c0 1   90
Chaos Manor
fuente
2
Dado que la pregunta permite cualquier formato de salida, ¿realmente lo necesita swap?
Anders Tornblad
@Anders Tornblad - Gracias por tu sabio comentario. Mejoré mi código.
Chaos Manor
2

Java + * nix, 113

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

Sin golf:

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

ProcessBuilder.inheritIOhace que se herede una entrada / salida de proceso hijo; Este es el valor predeterminado en C con exec. En Java, el valor predeterminado es "canalizado". Como puede ver, esto es mucho más corto que usar Runtime.getRuntime().exec()(que también está en desuso) y construir una BufferedReaderllamada a través de una llamada larga y complicada que es el resultado de la aparente falta de voluntad de los diseñadores de API de Java para agregar una sobrecarga por conveniencia.

Brian McCutchon
fuente
Desearía ProcessBuildertrabajar en Windows, pero el modecomando genera más de 4 líneas :(
F. George
1

Rojo , 19 bytes

system/console/size

Salida:

>> system/console/size
== 106x26

También puede obtener la resolución de pantalla como en la pregunta anterior

Geek I
fuente
1

Commodore 64 BASIC, 7 bytes

?"40x25

El C64 tiene una consola de texto de tamaño fijo de 40 x 25 caracteres. No es necesario consultar el tamaño de la consola, lo cual es bueno, ya que no hay forma de consultarlo.

marca
fuente
Esto parece una trampa, aunque para ser justos, la pregunta (ni su inspiración) no lo prohíbe específicamente.
Cody Gray
1

Kotlin + Jline 2 , 58 bytes

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

Porque, porque no. Resulta que la biblioteca estándar en realidad no tiene forma de determinar el tamaño de la consola, por lo que es necesario extraer una biblioteca, para que no quieras iniciar otro proceso y analizar el flujo de entrada ... sería una pena si alguien hiciera eso ...

F. George
fuente
No pongas dos respuestas en una publicación.
Adám
@ Adám Es más una idea de último momento, así que creo que está bien. Tiene suficiente representante para editarlo directamente, hágalo si realmente cree que un 270b con restricciones arbitrarias debería ser una respuesta separada.
F. George
Cada presentación compite contra otras presentaciones en el mismo idioma. Java es inherentemente detallado, pero el tuyo es el envío de Java más corto (y único). Además, aunque puedo editar su publicación, no puedo publicar una respuesta por separado en su nombre.
Adám
Estaba implicando que si eliminas mi respuesta Java, la volveré a publicar yo mismo. Y aunque tiene un punto de que la respuesta es actualmente la respuesta más corta de Java, está codificada bajo la restricción de no usar bibliotecas externas. Para abordar su argumento, lo marcaré como no competitivo y codificaré una respuesta Java adecuada más adelante.
F. George
Post-it como Java (no hay bibliotecas) y realizar otra presentación llamada Java con ... . Eso te dará tres votos a favor de mí.
Adám
1

Apilado , 7 bytes

termdim

Deja la salida en la pila, como se permite por defecto. Ejemplo de uso:

λ stacked -pe "termdim"
(117 26)

Bono: termdim'x'#`tenerlo 117x26.

Conor O'Brien
fuente
1

C (linux, solo C89), 45 41

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

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

esto genera el tamaño como datos binarios. No estoy seguro si esto cuenta como "cualquier formato". Necesitaría algo extra (menos, hexdump, od, ascii table) (o un emulador de terminal esotérico que lo haga automáticamente por usted) para que sea legible para los humanos. Ejemplo de uso:

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

El tamaño del terminal es de 204 cols por 58 filas.

Gracias a @ Random832 por usar en odlugar de hexdump.

mvds
fuente
1
Creo que hex está empujándolo. Todas las demás respuestas usan decimal, así que voy a agregar este requisito a OP. Lo siento.
Adám
1
od -s lo hará en decimal y es más corto que hexdump
Random832
@ Random832 ¡Genial, no lo sabía, +1! Pero esta respuesta se volvió inválida de todos modos, cuando las reglas cambiaron de "cualquier formato" a un formato muy específico (algo así como: base 10 en ascii en emuladores de terminal convencionales)
mvds