Sag mir meine Konsolenmaße!


41

Abmessungen der Ausgabe-Terminals (Spalten und Zeilen) in einem beliebigen 2-stelligen Dezimalformat *. Beispielsweise könnte eine Ausgabe sein 80x25.


Inspiration . Aufforderung .
* Die Ausgabe muss beide Kennzahlen in einer oder zwei aufeinanderfolgenden Zeilen enthalten, und es darf nicht mehr als eine führende und / oder nachfolgende Ausgabezeile (optional gefolgt von einer neuen Zeile) geben. Die (bis zu vier) Zeilen dürfen nicht länger als max (cols, 1 + len (str (cols)) + len (str (rows)) sein.


2
Ich habe noch nie eine kürzere Herausforderung gesehen. Glückwunsch!
Mr. Xcoder

13
@ Mr.Xcoder Ich bin auf Einzeiler spezialisiert…
Adám

Sie sind dabei, einen Abschluss in einzeiligen Stellen zu bekommen! Sie sind in der Tat gut, nein, sehr gut darin
:)

Was bedeutet "konsistentes Format" genau?
Felipe Nardi Batista

1
@FelipeNardiBatista Ich werde vorerst ja sagen, aber zurück, wenn dies zu Absurditäten führt.
Adám

Antworten:


27

* sh, 9

stty size

Ausgabe:

97 364

Funktioniert auch in bash.
numbermaniac

2
Oder eine andere Shell auf einem posix-ähnlichen System.
mvds

1
Angesichts der Namen einiger Sprachen, die auf dieser Website zu sehen sind, dauert es länger, um herauszufinden, dass sich * sh hier auf "bash, zsh, csh, dash, etc." bezieht. anstatt einer Sprache, deren Name aus einem Sternchen gefolgt von den Buchstaben s und h besteht :-)
ShreevatsaR

Technisch gesehen benötigen Sie nicht einmal eine Shell, um ein Programm auszuführen. Die shBezeichnung macht also sowieso keinen Sinn.
mvds

20

8086 Maschinencode, 11 Bytes (als Funktion, nicht konkurrierend)

Nicht wirklich konkurrierend, da es keine sichtbare Ausgabe hat. Dies ist nur der kürzeste Weg, um die aktuellen Bildschirmabmessungen ohne den zum Drucken erforderlichen Kesselschildcode zu ermitteln.

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

Wie es funktioniert:

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 Maschinencode, 48 Bytes (als vollständiges Programm)

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

Wie es funktioniert:

                |   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

Ich bin mir ziemlich sicher, dass eine Funktionsübermittlung eine ret? Ich bin mir auch nicht sicher, ob du Klumpen darfst ds. Dies muss möglicherweise zu Meta übertragen werden, da die Funktion mehrmals ausgeführt wird und nur unerwünschte Nebenwirkungen hat.

Warum enthält "der Stack bei der Eingabe immer 0"? Ich kenne keine Regel, nach der der Stapel auf Null gesetzt wird. Ich vermute, Sie reden über das Poppen des Rückgabewerts und denken, das wird 0 sein? Ist das für eine COM-Binärdatei garantiert?
Cody Grey

@CodyGray: In einem COM-Programm enthält der Stapel anfangs einen Near-Zeiger auf den Start des PSP (Offset 0), sodass RET zu PSP: 0 zurückspringt, das einen Aufruf von EXIT enthält. stackoverflow.com/a/12593311/371250
ninjalj

Ah, danke für die Klarstellung, @ninjalj. (Tolle Antwort, die du verlinkt hast, übrigens. Ich hatte praktisch alle Details über die PSP vergessen, obwohl ich ihre Implementierung vor vielen Jahren rückgängig gemacht hatte.) Sie brechen die RETAnweisung am Ende der Funktion?
Cody Grey

@CodyGray: Sie werden feststellen, dass das Programm INT 20hnicht über beendet RETwird , sondern über , da das Beenden über nach POPing RETnicht mehr funktioniert.
Ninjalj

18

Bash, 22 20 Zeichen

echo $COLUMNS $LINES

Dank an:

  • Türknauf für optimales Ausgabeformat (2 Zeichen)

Probelauf:

bash-4.3$ echo $COLUMNS $LINES
80 24

Mit nur noch 1 Byte echo $COLUMNS\x$LINESkann o / p80x24
Pandya

@ Pandya Wahr, aber nicht notwendig.
Adám

7
Ich bin mir nicht sicher, ob dies den neuen Anforderungen für das Ausgabeformat entspricht, aber es kann sein, dass $ COLUMNS \ x $ LINES "bash: 90x50: Befehl nicht gefunden" ausgibt. Angenommen, das funktioniert mit der Lokalisierung nicht, oder wenn dieser Befehl tatsächlich existiert !.
Muzer

14

xterm 6 Bytes

Da Sie kein bestimmtes Format benötigen, können Sie einfach den resize(6-stelligen) Befehl verwenden xterm:

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

1
Nett. Möglicherweise möchten Sie jedoch einen Standardheader schreiben, z #xterm, 6 bytes.
Adám

@ Adám Ist diese Art der Ausgabe laut Frage akzeptabel?
Pandya


@ Adám ok. Gerade hinzugefügt Header :)
Pandya

Dies ist nicht xtermspezifisch. Beachten Sie auch, dass die Ausgabe von Ihrer Shell abhängt.
Celtschk

13

sh, 20 Bytes

tput lines;tput cols

..Zu offensichtlich, vielleicht ..


3
tput cols; : 0 cols speichern ein Byte in bash
marcosm

@ marcos du meinst tput lines;!:0 cols, oder?
Dieter

12

Python 3 , 30 Bytes

import os
os.get_terminal_size

Da es in TIO nicht funktioniert, wird dort eine Alternative verwendet:

Probieren Sie es online!


1
Warum nicht einfach os?
Jonathan Allan

2
... es funktioniert aufgrund des Betriebssystems nicht mit TIO, muss also angegeben werden. Es funktioniert unter Windows. Auch import osund os.ist kürzer als from....
Jonathan Allan

Ich kann bestätigen, dass es unter
Windows

Funktioniert auch auf Mac
Mr. Xcoder

1
Technisch gesehen Python 3.3+
Matsjoyce

11

C (nur Linux), 63 61

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

4
Sie könnten zwei Bytes gewinnen durch das Ersetzen m[0]durch *m.
YSC

Sie können ein Byte sparen, indem Sie mein Argument von main main(short m){ioctl(0,21523,&m);printf("%dx%d",m,(&m)[1]);}
eingeben

main(int m){ioctl(0,21523,&m);printf("%x",m);}wäre 46 Bytes, mit Größen in der Basis 16 und ohne Trennzeichen (außer möglichen führenden Nullen) zwischen Spalten und Zeilen.
mvds


8

C #, 59 Bytes

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

Kompiliert nach a Func<int, string, die Eingabe wird jedoch nicht verwendet.


Funktioniert nicht; Ich stellte fest, dass dies die Größe der Konsole zurückgibt, die bei einem Aufruf von AllocConsole () erreicht wird, nicht die Größe, mit der die Standardeingabe und -ausgabe der Konsole tatsächlich verbunden sind. Frage hier: stackoverflow.com/questions/35688348/… Was ich zurückhielt, als ich die Frage stellte, ist, dass ich tatsächlich auf einer Windows-Umgebung mit stdin & stdout lief, die mit einer ssh-Pipeline verbunden war. Die Win32-SSH-Implementierung bietet nicht die erforderlichen.
Joshua

7

NodeJS, 50 48 46 Bytes

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

Verwendet process.stdouts columnsund rowsWerte.


Thanks @ETHproductions, console.log zur Ausgabe auf die Konsole hinzugefügt :)
Pete TNT

Kein Problem :-) Die Ausgabe kann in einem beliebigen konsistenten Format erfolgen, sodass Sie auf diese Weise ein paar Bytes sparen können console.log([s.columns,s.rows]).
ETHproductions

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

1
Und noch ein paar Bytes aus (wenn diese Zählungen): with(process.stdout)write(columns+[rows]). Oder wenn es nicht zählt:with(process.stdout)write(columns+' '+rows)
markasoftware

1
@Markasoftware Ooh, das ist schlau. Ich denke aber nicht, dass der erste zählen sollte.
Brian McCutchon

6

Ruby, 41 36 21 + 13 = 34 Bytes

Führen Sie mit dem Befehlszeilenflag aus -rio/console

p IO.console.winsize

Dies ist mein erstes Ruby-Golf, also sag mir, ob ich etwas besseres tun kann.

5 Bytes gespart dank SztupY

2 Bytes gespart dank Handarbeit


Dies gibt Höhe dann Breite als Liste der Länge zwei aus.

Beispielausgabe:

[25, 80]

Sie können die
Anforderungen

Die einfachen Anführungszeichen io/consolesind nicht erforderlich , und keine Shell führt eine unerwünschte Erweiterung durch, wenn sie nicht in Anführungszeichen gesetzt wird.
manatwork


4

C # 94 Bytes (ganze App)

Die gesamte App-Antwort von MetaColon kann sehr viel gekürzt werden:

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

4

PowerShell + -Modus, 11 Bytes?

Die Ausgabe ist in der aktuellen Form möglicherweise nicht akzeptabel.

Der modeBefehl ist ein Standard-Windows-Dienstprogramm

Meta Post bezüglich der Verwendung von modeohne Angabecon

(mode)[3,4]

Liefert die Ausgabe von mode:

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

dann die 4. und 5. Zeile ( [3,4]) ausgeben:

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

Speichern Sie zwei Bytes:(mode)[3,4]-replace"\D"
Adám

Damit dies hier funktioniert, muss ich verwenden(mode con)[3..4]
Felipe Nardi Batista

Ah @FelipeNardiBatista ist wahrscheinlich richtig, dass Sie con brauchen.
Adám

1
@FelipeNardiBatista ist connotwendig? das bekommt die ersten zeilen absolut und ich glaube conist immer das erste? Ich würde sagen, ein standardSystem wird auch nur einen Ausgang für den Modus haben, was ist, was wir annehmen sollten?
colsw

1
@ConnorLSW Es ist nur so, dass mein System gut funktioniert, aber Ihre Antwort funktioniert hier einfach nicht
Felipe Nardi Batista

4

Schnell, 99 Bytes

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

Vielen Dank an die Jungs von Vapor für ihr Konsolenpaket .


3

Batch, 25 19 18 17 Bytes

6 Bytes durch direkte Weiterleitung an den Befehl "find" gespeichert.
1 Byte dank Adám / OP gespeichert .
1 Byte dank Kommentar von OP gespeichert .

mode con|find "n"

Dies gibt den Befehl selbst aus, da das Echo eingeschaltet ist, aber, wie von OP kommentiert , ist eine führende Zeile in Ordnung.


Abhängig von Ihrem Setup kann es mit nur 13 Bytes funktionieren. Es scheint jedoch, dass alles, was COM-Anschlüsse verwendet, zu einer übermäßig ausführlichen Ausgabe führt.

mode|find "n"

Speichern Sie ein Byte s:n.
Adám

1
@FelipeNardiBatista Ja, und meiner sagt, ich habe 9001 Zeilen. Dies ist nur eine Einstellung: Eigenschaften> Layout> Bildschirmpuffergröße.
Adám

@FelipeNardiBatista Die Windows-Konsolenabmessungen stimmen nicht mit den Fensterabmessungen überein. Deshalb werden Bildlaufleisten angezeigt, wenn Sie das Fenster verkleinern. Pro OP ist diese genaue Lösung in Ordnung.
Ingenieur Toast

@ Adám Dangit, ich habe nach einer kürzeren Saite gesucht und weiß nicht, wie ich sie übersehen habe. Das liegt wahrscheinlich daran, dass ich gerade modeerst angefangen habe, aber festgestellt habe, dass das Hinzufügen von "con" kürzer war, als nach zwei verschiedenen Zeichengruppen mit zu suchen findstr.
Ingenieur Toast

@ Adám Wäre dies aufgrund Ihres Kommentars gültig @mode|find "L" /i:? Es gibt Zeilen, Spalten und Tastaturverzögerung mit 17 Bytes anstelle der 18 oben zurück. Müssen diese führenden / nachfolgenden Zeilen leer sein?
Ingenieur Toast

3

85 Bytes

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

Wenn Sie einen vollständigen Anwendungscode wünschen, haben wir 115 101 94 Bytes :

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

Jedoch Sie könnte bedeuten , Puffergröße als auch, hätten wir 85 Bytes wieder

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

Oder als ganzer Anwendungscode (offensichtlich wieder 115 101 94 Bytes ):

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

Mit Hilfe von Caius Jard 14 Bytes im gesamten Anwendungscode gespeichert


1
104 Bytes ganze App, vielleicht können Sie die Logik auf Ihre anderen Variationen erweitern:using c=System.Console;class P{static void Main(){c.WriteLine(c.WindowWidth);c.Write(c.WindowHeight);}}
Caius Jard

(Ich bin mir nicht sicher, wie ich Golf spielen soll, wenn ich eine kürzere Antwort habe; bearbeite ich deine, kommentiere deine oder poste meine eigenen?)
Caius Jard

@CaiusJard Sie können Ihre eigene Antwort posten oder eine Verbesserung kommentieren und den Antwortenden entscheiden lassen, ob er sie übernehmen möchte oder nicht.
TheLethalCoder

Ich wollte, konnte meinen Kommentar aber nicht rechtzeitig bearbeiten ... Ich habe meine eigene Antwort (die ihn enthielt) praktisch gleichzeitig gepostet, also schätze ich, dass ich Ihre Inspiration nicht geklaut habe :). Ich bin mir nicht sicher, ob es ein Betrug ist, im Wesentlichen eine Funktion zu schreiben, die die Antwort zurückgibt, und nicht eine ganze App. Alle anderen Antworten sind so ziemlich eine ganze App. Aber CSharppPad.com akzeptiert auch Ihre Version mit der "einzigen Funktion" und starten Sie es .. sollte die Regeln für das Golfen nachschlagen, denke ich
Caius Jard

@CaiusJard Funktionen / Methoden sind implizit erlaubt, es sei denn, dies ist in der Challenge selbst ausdrücklich nicht erlaubt. Daher ist eine anonyme Funktion in Ordnung, siehe meine Antwort für eine Version, die gut funktioniert.
TheLethalCoder

2

Java 8 (keine Bibliotheken), Windows, 270 Bytes

Posting separat auf Empfehlung von 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]);
    }
}

Versuchen Sie es cmd/c modestatt cmd /c mode.
Conor O'Brien

Gerade ausprobiert, interpretiert Runtime.exec () dies als Versuch, auszuführen, cmd/cwas zu führt CreateProcess error=2. :(
F. George

2

8. , 24 16 12 Bytes

Überarbeitet nach Anders Tornblad Kommentar.

con:size? .s

Gibt die aktuelle Größe der Konsole in Zeilen und Spalten zurück, in denen Stapelinhalte gedruckt werden.

Ausgabe:

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

2
Da die Frage jedes Ausgabeformat zulässt, brauchen Sie das wirklich swap?
Anders Tornblad

@Anders Tornblad - Vielen Dank für Ihren weisen Kommentar. Ich habe meinen Code verbessert.
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.inheritIOBewirkt, dass eine Eingabe / Ausgabe eines untergeordneten Prozesses vererbt wird. Dies ist die Standardeinstellung in C mit exec. In Java lautet die Standardeinstellung "piped". Wie Sie sehen, ist dies viel kürzer als die Verwendung Runtime.getRuntime().exec()(die ebenfalls veraltet ist) und das Erstellen eines BufferedReaderlangen und verschlungenen Aufrufs, der das Ergebnis der offensichtlichen Abneigung der Java-API-Designer ist, der Einfachheit halber eine Überladung hinzuzufügen.


Ich wünschte, ich ProcessBuilderwürde unter Windows arbeiten, aber der modeBefehl gibt mehr als 4 Zeilen aus :(
F. George

1

Rot , 19 Bytes

system/console/size

Ausgabe:

>> system/console/size
== 106x26

Kann auch die Bildschirmauflösung wie in der vorherigen Frage erhalten


1

Commodore 64 BASIC, 7 Bytes

?"40x25

Der C64 verfügt über eine Textkonsole mit einer festen Größe von 40 x 25 Zeichen. Es ist nicht erforderlich, die Konsolengröße abzufragen, was eine gute Sache ist, da es keine Möglichkeit gibt, sie abzufragen.


Dies scheint ein Betrug zu sein, obwohl die Frage (noch ihre Inspiration) dies nicht ausdrücklich verbietet, obwohl dies fair ist.
Cody Grey


1

Kotlin + Jline 2 , 58 Bytes

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

Weil warum nicht. Es hat sich herausgestellt, dass die Standard- Bibliothek keine Möglichkeit hat, die Konsolengröße zu bestimmen, so dass ein Abrufen einer Bibliothek erforderlich ist, damit Sie keinen weiteren Prozess starten und den Eingabestream analysieren können .


Fügen Sie nicht zwei Antworten in einen Beitrag ein.
Adám

@Adam Es ist eher ein nachträglicher Gedanke, also denke ich, dass es in Ordnung ist. Sie haben genug Repräsentanten, um es direkt zu bearbeiten. Wenn Sie wirklich der Meinung sind, dass ein 270b mit willkürlichen Einschränkungen eine separate Antwort sein sollte, tun Sie dies.
F. George

Jede Einsendung tritt gegen andere Einsendungen in derselben Sprache an. Java ist von Natur aus ausführlich, aber Ihre ist die kürzeste (und einzige) Java-Übermittlung. Auch wenn ich Ihren Beitrag bearbeiten kann, kann ich in Ihrem Namen keine separate Antwort veröffentlichen.
Adám

Ich habe impliziert, dass ich meine Java-Antwort, wenn Sie sie entfernen, selbst neu veröffentlichen werde. Und obwohl Sie der Meinung sind, dass die Antwort derzeit die kürzeste Java-Antwort ist, ist sie unter der Einschränkung codiert, keine externen Bibliotheken zu verwenden. Um auf Ihr Argument einzugehen, werde ich es als nicht konkurrierend markieren und später eine richtige Java-Antwort codieren.
F. George

Veröffentlichen Sie es als Java (keine Bibliotheken) und reichen Sie eine weitere Einreichung mit dem Namen Java mit ein . Dann bekommst du drei positive Stimmen von mir.
Adám

1

Gestapelt , 7 Bytes

termdim

Lässt die Ausgabe auf dem Stapel, wie dies standardmäßig zulässig ist. Anwendungsbeispiel:

λ stacked -pe "termdim"
(117 26)

Bonus: termdim'x'#`um es zu haben 117x26.


1

C (nur Linux, C89), 45 41

inspiriert von https://codegolf.stackexchange.com/a/118696/42186 von @dieter

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

Dies gibt die Größe als Binärdaten aus. Ich bin mir nicht sicher, ob dies als "beliebiges Format" gilt. Sie würden etwas extra benötigen (less, hexdump, od, ascii table) (oder einen esoterischen Terminal-Emulator, der dies automatisch für Sie erledigt), um es für den Menschen lesbar zu machen. Anwendungsbeispiel:

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

Die Terminalgröße beträgt 204 Spalten und 58 Zeilen.

Vielen Dank an @ Random832 für die Verwendung odanstelle von hexdump.


1
Ich denke, Hex drückt es. Alle anderen Antworten verwenden Dezimalzahlen. Daher füge ich diese Anforderung zu OP hinzu. Es tut uns leid.
Adám

1
od -s tut es in Dezimalzahlen und ist kürzer als hexdump
Random832

@ Random832 Cool, wusste das nicht, +1! Diese Antwort wurde jedoch ohnehin ungültig, als die Regeln von "jedem Format" in ein ganz bestimmtes Format geändert wurden (so etwas wie: Base 10 in ASCII in Mainstream-Terminalemulatoren)
mvds
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.