Mô phỏng Cisco Ping


8

Tiền đề:

Đối với những người trong mạng, rất có thể bạn đã gửi ping đến hoặc từ một số thiết bị để đảm bảo mọi thứ được kết nối đúng cách. Cisco, một công ty nổi tiếng về kết nối mạng [cần dẫn nguồn] , có một lệnh cho nó trong IOS của họ trông như thế này:

Chiếm lấy

( Nguồn hình ảnh )

Thách thức của bạn là tái tạo đồ họa một phần của điều này. Các phần chúng tôi đang bỏ qua Type escape sequence to abort.hoàn toàn là dòng đầu tiên ( ), cùng với địa chỉ IP và thời gian khứ hồi.

Bạn sẽ bắt đầu bằng cách xuất ra những điều sau đây:

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

Sau đó, bạn sẽ mô phỏng các yêu cầu echo đi ra ngoài. Mỗi yêu cầu sẽ bắt đầu bằng cách đợi 2 giây và sau đó tạo phản hồi. Một phản hồi tiếng vang thành công được đại diện bởi một !, một thất bại bởi .. Chúng tôi thực sự sẽ không gửi các gói nhưng để thể hiện mất gói, chương trình của bạn phải chọn ngẫu nhiên giữa hai tùy chọn với cơ hội khác không cho mỗi gói. Dòng này sẽ bắt đầu trống và mỗi đánh dấu sẽ thêm một ký tự khác.

Sau tiếng vang thứ năm, dòng phần trăm sẽ được xuất ra và chương trình sẽ kết thúc. Dòng phần trăm sẽ ở định dạng

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

trong đó $plà trong regex 0|20|40|60|80|100$slà số lượng vang thành công. Màn hình phải được cập nhật sau mỗi khoảng thời gian chờ bằng cách vẽ lại trạng thái mới hoặc nối thêm vào dòng echo hiện có. Điều này bao gồm các Sendingdòng.

Chạy ví dụ: (Không nên hiển thị số lượng đánh dấu và có để làm rõ đầu ra sẽ như thế nào ở mỗi bước thời gian)

#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)

Đầu vào:

Không có đầu vào có thể sử dụng được cung cấp.

Đầu ra:

Bất kỳ định dạng hợp lý. Một ví dụ đầu ra cuối cùng trông như thế này:

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

Quy tắc:

  • Bạn phải nối vào dòng echo hoặc vẽ lại màn hình sau mỗi lần đánh dấu.
  • !.không cần phải có khả năng như nhau, chỉ cần cả hai có thể.
  • Chạy liên tiếp phải có thể tạo ra kết quả khác nhau
  • Gifs hoặc webms của đầu ra của bạn sẽ được mát mẻ. Không có tiền thưởng hoặc bất cứ điều gì cho nó mặc dù.
  • Lỗ hổng tiêu chuẩn bị cấm
  • Đây là

Chúng ta có được phép in các chuỗi có dấu cách không nếu đầu ra giống nhau không?
J. Sallé

Dòng cuối cùng có nên được chấm dứt bởi một nguồn cấp dữ liệu?

@Rogem Đó là tùy chọn.
Veskah

Câu trả lời:


5

C (gcc) , 172 byte

Vì vậy, tôi đã loại bỏ 6 byte khỏi thứ này bằng một số mánh khóe khá lố bịch. Biên dịch với -DK=!sleep(2)-putchar(rand()%2?33:46)/46. Phụ thuộc vào sleep()chức năng được xác định trong các thư viện tiêu chuẩn hệ thống. Không lặp hoặc lặp lại.

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

Hãy thử trực tuyến!

Giải trình

Giải pháp này phụ thuộc vào ba chi tiết thực hiện / thời gian chạy quan trọng. Đầu tiên, sleep() không được ngắt , thông qua một tín hiệu. Thứ hai, các phép cộng và phép trừ được giải quyết theo thứ tự từ trái sang phải. Thứ ba, các đối số printf()phải được giải quyết từ phải sang trái.

Với cách đó, hãy sắp xếp thứ này.

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

Đối số trình biên dịch

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

Vì vậy, bắt đầu từ bên trái (nghĩa là nó sẽ giải quyết), chúng ta có sleep(). sleep()trả về số giây còn lại khi trả về, vì vậy chúng tôi hy vọng người dùng (và các quy trình khác) sẽ tử tế và không làm gián đoạn giấc ngủ của chúng tôi. Chúng tôi có bổ sung hợp lý, và vì trong trường hợp của chúng tôi sleep()sẽ luôn trả về 0, kết quả là 1. Thêm về ý nghĩa sau này.

Tiếp theo, chúng tôi nhập putchar(). putchar()in một ký tự 1 byte đơn và trả về giá trị của byte. Vì vậy, chúng tôi nhận được một giá trị ngẫu nhiên bên trong, tính toán modulo-2 cho một phân chia 50-50 đẹp mắt (mặc dù với entropy khủng khiếp), và sau đó điều kiện hóa nó thành các ký tự mong muốn của chúng tôi - ! (33). (46). Sau đó, chúng tôi chia giá trị trả về của putchar()với 46.

Bây giờ, bộ phận đó sẽ trở lại 0cho !1cho .- vì vậy chúng tôi mất 1 (từ !sleep()) và trừ các kết quả của sự phân chia từ đó. Mau!

Được rồi, có một vấn đề nhỏ. Khi bạn viết mọi thứ vào một bộ đệm trong C (tức là stdout), nó không nhất thiết phải ghi vào đầu nhận ngay lập tức. Trong thực tế, khi tôi đang chạy cái này trên bản phân phối của mình, tôi phát hiện ra rằng nó sẽ chỉ in các lệnh ping sau khi chương trình kết thúc. Tuy nhiên, cho rằng tất cả các khác các giải pháp trong C được cho phép trượt đó, và rằng có lẽ tồn tại ít nhất một máy đâu đó ngoài kia làm và đáp ứng tất cả các điều kiện tiên quyết khác (và người ta có thể luôn luôn chỉ là "sửa chữa" rằng trong hạt nhân .. .), Tôi sẽ không gây rối với điểm số của mình bằng fflush()ing stdout.


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

Hãy thử trực tuyến!

Đây là một chức năng trực tiếp lớn. Cũng như các câu trả lời khác, liên kết TIO sẽ chỉ xuất ra sau khi thực hiện xong. Điều đó nói rằng, @ Adám đã tạo ra một chức năng trợ giúp tiện dụng để dấu thời gian có thể được hiển thị. Phiên bản của mã có thể được tìm thấy ở đây .

Câu trả lời này sử dụng ⎕IO←0, trong đó đặt I ndex O rigin của mọi thứ từ 1 đến 0.

Cảm ơn @ngn vì đã lưu 9 byte (và đã phá hỏng lời giải thích của tôi! Bây giờ tôi phải làm lại (ლಠ益ಠ)ლ)

Làm sao:

Hàm nhận được 1 đối số cố định, nằm ở bên phải.

Như , chúng ta có ¨1↓¨,\?6⍴2. Biểu thức này chọn ngẫu nhiên ( ?) trong khoảng từ 0 đến 1 6 lần ( 6⍴2tạo ra một vectơ 6 phần tử là 2). Các kết quả được nối ( ,\) để tạo thành một vectơ 6 phần tử của 1 đến 6 vectơ phần tử (ví dụ 1 0 1 0 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 1 0:). Phần tử đầu tiên của mỗi được loại bỏ ( 1↓¨) và sau đó mỗi vectơ kết quả được truyền dưới dạng ( ¨), chạy hàm 6 lần.

{5=≢⍵⊣...:...}là một tuyên bố có điều kiện. Nếu có 5 phần tử (còn gọi là lần lặp cuối cùng), nó sẽ thực thi mã sau bộ bảo vệ ( :). Các đảm bảo điều kiện sẽ là điều cuối cùng được đánh giá, vì vậy chương trình sẽ luôn in chuỗi trước người bảo vệ.

{...⎕DL≢⎕←↑⌽'.!'[⍵]'Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:'...}tạo ra một vectơ hai phần tử được hình thành bởi vectơ được lập chỉ mục '.!'[⍵], nó sẽ tạo ra những thành công và thất bại, và chính chuỗi ping. Vectơ đó sau đó được đảo ngược (monadic ) theo đúng thứ tự, sau đó trộn (monadic ) thành một ma trận. Ma trận đó sau đó được xuất ra stdout ( ⎕←) và thêm D e L ay ( ⎕DL). Đối số ⎕DLlà số phần tử trong ma trận ( ), cụ thể là 2, tạo độ trễ 2 giây giữa các lệnh gọi hàm.

{...:⎕←('Success rate is',×∘20,'percent (','/5)',⍨⍕)+/⍵}tạo chuỗi cuối cùng được xuất. Nó sẽ tổng hợp các phần tử của đối số ( +/⍵) và chuyển kết quả dưới dạng đối số cho hàm ngầm bên trong dấu ngoặc đơn. Hàm đó trước tiên bổ sung (dyadic ,, theo sau ) đối số chuỗi ( ) với chuỗi '/5)', sau đó nối nó vào chuỗi 'percent ('. Tiếp theo, nó sẽ nối chuỗi kết quả lên 20 lần đối số ( ×∘20) và sau đó nối nó với phần còn lại của đầu ra, được gửi đến thiết bị xuất chuẩn thông qua ⎕←.


Trailing newline là tốt. Nhận xét ở đây vì tôi đang sử dụng điện thoại di động
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);}

Hãy thử trực tuyến!


Ping hoạt động

Ping hoạt động


Giải thích

()->{                               // 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
}

in ấn là kẻ giết người ở đó: /
Adam

3

C # (Trình biên dịch tương tác Visual C #) , 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)");

Hãy thử trực tuyến!


2
Chào mừng đến với PPCG! Tôi đã tự do tạo ra một thử nghiệm trực tuyến! liên kết cho bạn. Tôi khuyên bạn nên chỉnh sửa câu trả lời của mình với mẫu TIO cung cấp để đăng câu trả lời trong PPCG (mặc dù điều đó không bắt buộc ).
J. Sallé

Bạn có thể giảm xuống còn 299 byte bằng cách xây dựng nội tuyến Randomthay vì lưu nó vào var r. Đây là một liên kết đến gợi ý của tôi
Robin B

Điều này liên tục gặp sự cố với IndexOutOfBoundExceptions đối với tôi.
đại từ của tôi là monicareinstate

@mypronounismonicareinstate Đã sửa. Làm thế nào tôi không bắt được trong tháng này?
Hiện thân của sự thiếu hiểu biết

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)

Thử nó

Nếu new Datekhông đủ ngẫu nhiên thì hãy thêm 8 byte để sử dụng Math.random()thay thế (một số sửa đổi khác đã được thực hiện để cho phép nó chạy đúng trong Snippet):


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)"

Hãy thử trực tuyến!

Thực sự giống với câu trả lời của Python cho TFeld. Thời gian không hoạt động trên TIO (TIO chỉ xuất ra khi hoàn thành chương trình), nhưng hoạt động cục bộ.

Dòng đầu tiên chỉ là một chuỗi được đặt trên đường ống. Các vòng lặp giữa từ 0đến 4, mỗi lần lặp sleeping trong 2vài giây, sau đó write-hostvới -nodòng mới. Chúng tôi đang viết ra một !hoặc .chọn Randomly và được lưu trữ vào $x. Chúng tôi sau đó tăng $ddựa trên $x.

Dòng cuối cùng là một chuỗi (multiline) khác được đặt trên đường ống, với một chút tính toán ở giữa để đưa ra tỷ lệ phần trăm.

-1 byte nhờ Veskah
-3 byte nhờ Ciaran_McCarthy


Biến dòng thành công thành chuỗi nhiều dòng thay vì sử dụng back-tick n (không biết cách thoát nó trong các bình luận) sẽ tiết kiệm được một byte. 161 byte
Veskah

1
Bạn có thể tắt 3 byte bằng cách sử dụng *20thay vì /5*100?
Ciaran_McCarthy

@Veskah Vâng, cảm ơn.
admBorkBork

@Ciaran_McCarthy Holy cow, cảm ơn vì golf rõ ràng. :)
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)')

Hãy thử trực tuyến!

Thời gian không hoạt động trong TIO, nhưng hoạt động trong bảng điều khiển. (Đầu ra TIO khi kết thúc thực hiện)

-7 byte, nhờ Erik Outgolfer



@EriktheOutgolfer Cảm ơn! :)
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(_),'')

Hãy thử trực tuyến!

JavaScript + HTML, 299 byte

Để đáp ứng yêu cầu định dạng đầu ra

(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>


1

Sạch sẽ , 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)")

Hãy thử trực tuyến!



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)";

Hãy thử trực tuyến!

$ php fakeping.php

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

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

Hãy thử trực tuyến!

Đã lưu 2 byte nhờ Rogem

Ung dung:

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

174 với 3346thay vì '!''.', tương ứng.


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,

Hãy thử trực tuyến!

Thật không may, tôi chỉ có thể kiểm tra nó trên TIO, nơi nó trả lại mọi thứ sau mười giây, nhưng nó sẽ hoạt động như mong đợi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.