Dis-moi mes dimensions de console!

41

Indiquez les dimensions du terminal (colonnes et lignes) dans n'importe quel format décimal à deux chiffres *. Par exemple, une sortie pourrait être 80x25.


Inspiration . Invite .
* La sortie doit avoir les deux mesures sur une ou deux lignes consécutives, et il ne peut pas y avoir plus d'une ligne de sortie principale et / ou inférieure (éventuellement suivie d'une nouvelle ligne). Les lignes (jusqu'à quatre) ne doivent pas être plus longues que max (colonnes, 1 + len (str (colonnes)) + len (str (colonnes))).

Adam
la source
2
Je n'ai jamais vu un défi aussi rapide que prévu. Félicitations!
M. Xcoder
13
@ Mr.Xcoder Je me spécialise dans les one-liners…
Adám
Vous êtes sur le point d'obtenir un diplôme dans des postes à doublure! Vous êtes vraiment bon, non, très bon à cela
:)
Que signifie exactement "format cohérent"?
Felipe Nardi Batista
1
@ FelipeNardiBatista Je dirai oui pour l'instant, mais revenons si cela conduit à des absurdités.
Adám

Réponses:

27

* sh, 9

stty size

Sortie:

97 364
mvds
la source
Fonctionne également à Bash.
numbermaniac
2
Ou tout autre shell sur un système de type posix.
MVDS
1
Étant donné les noms de certaines langues vues sur ce site, il faut plus de temps pour comprendre que * sh se réfère ici à "bash, zsh, csh, dash, etc." au lieu d'une langue dont le nom est constitué d'un astérisque suivi des lettres s et h :-)
ShreevatsaR
Techniquement, vous n'avez même pas besoin d'un shell pour exécuter un programme. Donc, la shdésignation n'a pas vraiment de sens de toute façon.
MVDS
20

Code machine 8086, 11 octets (en tant que fonction, non concurrents)

Pas vraiment en compétition car il n'a pas de sortie visible. Ceci montre simplement le moyen le plus rapide de trouver les dimensions actuelles de l'écran, sans le code standard requis pour l'impression.

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

Comment ça marche:

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

Code machine 8086, 48 octets (en tant que programme complet)

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

Comment ça marche:

                |   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
utilisateur5434231
la source
Je suis à peu près sûr qu'une soumission de fonction aurait besoin d'un ret? De plus, je ne suis pas sûr que vous ayez le droit de vous écraser ds. Cela pourrait devoir être pris en compte par Meta, car la fonction fonctionne plus d’une fois, elle a juste des effets secondaires indésirables.
Pourquoi "la pile contient-elle toujours 0 à l'entrée"? Je ne connais aucune règle selon laquelle la pile est mise à zéro. Je suppose que vous parlez de faire apparaître la valeur de retour et de penser que ce sera 0? Est-ce garanti pour un binaire COM?
Cody Grey
@CodyGray: dans un programme COM, la pile contient initialement un pointeur proche du début de la PSP (décalage 0), donc RET retournera à PSP: 0, qui contient un appel à EXIT. stackoverflow.com/a/12593311/371250
ninjalj
Ah, merci pour la clarification, @ninjalj. (Excellente réponse, BTW. J'avais oublié pratiquement tous les détails de la PSP, bien que sa mise en œuvre ait été inversée il y a de nombreuses années.) Mais si vous supprimez ce pointeur de la pile sans le repousser, ne vous cassez l' RETinstruction à la fin de la fonction?
Cody Grey
@CodyGray: vous remarquerez que le programme se termine via INT 20h, et non via RET, exactement parce qu'après POPing, la sortie via RETne fonctionne plus.
Ninjalj
18

Bash, 22 à 20 caractères

echo $COLUMNS $LINES

Grâce à:

Échantillon échantillon:

bash-4.3$ echo $COLUMNS $LINES
80 24
homme au travail
la source
Avec seulement 1 octet de plus, echo $COLUMNS\x$LINEScan o / p80x24
Pandya,
@ Pandya C'est vrai, mais pas nécessaire.
Adám
7
Vous ne savez pas si cela est conforme aux nouvelles exigences en matière de format de sortie, mais vous pourriez simplement avoir $ COLUMNS \ x $ LINES pour générer "bash: 90x50: commande non trouvée". Supposons que cela ne fonctionne pas avec la localisation cependant, ou si cette commande existe réellement !.
Muzer
14

xterm, 6 octets

Comme vous n'avez pas besoin de formate spécifique, vous pouvez simplement utiliser la commande resize(à 6 caractères) de xterm:

$ resize
COLUMNS=120;
LINES=31;
export COLUMNS LINES;
Pandya
la source
1
Agréable. Mais vous voudrez peut-être écrire un en-tête standard, comme #xterm, 6 bytes.
Adám
@ Adám Ce type de sortie est-il acceptable selon la question?
Pandya
@ Adám ok. Juste ajouté en tête :)
Pandya
Ce n'est pas spécifique à xterm. Notez également que la sortie dépend de votre shell.
celtschk
13

sh, 20 octets

tput lines;tput cols

.. Trop évident, peut-être ..

dieter
la source
3
tput cols; !: 0 cols enregistre un octet dans bash
marcosm
@marcos tu veux dire tput lines;!:0 cols, non?
Dieter
12

Python 3 , 30 octets

import os
os.get_terminal_size

Comme cela ne fonctionne pas dans TIO, une alternative est utilisée ici:

Essayez-le en ligne!

Felipe Nardi Batista
la source
1
Pourquoi pas juste os?
Jonathan Allan
2
... cela ne fonctionnera pas sur TIO, à cause du système d'exploitation, donc besoin de spécifier. Il fait le travail sur Windows. Aussi import oset os.est plus court que from....
Jonathan Allan
Je peux confirmer que cela fonctionne sur la fenêtre 10 sans aucune modification
Ferrybig
Fonctionne aussi sur mac
M. Xcoder
1
Techniquement, Python 3.3+
matsjoyce
11

C (Linux uniquement), 63 61

short m[4];main(){ioctl(0,21523,m);printf("%dx%d",*m,m[1]);}
dieter
la source
4
Vous pourriez gagner deux octets en remplaçant m[0]par *m.
YSC
Vous pouvez sauvegarder un octet en faisant mun argument 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);}correspondrait à 46 octets, avec des tailles imprimées en base 16 et sans séparateur (autre que les zéros de gauche possibles) entre les colonnes et les lignes.
mvds
8

APL (Dyalog) , 3 octets

(Afficher une réponse déjà puisque ce n’est vraiment pas mon défi.)

⎕SDS creen D imensions

Échantillon échantillon:

      ⎕SD
25 79
Adam
la source
8

C #, 59 octets

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

Compile en un Func<int, string, cependant, l'entrée n'est pas utilisée.

TheLethalCoder
la source
Ne marche pas; J'ai trouvé que cela renvoie la taille de la console si AllocConsole () était appelé, et non la taille à laquelle l'entrée et la sortie standard de la console sont réellement connectées. Question ici: stackoverflow.com/questions/35688348/… Ce que je retenais en posant la question, c’est que j’exécutais réellement dans un environnement Windows avec stdin & stdout connecté à un pipeline ssh. L'implémentation Win32 SSH ne fournit pas le nécessaire.
Josué
7

NodeJS, 50 48 46 octets

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

Utilise process.stdouts columnset rowsvaleurs.

Pete TNT
la source
Merci @ETHproductions, ajout de console.log à la sortie de la console :)
Pete TNT
Pas de problème :-) La sortie peut être dans n'importe quel format cohérent, donc je pense que vous pouvez économiser quelques octets en faisant console.log([s.columns,s.rows]).
ETHproductions
5
1 octet sur:with(process.stdout)console.log(columns,rows)
Brian McCutchon
1
Et un peu plus d' octets off (si ce compte): with(process.stdout)write(columns+[rows]). Ou, si ça ne compte pas:with(process.stdout)write(columns+' '+rows)
markasoftware
1
@ Markasoftware Ooh, c'est malin. Je ne pense pas que le premier devrait compter, cependant.
Brian McCutchon
6

Ruby, 41 36 21 + 13 = 34 octets

Exécuter avec l'indicateur de ligne de commande -rio/console

p IO.console.winsize

C'est mon premier golf Ruby, alors dis-moi s'il y a quelque chose que je peux faire de mieux.

5 octets économisés grâce à SztupY

2 octets économisés grâce à manatwork


Ceci affiche la hauteur puis la largeur sous forme de liste de longueur deux

Exemple de sortie:

[25, 80]
Assistant de blé
la source
vous pouvez potentiellement déplacer les éléments requis dans le paramètre de ligne de commande -r, qui ne représente que 2 octets supplémentaires
SztupY,
Pas besoin de guillemets simples io/console, aucun shell n'effectuera une expansion non désirée s'il n'est pas laissé entre guillemets.
manatwork
6

GNU Forth, 7 octets

form .s

forme - urows ucols gforth “forme”

Le nombre de lignes et de colonnes dans le terminal.

Exemple de sortie

<2> 24 80

Essayez-le en ligne!

Zeppelin
la source
4

C # 94 octets (application entière)

Toute la réponse de l'application MetaColon peut être raccourcie beaucoup:

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

Mode PowerShell +, 11 octets?

La sortie peut ne pas être acceptable dans sa forme actuelle.

la modecommande est un utilitaire Windows par défaut

Meta Post concernant l'utilisation de modesans précisercon

(mode)[3,4]

obtient la sortie du mode:

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

puis les 4ème et 5ème lignes ( [3,4]) produisant:

PS H:\> (mode)[3,4]
    Lines:          3000
    Columns:        120
Colsw
la source
Économisez deux octets:(mode)[3,4]-replace"\D"
Adám
pour que cela fonctionne ici, il me faut utiliser(mode con)[3..4]
Felipe Nardi Batista
Ah @ FelipeNardiBatista est probablement juste que vous avez besoin de con.
Adám
1
@ FelipeNardiBatista est connécessaire? cela obtient les premières lignes absolument, et je crois conest toujours en premier? Je dirais qu'un standardsystème n'aura également qu'une sortie pour le mode, ce qui est ce que nous devrions supposer?
Colsw
1
@ConnorLSW C'est juste que mon système fonctionne bien, mais votre réponse ne fonctionne tout simplement pas ici
Felipe Nardi Batista,
4

Rapide, 99 octets

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

Merci aux gars de Vapor pour leur paquet Console .

Caleb Kleveter
la source
3

Lot, 25 19 18 17 octets

Sauvegardé 6 octets en canalisant directement à la commande "find".
Sauvegardé 1 octet grâce à Adám / OP .
Enregistré 1 octet grâce au commentaire de OP .

mode con|find "n"

Cela renvoie la commande elle-même puisque echo est activé mais, comme le commente l'OP , une ligne principale est OK.


Selon votre configuration, il peut ne fonctionner qu'avec 13 octets. Cependant, il semble que tout ce qui utilise les ports COM entraînera une sortie trop prolixe.

mode|find "n"
Rôti d'ingénieur
la source
Enregistrer un octet s:n.
Adám
1
@ FelipeNardiBatista Ouais, et le mien dit que j'ai 9001 lignes. Ce n'est qu'un paramètre: Propriétés> Mise en page> Taille du tampon d'écran.
Adám
Les dimensions de la console Windows de @FelipeNardiBatista ne sont pas les mêmes que celles de la fenêtre. C'est pourquoi les barres de défilement apparaissent lorsque vous réduisez la fenêtre. Par OP , cette solution exacte est OK.
Ingénieur Toast
@ Adám Dangit, j'ai cherché une corde plus courte et je ne sais pas comment je l'oublie. C'est probablement parce que j'ai commencé avec juste modemais que l'ajout de "con" était plus court que la recherche de deux jeux de caractères différents avec findstr.
Ingénieur Toast
@ Adám Basé sur votre commentaire , ce serait valable: @mode|find "L" /i? Il renvoie les lignes, les colonnes et le délai du clavier avec 17 octets au lieu des 18 ci-dessus. Est-ce que ces lignes doivent être vides?
Ingénieur Toast
3

C #, 85 octets

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

Si vous voulez un code d'application complet, nous aurions 115 101 94 octets :

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

Cependant, vous pourriez aussi parler de la taille de la mémoire tampon , nous aurions 85 octets à nouveau

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

Ou sous forme de code d'application complet (à nouveau, évidemment, 115 101 94 octets ):

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

Sauvegardé 14 octets dans tout le code de l'application à l'aide de Caius Jard

MetaColon
la source
1
104 octets de l'application entière, vous pouvez peut-être étendre la logique à vos autres variantes:using c=System.Console;class P{static void Main(){c.WriteLine(c.WindowWidth);c.Write(c.WindowHeight);}}
Caius Jard
(Je ne sais pas comment jouer au golf si j'ai une réponse plus court, ne pas modifier le vôtre i, vôtre commentaire, ou soumettre mon propre?)
Caius Jard
@CaiusJard Vous pouvez poster votre propre réponse ou commenter une amélioration et laisser le répondeur décider s’il souhaite l’intégrer ou non.
TheLethalCoder
Je voulais, je ne pouvais tout simplement pas éditer mon commentaire à temps ... J'ai publié ma propre réponse (qui l'incluait) pratiquement simultanément, alors je suppose que je ne vous ai pas piqué votre inspiration :). Je ne suis pas trop sûr d'avoir triché en écrivant une fonction qui renvoie la réponse, plutôt qu'une application complète. Toutes les autres réponses sont à peu près une application complète, mais CSharppPad.com acceptera votre version "à fonction unique". et lancez-le .. devrait regarder les règles sur le golf, je suppose
Caius Jard
@CaiusJard Les fonctions / méthodes sont autorisées implicitement sauf si explicitement interdit dans le défi lui-même. Par conséquent, une fonction anonyme convient, voir ma réponse pour une version qui fonctionne bien.
TheLethalCoder
2

Java 8 (pas de bibliothèques), Windows, 270 octets

Publication séparée sur recommandation d'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]);
    }
}
F. George
la source
Essayez cmd/c modeau lieu de cmd /c mode.
Conor O'Brien
Vient d’essayer, Runtime.exec () interprète cela comme une tentative d’exécution cmd/cqui en résulte CreateProcess error=2. :(
F. George
2

8ème , 24 16 12 octets

Révisé après le commentaire de Anders Tornblad.

con:size? .s

Renvoie la taille actuelle de la console en lignes et en colonnes imprimant le contenu de la pile.

Sortie:

2  n: 000000000285e5e0 1   300
1  n: 000000000285e4c0 1   90
Manoir du chaos
la source
2
Puisque la question autorise tous les formats de sortie, avez-vous vraiment besoin swap?
Anders Tornblad
@ Anders Tornblad - Merci pour votre commentaire judicieux. J'ai amélioré mon code.
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.inheritIOprovoque l'héritage d'une entrée / sortie d'un processus enfant; c'est le défaut en C avec exec. En Java, la valeur par défaut est "piped". Comme vous pouvez le constater, cela est bien plus court que d'utiliser Runtime.getRuntime().exec()(ce qui est également déconseillé) et de construire un BufferedReaderappel long et compliqué résultant de la réticence apparente des concepteurs d'API Java à ajouter une surcharge par souci de commodité.

Brian McCutchon
la source
Je souhaite ProcessBuildertravailler sur Windows, mais la modecommande génère plus de 4 lignes :(
F. George
1

Rouge , 19 octets

system/console/size

Sortie:

>> system/console/size
== 106x26

Peut également obtenir la résolution de l'écran comme dans la question précédente

Geek je
la source
1

Commodore 64 BASIC, 7 octets

?"40x25

Le C64 dispose d’une console texte de taille fixe de 40 x 25 caractères. Il n'est pas nécessaire d'interroger la taille de la console, ce qui est une bonne chose, car il n'y a aucun moyen de l'interroger.

marque
la source
Cela ressemble à de la triche, bien que pour être juste, la question (ni son inspiration) ne l’interdit pas spécifiquement.
Cody Grey
1

Kotlin + Jline 2 , 58 octets

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

Parce que pourquoi pas Il s'avère que la bibliothèque standard n'a en fait aucun moyen de déterminer la taille de la console, il est donc indispensable de rentrer une bibliothèque, de peur de lancer un autre processus et d'analyser le flux d'entrée ... ce serait dommage si quelqu'un le faisait.

F. George
la source
Ne mettez pas deux réponses dans un post.
Adám
@ Adám C'est plus une réflexion après coup, alors je pense que ça va. Vous avez assez de représentants pour le modifier directement, faites-le si vous pensez vraiment qu'un 270b avec des restrictions arbitraires devrait constituer une réponse distincte.
F. George
Chaque soumission est en concurrence avec d’autres dans la même langue. Java est intrinsèquement détaillé, mais votre soumission est la soumission Java la plus courte (et la seule). De plus, même si je peux éditer votre message, je ne peux pas poster une réponse séparée en votre nom.
Adám
Je voulais dire que si vous supprimez ma réponse Java, je la republierai moi-même. Et bien que vous sachiez que la réponse est actuellement la réponse la plus courte en Java, elle est codée avec la restriction de ne pas utiliser de bibliothèques externes. Afin de répondre à votre argument, je le marquerai comme non concurrent et coderai une réponse Java appropriée plus tard.
F. George
Publiez-le en tant que Java (pas de bibliothèques) et soumettez une autre soumission appelée Java avec… . Cela vous donnera trois votes positifs de ma part.
Adám
1

Empilés , 7 octets

termdim

Laisse la sortie sur la pile, comme cela est autorisé par défaut. Exemple d'utilisation:

λ stacked -pe "termdim"
(117 26)

Bonus: l' termdim'x'#`avoir 117x26.

Conor O'Brien
la source
1

C (linux, C89 seulement), 45 41

inspiré par https://codegolf.stackexchange.com/a/118696/42186 par @dieter

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

cela sort la taille sous forme de données binaires. Pas sûr que cela compte comme "n'importe quel format". Vous auriez besoin de quelque chose de plus (moins, hexdump, od, table ascii) (ou un émulateur de terminal ésotérique qui le fait automatiquement pour vous) pour le rendre lisible par l'homme. Exemple d'utilisation:

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

La taille du terminal est de 204 colonnes sur 58 lignes.

Merci à @ Random832 pour utiliser odau lieu de hexdump.

mvds
la source
1
Je pense que Hex le pousse. Toutes les autres réponses utilisent des valeurs décimales, je vais donc ajouter cette exigence à OP. Désolé.
Adám
1
od -s le fera en décimal et est plus court que hexdump
Random832
@ Random832 Cool, je ne le savais pas, +1! Mais cette réponse est devenue invalide quand même, lorsque les règles sont passées de "n'importe quel format" à un format très spécifique (quelque chose comme: base 10 en ascii dans les émulateurs de terminaux classiques)
mvds