Konsol ölçülerimi söyle!


41

İkili ondalık sayı biçiminde çıktı terminal boyutları (sütunlar ve satırlar) *. Örneğin, bir çıktı olabilir 80x25.


İlham . İstemi .
* Çıktının art arda tek veya iki satırda hem ölçüsü olmalı, hem de birden fazla satır önde ve / veya son satırda çıktı olmayabilir (isteğe bağlı olarak yeni bir satır takip eder). (Dörde kadar) satırlar maksimum (sütunlar, 1 + len (str (sütunlar)) + len (str (satır))) 'den daha uzun olmamalıdır.


2
Hiç daha kısa, daha önce hiç bir oyu zorlanmış zorluk görmedim. Tebrikler!
Bay Xcoder

13
@ Mr.Xcoder Tek gömleklerde uzmanım…
Adám

Tek sıralı yayınlarda derece kazanmak üzeresiniz! Gerçekten de iyisin, hayır, bu konuda çok iyisin
:)

'tutarlı format' tam olarak ne anlama geliyor?
Felipe Nardi Batista

1
@FelipeNardiBatista Şimdilik evet diyeceğim, ancak bu saçmalıklara yol açarsa geri dönün.
Adám

Yanıtlar:


27

* sh, 9

stty size

Çıktı:

97 364

Ayrıca bash olarak çalışır.
numbermaniac

2
Veya posix benzeri bir sistemde başka bir kabuk.
mvds

1
Bu sitede görülen bazı dillerin isimleri göz önüne alındığında, burada * sh'ın "bash, zsh, csh, dash, vb." Anlamına geldiğini anlamak daha uzun sürer. adı yıldız ve ardından s ve h harflerini içeren bir dil yerine :-)
ShreevatsaR

Teknik olarak bir programı çalıştırmak için bir kabuğa bile ihtiyacınız yoktur. Yani shatama zaten gerçekten mantıklı değil.
mvds

20

8086 makine kodu, 11 bayt (işlev olarak, rakipsiz)

Görünür bir çıktısı olmadığı için gerçekten rekabet etmiyor. Bu sadece geçerli ekran boyutlarını bulmanın en kısa yolunu gösteriyor, baskı için gerekli kazan kodu olmadan.

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

Nasıl çalışır:

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 makine kodu, 48 bayt (tam bir program olarak)

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

Nasıl çalışır:

                |   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

Bir işlev gönderiminin bir ihtiyaç duyacağına eminim ret? Ayrıca, pelerin takılmasına izin verildiğinden emin değilim ds. İşlev, bir kereden fazla çalıştığından, yalnızca istenmeyen yan etkileri olduğundan, Meta'ya alınması gerekebilir.

Neden "yığın her zaman girişte 0 içerir"? Yığının sıfırlanacağı hiçbir kural bilmiyorum. Sanırım, dönüş değerini arttırmak ve 0 olacağını düşünmekten bahsediyorsun Bu bir COM ikili için garanti edilir mi?
Cody Gray,

@CodyGray: Bir COM programında, yığın başlangıçta PSP'nin başlangıcına yakın bir gösterici içerir (0 ofset), bu nedenle RET, EXIT'e bir çağrı içeren PSP: 0'a geri döner. stackoverflow.com/a/12593311/371250
ninjalj

Ah, açıklama için teşekkürler, @ ninjalj. (Bağladığınız harika cevap BTW. PSP ile ilgili tüm ayrıntılarını neredeyse tamamen unutmuştum. Uygulamasını yıllar önce tersine uyguladıysanız.) RETfonksiyonun sonunda talimatı kırarsanız ?
Cody Gray

@CodyGray: Programın INT 20h, RETPOPing'ten çıktıktan sonra RETartık tam olarak çalışmayacağından dolayı üzerinden değil, üzerinden geçtiğini not edersiniz .
ninjalj

18

Bash, 22 20 karakter

echo $COLUMNS $LINES

Sayesinde:

  • Optimum çıkış formatı için kapı kolu (2 karakter)

Örnek çalışma:

bash-4.3$ echo $COLUMNS $LINES
80 24

Sadece 1 bayt daha echo $COLUMNS\x$LINES, o / p80x24
Pandya

@Pandya Doğru, ama gerekli değil.
Adám

7
Bunun yeni çıktı formatı gereksinimlerine uyup uymadığından emin değilsiniz, ancak "bash: 90x50: command not found" ifadesi için $ COLUMNS \ x $ LINES olabilir. Bunun yerelleştirme ile de çalışmadığını veya bu komutun gerçekten mevcut olduğunu varsayalım
Muzer

14

xterm, 6 bayt

Belirli bir formata ihtiyacınız olmadığından, resize(6 karakter) komutunu kullanabilirsiniz xterm:

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

1
Güzel. Ancak, gibi standart bir başlık yazmak isteyebilirsiniz #xterm, 6 bytes.
Adám

@ Adám Bu tür çıktılar soruya göre kabul edilebilir mi?
Pandya


@ Adám tamam. Sadece başlık eklendi :)
Pandya

Bu, xterm'e özgü değildir. Ayrıca çıktının kabuğunuza bağlı olduğunu unutmayın.
celtschk

13

sh, 20 bayt

tput lines;tput cols

.. Çok açık, belki ..


3
tput kolonları; !: 0 cols
bash'ta

@marcos demek istiyorsun tput lines;!:0 cols, değil mi?
diyet

12

Python 3 , 30 bayt

import os
os.get_terminal_size

TIO'da çalışmadığı için orada bir alternatif kullanılmaktadır:

Çevrimiçi deneyin!


1
Neden sadece değil os?
Jonathan Allan,

2
... işletim sistemi nedeniyle TIO üzerinde çalışmaz, bu yüzden belirtmeniz gerekir. Bu does Windows üzerinde çalışmalarını. Ayrıca import osve os.daha kısa from....
Jonathan Allan

Pencere 10'da herhangi bir değişiklik yapmadan çalıştığını onaylayabilirim
Ferrybig

Mac üzerinde de çalışıyor
Bay Xcoder

1
Teknik Olarak Python 3.3+
17'de matsjoyce

11

C (sadece linux), 63 61

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

4
Sen değiştirerek iki bayt kazanabileceğini m[0]tarafından *m.
YSC

mAna bir argüman yaparak bir bayttan tasarruf edebilirsiniz :main(short m){ioctl(0,21523,&m);printf("%dx%d",m,(&m)[1]);}
mvds

main(int m){ioctl(0,21523,&m);printf("%x",m);}Tabanda (16) basılmış büyüklükte ve sütunlar ve sıralar arasında ayırıcı yok (olası sıfırlar dışında) olmayan 46 bayttır.
mvds


8

C #, 59 bayt

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

Func<int, stringBununla birlikte, a derlenir , giriş kullanılmaz.


Çalışmıyor; Bu, konsol standart girişinin ve çıkışının gerçekte bağlı olduğu boyutta değil, AllocConsole () çağrılırsa konsolun olacağını döndürür. Burada soru: stackoverflow.com/questions/35688348/… Soruyu sorduğumda tuttuğum şey aslında bir ssh boru hattına bağlı stdin ve stdout ile bir Windows ortamında çalışıyordum. Win32 ssh uygulaması gerekli sağlamaz.
Joshua

7

DüğümJS, 50 48 46 bayt

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

process.stdoutS columnsve rowsdeğerlerini kullanır .


Thanks @ETHproductions, konsola çıktısı için console.log eklendi :)
Pete TNT

Sorun değil :-) Çıktı herhangi bir tutarlı biçimde olabilir, bu yüzden birkaç bayttan tasarruf edebileceğinizi düşünüyorum console.log([s.columns,s.rows]).
ETHproductions

5
1 bayt kapalı:with(process.stdout)console.log(columns,rows)
Brian McCutchon

1
Ve birkaç (bu sayıları ise) kapalı bayt: with(process.stdout)write(columns+[rows]). Ya da sayılmazsa:with(process.stdout)write(columns+' '+rows)
markasoftware

1
@Markasoftware Ooh, bu zekice. Yine de, birincisinin sayması gerektiğini sanmıyorum.
Brian McCutchon

6

Ruby, 41 36 21 + 13 = 34 bayt

Komut satırı bayrağıyla çalıştır -rio/console

p IO.console.winsize

Bu benim ilk Ruby golf'üm, bu yüzden daha iyisini yapabileceğim bir şey varsa söyle.

SztupY sayesinde 5 bayt kurtarıldı

Manatwork sayesinde 2 bayt kurtarıldı


Bu, yükseklikten sonra genişlik ve uzunluk iki listesi olarak çıktı verir.

Örnek çıktı:

[25, 80]


Çevresindeki tek tırnak işaretlerine gerek yok, tırnak işaretleri io/consolebırakılmadığında kabuk üzerinde istenmeyen genişleme olmaz.
Manat çalışması

6

GNU İleri, 7 bayt

form .s

form - ucols gforth “form” ukullanır

Terminaldeki satır ve sütun sayısı.

Örnek çıktı

<2> 24 80

Çevrimiçi Deneyin!


4

C # 94 bayt (tüm uygulama)

MetaColon'un tüm uygulama yanıtı oldukça kısaltılabilir:

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

4

PowerShell + Modu, 11 Bayt?

Çıktı mevcut biçimde kabul edilemeyebilir.

modeKomut varsayılan bir windows aracı

Meta Mesaj kullanımına ilişkin modebelirlemedencon

(mode)[3,4]

modun çıktısını alır:

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

daha sonra 4. ve 5. satırların ( [3,4]) çıktısı:

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

İki bayttan (mode)[3,4]-replace"\D"
tasarruf edin

Bunun burada çalışması için kullanmam gerekiyor(mode con)[3..4]
Felipe Nardi Batista

Ah @FelipeNardiBatista, muhtemelen ihtiyacınız olan doğru.
Adám

1
@FelipeNardiBatista congerekli mi? Bu kesinlikle ilk satırları alır ve conher zaman ilk olduğuna inanıyorum ? Bir standardsistemin de mod için sadece bir çıktısı olacağını söyleyebilirim.
colsw

1
@ConnorLSW Sadece sistemim iyi çalışıyor, ancak cevabınız burada işe yaramıyor
Felipe Nardi Batista

4

Swift, 99 bayt

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

Konsol paketi için Vapor'daki adamlara teşekkürler .


3

Toplu iş, 25 19 18 17 bayt

Doğrudan "find" komutuna bağlayarak 6 bayt kaydedildi. Adám / OP
sayesinde 1 bayt kaydedildi . OP tarafından yapılan yorum sayesinde 1 byte kaydedildi .

mode con|find "n"

Bu, echo açık olduğundan komutun çıktısını alır, ancak OP tarafından yorumlandığı gibi , öncü bir satır tamamdır.


Kurulumunuza bağlı olarak, yalnızca 13 bayt ile çalışabilir. Bununla birlikte, COM portlarını kullanarak herhangi bir şeye sahip olmanın aşırı ayrıntılı çıktıya neden olacağı görülüyor.

mode|find "n"

Bir baytı kaydedin s:n.
Adám

1
@FelipeNardiBatista Evet, ve benim diyor ki 9001 satırım var. Bu sadece bir ayar: Özellikler> Düzen> Ekran Tampon Boyutu.
Adám

@FelipeNardiBatista Windows konsolu boyutları, pencere boyutları ile aynı değildir. Bu yüzden pencereyi küçültürken kaydırma çubukları ortaya çıkar. OP başına , bu kesin çözüm tamam.
Mühendis Toast,

@ Adám Dangit, daha kısa bir dize aradım ve nasıl gözardı ettiğimi bilmiyorum. Muhtemelen bununla başladım çünkü mode'con' eklemenin iki farklı karakter kümesini aramaktan daha kısa olduğunu öğrendim findstr.
Mühendis Toast,

Adam Dayalı @ Yorumlarınız , bu geçerli olacaktır: @mode|find "L" /i? Yukarıdaki 18 yerine 17 bayt olan Çizgiler, Sütunlar ve Klavye Gecikmesini döndürür. Öndeki / sondaki çizgilerin boş olması gerekiyor mu?
Mühendis Toast,

3

C #, 85 Bayt

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

Tüm bir uygulama kodunu istiyorsanız, 115 101 94 Bayt değerine sahip oluruz :

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

Ancak Arabellek boyutu da olabilir , yine 85 Byte olur

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

Veya bütün bir uygulama kodu olarak (tabii ki tekrar 115 101 94 Bayt ):

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

Tüm uygulama kodunda Caius Jard yardımı ile 14 bayt kurtarıldı


1
104 bytes tüm uygulama, belki de mantığınızı diğer varyasyonlarınız için uzatabilirsiniz:using c=System.Console;class P{static void Main(){c.WriteLine(c.WindowWidth);c.Write(c.WindowHeight);}}
Caius Jard

(Daha kısa bir cevabım varsa nasıl golf oynayacağımdan emin değilim; seninkileri düzenleyebilir, seninkileri yorumlayabilir veya kendi
mesajımı

@CaiusJard Kendi cevabınızı gönderebilir veya bir iyileştirme hakkında yorum yapabilir ve cevaplayıcıyı dahil etmek isteyip istemediklerine karar vermesine izin verebilirsiniz.
TheLethalCoder

İstedim, zaman içinde yorumumu düzenleyemedim ... Kendi cevabımı (buna dahil) neredeyse eşzamanlı olarak yazdım, bu yüzden ilhamını almayacağım. Aslında bütün bir uygulama yerine yanıtı döndüren bir işlev yazmanın hile yapıp yapmadığına emin değilim - diğer tüm cevaplar hemen hemen tüm bir uygulamadır, ancak CSharppPad.com "tek işlev" sürümünüzü kabul eder ve koşun .. sanırım golf ile ilgili kuralları aramalıyım
Caius Jard

@CaiusJard Mücadelenin kendisinde açıkça izin verilmediği sürece fonksiyonlara / yöntemlere izin verilir. Bu nedenle, adsız bir işlev iyi durumda, iyi çalışan bir sürüm için cevabımı görün.
TheLethalCoder

2

Java 8 (kitaplık yok), Windows, 270 bayt

Adem'in tavsiyesi ile ayrı ayrı gönderim.

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

Deneyin cmd/c modeyerine cmd /c mode.
Conor O'Brien,

Yürütmeye çalışırken olarak sadece çalıştı, Runtime.exec () yorumlayıp cmd/csonuçlanan CreateProcess error=2. :(
F. George

2

8 , 24 16 12 bayt

Anders Tornblad'ın yorumundan sonra revize edildi.

con:size? .s

Konsolun geçerli boyutunu, yığın içeriğini basan satır ve sütunlarda döndürür.

Çıktı:

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

2
Soru herhangi bir çıktı biçimine izin verdiğinden, gerçekten ihtiyacınız var swapmı?
Anders Tornblad

@Anders Tornblad - Bilge yorumunuz için teşekkür ederiz. Kodumu geliştirdim.
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.inheritIObir alt işlem giriş / çıkışının kalıtımsal olmasına neden olur; Bu, C ile varsayılan değerdir exec. Java'da varsayılan "piped" dir. Gördüğünüz gibi, bu, Runtime.getRuntime().exec()kullanımdan (aynı zamanda kullanımdan kaldırılmış) ve BufferedReaderJava API tasarımcılarının kolaylık sağlamak için aşırı yükleme yapma konusundaki bariz isteksizliğinin bir sonucu olan uzun ve karmaşık bir arama yoluyla yapılan aramadan çok daha kısadır .


Keşke ProcessBuilderWindows üzerinde çalışsa da modekomut 4 satırdan fazla çıktı
F. George

1

Kırmızı , 19 Bayt

system/console/size

Çıktı:

>> system/console/size
== 106x26

Önceki sorudaki gibi ekran çözünürlüğünü de alabilir


1

Commodore 64 BASIC, 7 bayt

?"40x25

C64, 40 x 25 karakterden oluşan, sabit boyutlu bir metin konsoluna sahiptir. Sorgulamanın bir yolu olmadığından iyi bir şey olan konsol boyutunu sorgulamak gerekmez.


Bu, hile yapmak gibi görünüyor, adil olmakla birlikte, soru (ya da ilham kaynağı) bunu özellikle yasaklamıyor.
Cody Gray


1

Kotlin + Jline 2 , 58 bayt

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

Çünkü neden olmasın. Standart lib'in aslında konsol boyutunu belirlemenin bir yolu olmadığı için , bir kütüphaneyi çekmek gerekir; başka bir işlemi başlatmak ve girdi akışını ayrıştırmak istemeniz gerekebilir ... durumunda birileri bunu yaparsa utanç verici olur.


Bir yazıya iki cevap koymayın.
Adám

@ Adám Daha sonra bir düşünce, bu yüzden bence iyi. Doğrudan düzenlemek için yeterli sayıda temsilciniz var, bunu yapmak için, gerçekten kısıtlayıcı olan bir 270b'nin ayrı bir cevap olması gerektiğine inanıyorsanız yapın.
F. George

Her gönderim aynı dilde diğer gönderilere karşı yarışır. Java doğal olarak ayrıntılı, ancak sizinki en kısa (ve sadece) Java gönderimidir. Ayrıca, gönderinizi düzenleyebildiğim halde adınıza ayrı bir cevap gönderemiyorum.
Adám

Java cevabımı kaldırırsanız, kendim yeniden göndereceğimi ima ediyordum. Cevabın şu anda en kısa Java cevabı olduğuna dair bir noktanız varken, hiçbir harici kütüphane kullanma kısıtlaması altında kodlanmıştır. Argümanınızı ele almak için, bunu rakipsiz olarak işaretleyeceğim ve daha sonra uygun bir Java cevabını kodlayacağım.
F. George

Java olarak yayınlayın (kitaplık yok) ve … ile Java adında başka bir sunum yapın . Bu sana benden üç puan kazandıracak.
Adám

1

Yığılmış , 7 bayt

termdim

Varsayılan olarak izin verildiği gibi istifte çıktı bırakır. Örnek kullanım:

λ stacked -pe "termdim"
(117 26)

Bonus: termdim'x'#`sahip olmak 117x26.


1

C (linux, sadece C89), 45 41

@dieter tarafından https://codegolf.stackexchange.com/a/118696/42186 tarafından ilham alındı

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

bu, boyutu ikili veri olarak verir. Bu "herhangi bir biçim" olarak sayılır emin değil. İnsan tarafından okunabilmesi için fazladan bir şey (daha az, hexdump, od, ascii tablosu) (veya bunu sizin için otomatik olarak yapan bir ezoterik terminal emülatörü) gerekir. Örnek kullanım:

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

Terminal boyutu, 58 sıra ile 204 sıradır.

odBunun yerine kullanmak için @ Random832 teşekkürler hexdump.


1
Bence Hex onu zorluyor. Diğer tüm cevaplar ondalık kullanır, bu yüzden OP için bu gereksinimi ekleyeceğim. Üzgünüm.
Adám

1
od -s ondalık basamakta yapacak ve
hexdump'tan

@ Random832 Cool, bunu bilmiyordum, +1! Ancak bu cevap, kurallar “herhangi bir formattan” çok spesifik bir formata değiştiğinde (şunun gibi bir şey:
ascii'de
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.