Katakan dimensi konsol saya!


41

Dimensi terminal keluaran (kolom dan baris) dalam format desimal dua angka *. Sebagai contoh, sebuah output bisa saja 80x25.


Inspirasi . Prompt .
* Keluaran harus memiliki kedua ukuran pada satu atau dua baris berturut-turut, dan mungkin tidak ada lebih dari satu jalur output terkemuka dan / atau trailing (opsional diikuti oleh baris baru). Garis (hingga empat) harus tidak lebih dari maks (cols, 1 + len (str (cols)) + len (str (ro‌ ws)))).


2
Saya belum pernah melihat tantangan yang lebih pendek terangkat. Selamat!
Tn. Xcoder

13
@ Mr.Xcoder Saya berspesialisasi dalam one-liners ...
Adám

Anda akan mendapatkan gelar dalam posting satu-baris! Anda memang bagus, tidak, sangat bagus dalam hal itu
:)

apa arti 'format konsisten' sebenarnya?
Felipe Nardi Batista

1
@FelipeNardiBatista saya akan mengatakan ya untuk saat ini, tetapi kembalikan jika ini mengarah pada absurditas.
Adám

Jawaban:


27

* sh, 9

stty size

Keluaran:

97 364

Juga berfungsi di bash.
numbermaniac

2
Atau shell lain pada sistem seperti posix.
mvds

1
Mengingat nama beberapa bahasa yang terlihat di situs ini, perlu waktu lebih lama untuk mengetahui bahwa * sh di sini merujuk ke "bash, zsh, csh, dash, dll." daripada bahasa yang namanya terdiri dari tanda bintang diikuti oleh huruf s dan h :-)
ShreevatsaR

Secara teknis Anda bahkan tidak perlu shell untuk menjalankan program. Jadi shsebutannya tidak masuk akal kok.
mvds

20

8086 kode mesin, 11 byte (sebagai fungsi, tidak bersaing)

Tidak benar-benar bersaing karena tidak memiliki output yang terlihat. Ini hanya menunjukkan cara terpendek untuk menemukan dimensi layar saat ini, tanpa kode boilerplate yang diperlukan untuk pencetakan.

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

Bagaimana itu bekerja:

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 kode mesin, 48 byte (sebagai program lengkap)

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

Bagaimana itu bekerja:

                |   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

Saya cukup yakin pengajuan fungsi akan membutuhkan ret? Juga, saya tidak yakin bahwa Anda diizinkan untuk mengalahkan ds. Ini mungkin perlu dibawa ke Meta, karena fungsinya bekerja lebih dari sekali, itu hanya memiliki efek samping yang tidak diinginkan.

Mengapa "tumpukan selalu berisi 0 saat masuk"? Saya tidak tahu aturan apa pun bahwa stack akan memusatkan perhatian. Saya kira Anda sedang berbicara tentang popping nilai kembali dan berpikir itu akan menjadi 0? Apakah itu dijamin untuk biner COM?
Cody Grey

@CodyGray: dalam program COM, tumpukan awalnya berisi pointer dekat ke awal PSP (offset 0), jadi RET akan melompat kembali ke PSP: 0, yang berisi panggilan ke EXIT. stackoverflow.com/a/12593311/371250
ninjalj

Ah, terima kasih atas klarifikasi, @ninjalj. (Jawaban bagus yang Anda tautkan, BTW. Saya hampir lupa semua detail tentang PSP, meskipun telah merekayasa balik implementasinya bertahun-tahun yang lalu.) Tetapi jika Anda melepaskan penunjuk itu dari tumpukan tanpa mendorongnya kembali, jangan Anda melanggar RETinstruksi di akhir fungsi?
Cody Grey

@CodyGray: Anda akan perhatikan bahwa program keluar melalui INT 20h, bukan melalui RET, tepatnya karena setelah keluar dari POPing RETtidak berfungsi lagi.
ninjalj

18

Bash, 22 20 karakter

echo $COLUMNS $LINES

Terimakasih untuk:

Contoh dijalankan:

bash-4.3$ echo $COLUMNS $LINES
80 24

Dengan hanya 1 byte lagi, echo $COLUMNS\x$LINESdapat o / p80x24
Pandya

@ Pandya Benar, tetapi tidak perlu.
Adám

7
Tidak yakin apakah ini sesuai dengan persyaratan format output baru, tetapi Anda hanya bisa memiliki $ COLUMNS \ x $ LINES untuk menampilkan "bash: 90x50: perintah tidak ditemukan". Misalkan itu tidak bekerja dengan lokalisasi, atau jika perintah itu benar-benar ada !.
Muzer

14

xterm, 6 byte

Karena Anda tidak memerlukan format khusus, Anda cukup menggunakan perintah resize(6 karakter) dari xterm:

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

1
Bagus. Tetapi Anda mungkin ingin menulis header standar, seperti #xterm, 6 bytes.
Adám

@ Adám Apakah jenis keluaran ini dapat diterima menurut pertanyaan?
Pandya


@ Adám ok. Baru saja menambahkan tajuk :)
Pandya

Ini bukan spesifik xterm. Perhatikan juga bahwa output tergantung pada shell Anda.
celtschk

13

sh, 20 byte

tput lines;tput cols

.. Terlalu jelas, mungkin ..


3
tput cols; !: 0 cols menghemat satu byte dalam bash
marcosm

@marcos maksudmu tput lines;!:0 cols, kan?
diet

12

Python 3 , 30 byte

import os
os.get_terminal_size

Karena tidak berfungsi di TIO, sebuah alternatif digunakan di sana:

Cobalah online!


1
Kenapa tidak adil os?
Jonathan Allan

2
... itu tidak akan bekerja pada TIO, karena sistem operasi, jadi perlu menentukan. Ini tidak bekerja pada Windows. Juga import osdan os.lebih pendek dari from....
Jonathan Allan

Saya dapat mengonfirmasi itu berfungsi di Window 10 tanpa modifikasi apa pun
Ferrybig

Bekerja pada mac juga
Tn. Xcoder

1
Secara teknis Python 3.3+
matsjoyce

11

C (hanya linux), 63 61

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

4
Anda bisa memenangkan dua byte dengan menggantinya m[0]dengan *m.
YSC

Anda dapat menyimpan satu byte dengan membuat margumen 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);}akan menjadi 46 byte, dengan ukuran yang dicetak dalam basis 16 dan tidak ada pemisah (selain nol terkemuka mungkin) antara cols dan baris.
mvds


8

C #, 59 byte

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

Mengkompilasi ke Func<int, string, bagaimanapun, input tidak digunakan.


Tidak bekerja; Saya menemukan ini mengembalikan ukuran konsol jika AllocConsole () dipanggil, bukan ukuran input dan output standar konsol yang sebenarnya terhubung. Pertanyaan di sini: stackoverflow.com/questions/35688348/... Apa yang saya tunda ketika mengajukan pertanyaan adalah saya benar-benar berjalan di lingkungan Windows dengan stdin & stdout terhubung ke pipa ssh. Implementasi win32 ssh tidak menyediakan yang diperlukan.
Yosua

7

NodeJS, 50 48 46 byte

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

Penggunaan process.stdouts columnsdan rowsnilai-nilai.


Terima kasih @ETHproductions, tambah console.log ke keluaran ke konsol :)
Pete TNT

Tidak masalah :-) Outputnya bisa dalam format yang konsisten, jadi saya pikir Anda dapat menyimpan beberapa byte dengan melakukan console.log([s.columns,s.rows]).
ETHproduksi

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

1
Dan beberapa lagi byte off (jika jumlah ini): with(process.stdout)write(columns+[rows]). Atau, jika tidak masuk hitungan:with(process.stdout)write(columns+' '+rows)
markasoftware

1
@Markasoftware Ooh, itu pintar. Saya tidak berpikir yang pertama harus diperhitungkan.
Brian McCutchon

6

Ruby, 41 36 21 + 13 = 34 byte

Jalankan dengan bendera baris perintah -rio/console

p IO.console.winsize

Ini adalah golf Ruby pertama saya, jadi beri tahu saya jika ada yang bisa saya lakukan dengan lebih baik.

5 byte disimpan berkat SztupY

2 byte disimpan berkat manatwork


Ini menghasilkan tinggi kemudian lebar sebagai panjang dua daftar.

Contoh output:

[25, 80]

Anda dapat berpotensi memindahkan persyaratan ke -r parameter baris perintah yang hanya 2 byte tambahan
SztupY

Tidak perlu untuk tanda kutip tunggal di sekitar io/console, shell tidak akan melakukan ekspansi yang tidak diinginkan di atasnya jika dibiarkan kutip.
manatwork


4

C # 94 byte (seluruh aplikasi)

Seluruh jawaban aplikasi MetaColon dapat dipersingkat cukup banyak:

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

4

Mode PowerShell +, 11 Bytes?

Output mungkin tidak dapat diterima dalam bentuk saat ini.

yang modeperintah adalah utilitas bawaan windows

Meta Post tentang penggunaan modetanpa menentukancon

(mode)[3,4]

mendapatkan output dari mode:

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

kemudian baris 4 & 5 ( [3,4]) menghasilkan:

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

Simpan dua byte:(mode)[3,4]-replace"\D"
Adám

untuk ini bekerja di sini, saya perlu menggunakan(mode con)[3..4]
Felipe Nardi Batista

Ah @FelipeNardiBatista mungkin benar bahwa Anda perlu con.
Adám

1
@FelipeNardiBatista conperlu? ini benar-benar mendapat garis pertama, dan saya percaya conselalu pertama? saya akan mengatakan suatu standardsistem juga hanya akan memiliki satu output untuk mode, yang harus kita asumsikan?
colsw

1
@ConnorLSW Hanya saja sistem saya tidak berfungsi dengan baik, tetapi jawaban Anda tidak berfungsi di sini
Felipe Nardi Batista

4

Swift, 99 byte

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

Terima kasih kepada orang-orang di Vapor untuk paket Konsol mereka .


3

Batch, 25 19 18 17 byte

Disimpan 6 byte dengan memipakan langsung ke perintah "find".
Disimpan 1 byte berkat Adám / OP .
Disimpan 1 byte berkat komentar oleh OP .

mode con|find "n"

Ini menampilkan perintah itu sendiri karena gema aktif tetapi, seperti yang dikomentari oleh OP , garis terdepan adalah OK.


Tergantung pada pengaturan Anda, ini mungkin bekerja hanya dengan 13 byte. Namun, tampaknya memiliki sesuatu yang menggunakan port COM akan menyebabkan output yang terlalu bertele-tele.

mode|find "n"

Simpan satu byte s:n.
Adám

1
@FelipeNardiBatista Ya, dan milik saya bilang saya punya 9001 baris. Ini hanya pengaturan: Properti> Tata Letak> Ukuran Penyangga Layar.
Adám

@FelipeNardiBatista Dimensi konsol Windows tidak sama dengan dimensi jendela. Itu sebabnya bilah gulir muncul ketika Anda membuat jendela lebih kecil. Per OP , solusi tepat ini OK.
Engineer Toast

@ Adam Dangit, saya mencari string yang lebih pendek dan tidak tahu bagaimana saya mengabaikannya. Mungkin karena saya mulai dengan hanya modetetapi menemukan bahwa menambahkan `con` lebih pendek daripada mencari dua set karakter yang berbeda findstr.
Engineer Toast

@ Adam Berdasarkan komentar Anda , ini akan menjadi valid: @mode|find "L" /i? Ia mengembalikan Lines, Columns, dan Keyboard Delay dengan 17 byte, bukan 18 di atas. Apakah garis depan / belakang harus kosong?
Engineer Toast

3

C #, 85 Bytes

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

Jika Anda ingin seluruh kode aplikasi, kami memiliki 115 101 94 Bytes :

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

Namun, Anda dapat berarti ukuran Buffer juga, kami akan memiliki 85 Bytes lagi

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

Atau secara keseluruhan kode aplikasi (jelas 115 101 94 Bytes lagi):

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

Disimpan 14 Bytes dalam seluruh kode aplikasi dengan bantuan Caius Jard


1
104 byte seluruh aplikasi, mungkin Anda dapat memperluas logika ke variasi Anda yang lain:using c=System.Console;class P{static void Main(){c.WriteLine(c.WindowWidth);c.Write(c.WindowHeight);}}
Caius Jard

(Saya tidak yakin cara bermain golf jika saya memiliki jawaban yang lebih pendek; apakah saya mengedit jawaban Anda, mengomentari jawaban Anda, atau memposting jawaban saya sendiri?)
Caius Jard

@CaiusJard Anda dapat memposting jawaban Anda sendiri atau mengomentari peningkatan dan membiarkan penjawab memutuskan apakah mereka ingin memasukkannya atau tidak.
TheLethalCoder

Saya ingin, hanya tidak dapat mengedit komentar saya pada waktunya ... Posting jawaban saya sendiri (termasuk itu) secara virtual secara bersamaan, jadi saya pikir saya tidak mendapatkan inspirasi Anda :). Tidak terlalu yakin apakah saya merasa curang pada dasarnya menulis fungsi yang mengembalikan jawaban, alih-alih seluruh aplikasi - semua jawaban lainnya cukup banyak, tetapi sekali lagi CSharppPad.com akan menerima versi "satu-satunya fungsi" Anda. dan jalankan .. saya harus mencari aturan tentang golf, saya kira
Caius Jard

@CaiusJard Fungsi / metode diizinkan secara implisit kecuali jika secara eksplisit tidak diizinkan dalam tantangan itu sendiri. Oleh karena itu, fungsi anonim baik-baik saja, lihat jawaban saya untuk versi yang berfungsi dengan baik.
TheLethalCoder

2

Java 8 (tanpa perpustakaan), Windows, 270 byte

Posting secara terpisah berdasarkan rekomendasi 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]);}}

Tidak Disatukan:

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

Coba cmd/c modealih-alih cmd /c mode.
Conor O'Brien

Baru saja mencoba, Runtime.exec () mengartikan itu sebagai mencoba mengeksekusi cmd/cmenghasilkan CreateProcess error=2. :(
F. George

2

8 , 24 16 12 byte

Direvisi setelah komentar Anders Tornblad.

con:size? .s

Mengembalikan ukuran konsol saat ini dalam baris dan kolom yang mencetak konten tumpukan.

Keluaran:

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

2
Karena pertanyaannya memungkinkan format output apa pun, apakah Anda benar-benar membutuhkannya swap?
Anders Tornblad

@Anders Tornblad - Terima kasih atas komentar bijak Anda. Saya memperbaiki kode saya.
Chaos Manor

2

Java + * nix, 113

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

Tidak Disatukan:

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

ProcessBuilder.inheritIOmenyebabkan input / output proses anak diwarisi; ini adalah default dalam C with exec. Di Jawa, defaultnya adalah "piped." Seperti yang Anda lihat, ini jauh lebih pendek daripada menggunakan Runtime.getRuntime().exec()(yang juga sudah usang) dan membangun BufferedReaderpanggilan yang panjang dan berbelit-belit yang merupakan hasil dari keengganan desainer Java API untuk menambah kelebihan demi kenyamanan.


Saya berharap ProcessBuilderakan bekerja pada Windows, tetapi modeperintah ini menghasilkan lebih dari 4 baris :(
F. George

1

Merah , 19 Bytes

system/console/size

Keluaran:

>> system/console/size
== 106x26

Bisa juga mendapatkan resolusi layar seperti pada pertanyaan sebelumnya


1

Commodore 64 BASIC, 7 byte

?"40x25

C64 memiliki konsol teks ukuran tetap 40 x 25 karakter. Tidak perlu meminta ukuran konsol, yang merupakan hal yang baik, karena tidak ada cara untuk menanyakannya.


Ini sepertinya curang, meskipun jujur, pertanyaannya (atau inspirasinya) tidak secara khusus melarangnya.
Cody Grey


1

Kotlin + Jline 2 , 58 byte

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

Karena mengapa tidak. Ternyata lib standar sebenarnya tidak memiliki cara untuk menentukan ukuran konsol sehingga diperlukan perpustakaan, jika Anda ingin emas meluncurkan proses lain dan mem-parsing aliran input ... akan memalukan jika seseorang melakukan itu ..


Jangan memasukkan dua jawaban dalam satu posting.
Adám

@ Adam Ini lebih merupakan renungan, jadi saya pikir tidak apa-apa. Anda memiliki cukup perwakilan untuk mengeditnya secara langsung, lakukan jika Anda benar-benar yakin 270b dengan batasan arbiter harus menjadi jawaban yang terpisah.
F. George

Setiap pengiriman bersaing dengan pengiriman lainnya dalam bahasa yang sama. Java secara inheren verbose, tetapi milik Anda adalah pengiriman Java yang terpendek (dan satu-satunya). Selain itu, sementara saya dapat mengedit posting Anda, saya tidak dapat memposting jawaban terpisah atas nama Anda.
Adám

Saya menyiratkan bahwa jika Anda menghapus jawaban Java saya, saya akan memposting ulang sendiri. Dan sementara Anda memiliki titik bahwa jawabannya saat ini adalah jawaban Java terpendek, itu dikodekan di bawah pembatasan tidak menggunakan perpustakaan eksternal. Untuk mengatasi argumen Anda, saya akan menandainya sebagai non-bersaing dan kode jawaban Jawa yang tepat nanti.
F. George

Posting sebagai Java (tanpa perpustakaan) dan buat kiriman lain yang disebut Java with… . Itu akan membuat Anda tiga suara positif dari saya.
Adám

1

Ditumpuk , 7 byte

termdim

Meninggalkan output pada stack, sebagaimana diizinkan per default. Contoh penggunaan:

λ stacked -pe "termdim"
(117 26)

Bonus: termdim'x'#`untuk memilikinya 117x26.


1

C (linux, C89 saja), 45 41

terinspirasi oleh https://codegolf.stackexchange.com/a/118696/42186 oleh @dieter

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

ini menampilkan ukuran sebagai data biner. Tidak yakin apakah ini dianggap sebagai "format apa pun". Anda membutuhkan sesuatu yang ekstra (kurang, hexdump, od, ascii table) (atau emulator terminal esoterik yang secara otomatis melakukan ini untuk Anda) untuk membuatnya dapat dibaca manusia. Contoh penggunaan:

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

Ukuran terminal adalah 204 cols dengan 58 baris.

Terima kasih kepada @ Random832 untuk menggunakan odalih-alih hexdump.


1
Saya pikir hex mendorongnya. Semua jawaban lain menggunakan desimal, jadi saya akan menambahkan persyaratan ini ke OP. Maaf.
Adám

1
od -s akan melakukannya dalam desimal dan lebih pendek dari hexdump
Random832

@ Random832 Keren, tidak tahu itu, +1! Tetapi jawaban ini menjadi tidak valid lagi, ketika aturan berubah dari "format apa saja" ke format yang sangat spesifik (seperti: basis 10 di ascii di emulator terminal arus utama)
mvds
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.