Simulasikan Cisco Ping

8

Tempat:

Bagi mereka yang berada dalam jaringan, kemungkinan besar Anda telah mengirim ping ke atau dari beberapa perangkat untuk memastikan semuanya terhubung dengan benar. Cisco, sebuah perusahaan populer di jaringan [rujukan?] , Memiliki perintah untuk itu di iOS mereka yang terlihat seperti ini:

Menangkap

( Sumber gambar )

Tantangan Anda adalah membuat ulang sebagian dari gambar ini. Bagian yang kita lewati adalah baris pertama ( Type escape sequence to abort.) seluruhnya, bersama dengan alamat IP dan waktu pulang-pergi.

Anda akan mulai dengan mengeluarkan yang berikut:

Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:

Anda kemudian akan mensimulasikan permintaan gema keluar. Setiap permintaan akan mulai dengan menunggu 2 detik dan kemudian menghasilkan respons. Respons gema yang berhasil diwakili oleh a! , yang gagal oleh .. Kami tidak akan benar-benar mengirim paket tetapi untuk mewakili kehilangan paket, program Anda harus secara acak memilih antara dua opsi dengan peluang yang tidak nol untuk masing-masing paket. Baris ini akan mulai kosong dan setiap centang akan menambahkan karakter lain.

Setelah gema kelima, garis persentase akan dikeluarkan dan program kemudian harus berakhir. Baris persentase akan dalam format

Success rate is $p percent ($s/5)

di mana $pdi regex 0|20|40|60|80|100dan $sjumlah gema yang sukses. Layar harus diperbarui setelah setiap periode tunggu dengan menggambar ulang negara baru atau menambahkan ke garis gema yang ada. Ini termasukSending garis.

Contoh dijalankan: (Jumlah centang tidak boleh ditampilkan dan ada untuk memperjelas seperti apa tampilan pada setiap langkah waktu)

#Tick 0
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:

#Tick 1
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
.

#Tick 2
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
.!

#Tick 3
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
.!.

#Tick 4
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
.!.!

#Tick 5
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
.!.!.
Success rate is 40 percent (2/5)

Memasukkan:

Tidak ada input yang dapat digunakan disediakan.

Keluaran:

Format apa pun yang masuk akal. Contoh hasil akhir terlihat seperti ini:

Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
...!!
Success rate is 40 percent (2/5)    

Aturan:

  • Anda harus menambahkan ke garis gema atau menggambar ulang layar setelah setiap centang.
  • !dan .tidak harus memiliki kemungkinan yang sama, hanya keduanya mungkin.
  • Berjalan berturut-turut harus dapat menghasilkan hasil yang berbeda
  • Gif atau webms dari output Anda akan menjadi keren. Tidak ada bonus atau apapun untuk itu.
  • Standar Lubang terlarang
  • Ini adalah
Veskah
sumber
Apakah kita diizinkan untuk mencetak string dengan spasi tambahan jika hasilnya secara visual sama?
J. Sallé
Haruskah baris terakhir diakhiri oleh linefeed?
@Rogem Ini opsional.
Veskah

Jawaban:

5

C (gcc) , 172 byte

Jadi, saya mencukur 6 byte kekalahan dari hal ini dengan beberapa tipuan yang cukup konyol. Kompilasi dengan -DK=!sleep(2)-putchar(rand()%2?33:46)/46. Tergantung pada sleep()fungsi yang didefinisikan dalam pustaka standar sistem. Tidak berulang atau berulang.

p(n){puts("Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:");printf("\nSuccess rate is %i percent (%i/5)",n*20,n=K+K+K+K+K);}

Cobalah online!

Penjelasan

Solusi ini tergantung pada tiga detail implementasi / runtime yang penting. Pertama, sleep() jangan sampai terputus , misalnya melalui sinyal. Kedua, penambahan dan pengurangan diselesaikan secara berurutan dari kiri ke kanan. Ketiga, argumen untukprintf() harus diselesaikan dari kanan ke kiri.

Dengan itu, mari kita selidiki hal ini.

p(n){ // Unfortunately, I need a variable to store the RNG result.
    // This is straight-forward printing of a line.
    puts("Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:");
    // So, resolving right-to-left, we have a) the K preprocessor macros,
    // b) the assigment of their sum to n, c) the percentage equivalent of
    // the fraction n/5 and d) a constant format string.
    // The summation of the K's is where the magic happens.
    printf("\nSuccess rate is %i percent (%i/5)",n*20,n=K+K+K+K+K);
}

Argumen kompiler

-DK=!sleep(2)-putchar(rand()%2?33:46)/46

Jadi, mulai dari kiri (yaitu seperti itu harus menyelesaikan), kita miliki sleep(). sleep()mengembalikan jumlah detik yang tersisa saat kembali, jadi kami berharap pengguna (dan proses lainnya) ramah dan tidak mengganggu tidur kami. Kami mengambil pelengkap logis, dan karena dalam kasus kami sleep()akan selalu kembali 0, hasilnya adalah 1. Lebih lanjut tentang pentingnya nanti.

Selanjutnya, kita masuk putchar(). putchar()mencetak karakter 1-byte tunggal, dan mengembalikan nilai byte. Jadi, kita mendapatkan nilai acak di dalamnya, menghitung modulo-2 untuk pemisahan 50-50 yang bagus (meskipun dengan entropi mengerikan), dan kemudian ternary-kondisikan ke dalam karakter yang kita inginkan - ! (33) dan . (46). Kemudian kami membagi nilai kembali putchar()dengan46 .

Sekarang, pembagian itu akan kembali 0untuk !dan 1untuk .- jadi kami mengambil 1 (dari !sleep()) dan mengurangi hasil pembagian itu. Presto!

Oke, ada sedikit masalah. Ketika Anda menulis sesuatu ke buffer di C (yaitu stdout), itu tidak harus menulis ke penerima segera. Bahkan, ketika saya menjalankan ini pada distro pilihan saya, saya menemukan bahwa itu hanya akan mencetak ping setelah program dihentikan. Namun, mengingat bahwa semua solusi lain dalam C membiarkan slide itu, dan bahwa mungkin ada setidaknya satu mesin di luar sana melakukan itu dan memenuhi semua prasyarat lainnya (dan orang selalu bisa "memperbaiki" itu di kernel .. .), Saya tidak akan mengacaukan skor saya dengan fflush()ing stdout.


sumber
4

APL (Dyalog Unicode) , 147 138 byte

{5=≢⍵⊣⎕DL≢⎕←↑⌽'.!'[⍵]'Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:':⎕←('Success rate is',×∘20,'percent (','/5)',⍨⍕)+/⍵}¨1↓¨,\?62

Cobalah online!

Ini adalah fungsi langsung yang besar. Seperti jawaban lainnya, tautan TIO hanya akan ditampilkan setelah eksekusi selesai. Yang mengatakan, @ Adám telah menciptakan fungsi pembantu yang berguna sehingga cap waktu dapat divisualisasikan. Versi kode itu dapat ditemukan di sini .

Jawaban ini menggunakan ⎕IO←0, yang menetapkan rigid I ndex O segalanya mulai dari 1 hingga 0.

Terima kasih kepada @ngn untuk 9 byte yang disimpan (dan telah merusak penjelasan saya! Sekarang saya harus melakukannya lagi (ლಠ益ಠ)ლ)

Bagaimana:

Fungsi menerima 1 argumen tetap, yaitu di sebelah kanan.

Seperti yang kita miliki ¨1↓¨,\?6⍴2. Ungkapan ini secara acak memilih ( ?) antara 0 dan 1 6 kali ( 6⍴2menciptakan vektor 6 elemen dari 2's). Hasilnya digabungkan ( ,\) untuk membentuk 6 elemen vektor dari 1 hingga 6 vektor elemen (misalnya:) 1 0 1 0 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 1 0. Elemen pertama dari masing-masing dijatuhkan ( 1↓¨), dan kemudian setiap vektor yang dihasilkan dilewatkan sebagai ( ¨), menjalankan fungsi 6 kali.

{5=≢⍵⊣...:...}adalah pernyataan kondisional. Jika memiliki 5 elemen (alias jika iterasi terakhir), ia akan mengeksekusi kode setelah penjaga ( :). The menjamin kondisi ini akan menjadi hal terakhir dievaluasi, sehingga program akan selalu mencetak string sebelum penjaga.

{...⎕DL≢⎕←↑⌽'.!'[⍵]'Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:'...}menciptakan vektor dua elemen yang dibentuk oleh vektor yang diindeks '.!'[⍵], yang akan menampilkan keberhasilan dan kegagalan, dan string ping itu sendiri. Vektor itu kemudian dibalik (monadik ) ke urutan yang benar, kemudian dicampur (monadik ) ke dalam matriks. Matriks itu kemudian di-output ke stdout ( ⎕←), dan D e L ay ( ⎕DL) ditambahkan. Argumen untuk ⎕DLadalah jumlah elemen dalam matriks ( ), yaitu 2, menciptakan penundaan 2 detik antara panggilan fungsi.

{...:⎕←('Success rate is',×∘20,'percent (','/5)',⍨⍕)+/⍵}menciptakan string terakhir yang akan di-output. Ini akan menjumlahkan elemen argumen ( +/⍵) dan meneruskan hasilnya sebagai argumen ke fungsi diam-diam di dalam tanda kurung. Fungsi itu pertama-tama menambahkan (diad ,, diikuti oleh ) argumen stringified ( ) dengan string '/5)', kemudian menambahkannya ke string 'percent ('. Selanjutnya, itu akan menambahkan string yang dihasilkan hingga 20 kali argumen ( ×∘20), dan kemudian menambahkannya ke sisa output, yang dikirim ke stdout via ⎕←.

J. Sallé
sumber
Mengejar baris baru baik-baik saja. Mengomentari di sini karena saya menggunakan ponsel
Veskah
⎕DL 2⊣⎕←... -> ⎕DL≢⎕←...
ngn
3

Java (JDK) , 227 byte

()->{var o=System.out;int s=0,i=0;for(o.println("Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:");i++<5;Thread.sleep(2000))o.print(Math.random()>.5&&s++<9?"!":".");o.printf("\nSuccess rate is %d percent (%d/5)",s*20,s);}

Cobalah online!


Ping beraksi

Ping beraksi


Dijelaskan

()->{                               // Lambda taking no input
    var o=System.out;               // Assign System.out to a variable
    int s=0,i=0;                    // Initialise successes and loop ints
    for(o.println("Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:");
                                    // ^Print opening line
        i++<5;                      // Loop five times
        Thread.sleep(2000))         // Sleep for 2 seconds at the end of each loop
            o.print(                // Print out..
                Math.random()>.5    // ..if random number is greater than .5 (50%)
                    &&s++<9?        // ..and incremented successes 
                        "!":".");   // ! for success and . for failure
    o.printf("\nSuccess rate is %d percent (%d/5)",s*20,s);
                                    //^Print formatted closing line
}
Luke Stevens
sumber
percetakan adalah pembunuh di sana: /
Adam
3

C # (Visual C # Interactive Compiler) , 212 byte

int i,p;for(Write("Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:\n");i++<5;Write(".!"[-p+(p+=new Random().Next(2))]))System.Threading.Thread.Sleep(2000);Write($"\nSuccess Rate is {p*20} percent ({p}/5)");

Cobalah online!

Perwujudan Ketidaktahuan
sumber
2
Selamat datang di PPCG! Saya mengambil kebebasan untuk membuat Try It Online! tautan untuk Anda. Saya sarankan Anda mengedit jawaban Anda dengan template yang disediakan TIO untuk memposting jawaban di PPCG (meskipun itu tidak diharuskan ).
J. Sallé
Anda bisa mendapatkan ini hingga 299 byte dengan membangun inline Randomalih-alih menyimpannya var r. Inilah tautan ke saran saya
Robin B
Ini terus menabrak IndexOutOfBoundsExceptions untuk saya.
kata ganti saya adalah monicareinstate
@mypronounismonicareinstate Diperbaiki. Bagaimana saya tidak menangkap ini bulan lalu?
Perwujudan Ketidaktahuan
2

JavaScript + HTML, 203 + 9 = 212 byte

<pre id=o
f=(x,y=0,g=z=>setTimeout(f,2e3,-~x,y+z),u=s=>o.innerText+=s)=>x?x<6?u(`.!`[n=new Date%2],g(n)):u(`
Success rate is ${y/20} percent (${y}/5)`):u`Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:`&g(0)

Cobalah

Jika new Datetidak cukup acak maka tambahkan 8 byte untuk digunakan Math.random()sebagai gantinya (beberapa modifikasi lain telah dibuat untuk memungkinkannya untuk berjalan dengan baik dalam Cuplikan):

Shaggy
sumber
2

PowerShell , 166 162 158 byte

'Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:'
0..4|%{sleep 2;write-host -no '.!'[($x=0,1|Random)];$d+=$x}
"
Success rate is $($d*20) percent ($d/5)"

Cobalah online!

Sangat mirip dengan jawaban Python untuk TFeld. Pengaturan waktu tidak berfungsi pada TIO (TIO hanya menghasilkan pada saat penyelesaian program), tetapi bekerja secara lokal.

Baris pertama hanyalah sebuah string yang diletakkan di atas pipa. Garis tengah loop dari 0ke 4, setiap iterasi sleepselama 2detik, kemudian write-hostdengan -nobaris baru. Kami sedang menulis baik a !atau .dipilih Randomdan disimpan $x. Kami kemudian meningkat $dberdasarkan pada $x.

Baris terakhir adalah string (multiline) lain yang ditempatkan pada pipeline, dengan sedikit perhitungan di tengah untuk menghasilkan persentase.

-1 byte terima kasih kepada Veskah
-3 byte terima kasih untuk Ciaran_McCarthy

AdmBorkBork
sumber
Mengubah garis sukses menjadi string multi-baris alih-alih menggunakan back-tick n (tidak tahu bagaimana cara menghindarinya dalam komentar) harus menyimpan byte. 161 byte
Veskah
1
Dapatkah Anda mencukur habis 3 byte dari menggunakan *20bukan /5*100?
Ciaran_McCarthy
@ Veska Ya, terima kasih.
AdmBorkBork
@Ciaran_McCarthy Sapi suci, terima kasih untuk golf yang sangat menyilaukan ini. :)
AdmBorkBork
1

Python 3 , 221 220 216 209 208 201 byte

import time,random
p=print
p('Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:')
n=0
exec("time.sleep(2);i=random.choice('.!');n+=i<'#';p(end=i);"*5)
p(f'\nSuccess rate is {n*20} percent ({n}/5)')

Cobalah online!

Pengaturan waktu tidak berfungsi di TIO, tetapi bekerja di konsol. (Output TIO pada akhir eksekusi)

-7 byte, terima kasih kepada Erik the Outgolfer

TFeld
sumber
201 byte .
Erik the Outgolfer
@EriktheOutgolfer Terima kasih! :)
TFeld
1

JavaScript, 322 268 267 265 byte

(f=(a,t,s)=>a--?new Promise(r=>setTimeout(r,2e3,s+='!.'[~~(Math.random()<.5)],t(`Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:`))).then(_=>t(s)||f(a,t,s)):t(`Success rate is ${s=s.match(/!/g),s=s?s.length*2:''}0 percent (${s/2}/5)`))(5,_=>console.log(_),'')

Cobalah online!

JavaScript + HTML, 299 byte

Untuk memenuhi persyaratan pemformatan output

(f=(a,t,s)=>a--?new Promise(r=>setTimeout(r,2e3,s+='!.'[~~(Math.random()<.5)])).then(_=>t(...s)&&f(a,t,s)):t(`\nSuccess rate is ${s=s.match(/!/g),s=s?s.length*2:''}0 percent (${s/2}/5)`))(5,t=(..._)=>p.innerHTML+=_.pop(),'',t(`Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:\n`))
<pre id=p></pre>

guest271314
sumber
1

Bersihkan , 305 byte

import StdEnv,Math.Random
s::!Int->Int
s _=code {
ccall sleep "I:I"
}
t::!Int->Int
t _=code {
ccall time "I:I"
}
Start#l=take 5(map((bitand)1)(genRandInt(t 0)))
=("Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:\n",[if(e>0)'!''.'\\e<-l|s 2==0],"\nSuccess rate is ",20*sum l," percent (",sum l,"/5)")

Cobalah online!

Suram
sumber
1

Perl 6 , 154 byte

say "Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:";say
sum(map {sleep 2;.print;?/\!/},roll
5,<. !>).&{"\nSuccess rate is {$_*20} percent ($_/5)"}

Cobalah online!

Sean
sumber
1

PHP , 161 byte

<?="Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
";for(;$x++<5;print$y?'!':'.')$z+=$y=rand()%2+sleep(2);echo"
Success rate is ",$z*20," percent ($z/5)";

Cobalah online!

$ php fakeping.php

Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
.!.!.
Success rate is 40 percent (2/5)
640KB
sumber
1

C (gcc) , 176 174 byte

f(i,j){for(puts("Sending 5, 100-byte ICMP Echos, timeout is 2 seconds"),j=i=5;sleep(2),i--;putchar(rand()%2?j--,33:46));printf("\nSuccess rate is %d percent (%d/5)",j*20,j);}

Cobalah online!

Disimpan 2 byte berkat Rogem

Tidak Disatukan:

f(i,j) {
    for (puts("Sending 5, 100-byte ICMP Echos, timeout is 2 seconds"),
            j = i = 5; sleep(0), i--;
            putchar(rand() % 2 ? j--, 33 : 46));
    printf("\nSuccess rate is %d percent (%d/5)",j * 20, j);
}
qookie
sumber
174 dengan 33dan 46bukannya '!'dan '.', masing-masing.
1

05AB1E , 83 byte

т’Sïà 5, ÿ-ÄÁ ICMP ®Ès, €º€Ä is 2 šÀ:’,„.!5ãΩDv.Z.Zy?}õ,'.¢xT*“íÞ„¼€ˆ ÿ‰» (ÿ/5)“.ª?

Cobalah online!

Grimmy
sumber
1

Befunge-98 (PyFunge) , 164 byte

#va":sdnoces 2 si tuoemit ,sohcE PMCI etyb-001 ,5 gnidneS5"k,>0"2 peels"=k
>?1'!>,+\1+:4`!jv\'^'=1p
;>0'.^;")5/",,,@>$" si etar sseccuS"afk,,:2a**.'0+"( tnecrep"9k,

Cobalah online!

Sayangnya, saya hanya bisa mengujinya di TIO, di mana ia mengembalikan semuanya setelah sepuluh detik, tetapi harus berfungsi seperti yang diharapkan.

David
sumber