एक फ़ाइल की प्रतिलिपि बनाएँ - विंडोज शैली


40

यह चुनौती xkcd से प्रेरित है :

यहाँ छवि विवरण दर्ज करें

चुनौती:

आप एक बड़ी फ़ाइल (1 गीगाबाइट) की नकल करेंगे। अंतरण दर 10 केबी / सेकंड से 100 एमबी / सेकंड के बीच भिन्न होगी। आपका कार्य फ़ाइल स्थानांतरण के शेष समय का उत्पादन करना है। आउटपुट जैसा दिखना चाहिए:

Time remaining: 03:12    (meaning it's 3 minutes and 12 seconds left)
Time remaining: 123:12   (meaning it's 2 hours, 3 minutes and 12 seconds left)
Time remaining: 02:03:12 (optional output, meaning the same as above)

अग्रणी शून्य को मिनटों और घंटों (वैकल्पिक) के लिए प्रदर्शित करने की आवश्यकता नहीं है, लेकिन इसे सेकंड के लिए दिखाया जाना चाहिए। केवल सेकंड का उपयोग करके शेष समय दिखाना ठीक नहीं है।

फ़ाइल स्थानांतरण:

  • अंतरण दर 10 एमबी / सेकंड से शुरू होगी।
  • हर सेकंड, 30% संभावना होगी कि हस्तांतरण दर बदल जाएगी
  • नई स्थानांतरण दर को श्रेणी में यादृच्छिक रूप से (समान वितरण) उठाया जाना चाहिए [10 kB/s, 100 MB/s], 10 kB / s के चरणों में।

नोट: आपको वास्तव में किसी फ़ाइल की प्रतिलिपि बनाने की आवश्यकता नहीं है।

आप का उपयोग करने के लिए चुन सकते हैं: 1 GB = 1000 MB, 1 MB = 1000 kB, 1 kB = 1000 Bया 1 GB = 1024 MB, 1 MB = 1024 kB, 1 kB = 1024 B

आउटपुट:

  • आप शुरू करते हैं 01:40, नहीं 01:39
  • आप स्थानांतरण दर में परिवर्तन के बाद का समय प्रदर्शित करते हैं, लेकिन इससे पहले कि कुछ भी उस दर पर स्थानांतरित हो जाए
  • सेकंड को पूर्णांक के रूप में प्रदर्शित किया जाना चाहिए, दशमलव नहीं। यह ऊपर / नीचे / निकटतम गोल करने के लिए वैकल्पिक है।
  • आपको हर सेकंड स्क्रीन को साफ करना चाहिए, जब तक कि आपकी भाषा में यह असंभव न हो।
  • आउटपुट स्थिर होना चाहिए: Time remaining: 00:00जब फ़ाइल स्थानांतरण समाप्त हो जाता है।

उदाहरण:

मैंने सभी दशमलव सेकंडों को गोल किया है। मान लें कि नीचे की पंक्तियों को बीच में 1 सेकंड के साथ दिखाया गया है, और स्क्रीन को प्रत्येक के बीच साफ किया गया है:

Time remaining: 01:40  (Transfer rate: 10 MB/s)
Time remaining: 01:39      1 GB - 10 MB
Time remaining: 01:38      1 GB - 2*10 MB
Time remaining: 01:37      1 GB - 3*10 MB
Time remaining: 01:28:54   1 GB - 4*10 MB  (TR: 180 kB/s)
Time remaining: 01:28:53   1 GB - 4*10 MB - 180 kB
Time remaining: 01:28:52   1 GB - 4*10 MB - 2*180 kB  
Time remaining: 00:13      1 GB - 4*10 MB - 3*180 kB  (TR: 75 MB/s)
Time remaining: 00:12      1 GB - 4*10 MB - 3*180 kB - 75 MB
Time remaining: 00:11      1 GB - 4*10 MB - 3*180 kB - 2*75 MB
Time remaining: 00:10      1 GB - 4*10 MB - 3*180 kB - 3*75 MB
Time remaining: 00:09      1 GB - 4*10 MB - 3*180 kB - 4*75 MB
Time remaining: 00:08      1 GB - 4*10 MB - 3*180 kB - 5*75 MB
Time remaining: 14:09:06   1 GB - 4*10 MB - 3*180 kB - 6*75 MB  (TR: 10 kB/s)
Time remaining: 14:09:05   1 GB - 4*10 MB - 3*180 kB - 6*75 MB - 10 kB
Time remaining: 00:06      1 GB - 4*10 MB - 3*180 kB - 6*75 MB - 20 kB  (TR: 88.110 MB/s)
Time remaining: 00:05
Time remaining: 00:04
Time remaining: 00:03
Time remaining: 00:02
Time remaining: 00:01
Time remaining: 00:00     <- Transfer is finished. Display this.

1
आपको छवि के नीचे XKCD टूल-टिप टेक्स्ट रखना चाहिए। लोगों को खुद को देखने के लिए समय बचाएं।
mbomb007

6
@ mbomb007, चित्र पर मंडराना :)
ग्रिफिन

क्या ऐसा होना चाहिए, "आप शुरू 1:40(या 1:42) नहीं 1:39(या 1:41)"?
जोनाथन एलन

इसके अलावा, अगर हम 1024संस्करण का उपयोग कर रहे हैं, तो हम किस चरण आकार का उपयोग कर रहे हैं?
जोनाथन एलन

यदि शेष घंटे शून्य हैं, तो क्या हम 00:00:10उदाहरण के लिए आउटपुट छोड़ सकते हैं ?
AdMBorkBork

जवाबों:


9

पायथ - 70 68 बाइट्स

K^T5J^T3W>KZ%." r3úBTê;¥
í".D/KJ60=J?<OT3O^T4J=-KJ.d1.

नींद के बिना इसे ऑनलाइन आज़माएं


@DigitalTrauma क्षमा करें, गाइड के रूप में लुइस के उत्तर का उपयोग कर रहा था ।_।
माल्टीसेन

@DigitalTrauma तय।
माल्टीसेन

6
जबरदस्त हंसी। जब (गोल्फिंग) भाषा A से (गोल्फिंग) भाषा B की कल्पना की जाती है, तो कल्पना को पढ़ने से ज्यादा आसान है ;-)
डिजिटल ट्रामा

@Maltysen इसके बारे में क्षमा करें! :-)
लुइस मेंडो

2
क्या आप इस बात का स्पष्टीकरण दे सकते हैं कि यहाँ क्या हो रहा है?
मोनिका

8

पावरशेल , 190 215 187 बाइट्स

($t="Time remaining: ")+"00:01:42";for($f,$r=1gb,10mb;$f-gt0;$f-=$r){if((Random 10)-lt3){$r=(Random -mi 1kb -ma (10mb+1))*10}$t+[Timespan]::FromSeconds([int]($f/$r));sleep 1}$t+"00:00:00"

इसे ऑनलाइन आज़माएं! (TIO लाइनों के बीच समाशोधन स्क्रीन का समर्थन नहीं करता है)

हमारे प्रारंभिक $file आकार और हमारे प्रारंभिक हस्तांतरण $rको क्रमशः / 1gbऔर 10mbs पर सेट करता है। फिर, जब तक हमारे पास अभी भी $file शेष है, हम लूप करते हैं।

पाश के अंदर, ifचयन से एक नंबर 0के लिए 9समावेशी, और अगर यह 0, 1, या 2 है (यानी, समय का 30%), हम दर बदल जाते हैं। यह हमारे बीच एक यादृच्छिक पूर्णांक चुनता है 1kbऔर 10mbफिर 10हमारी चरण गणना प्राप्त करने के लिए इसे गुणा करता है ।

हम शेष समय का निर्माण करने के लिए .NET लाइब्रेरी से FromSeconds स्थैतिक विधि का लाभ उठाते हैं TimeSpan। उस कॉल का आउटपुट स्वरूप वास्तव में चुनौती की आवश्यकताओं से मेल खाता है, इसलिए अतिरिक्त स्वरूपण की कोई आवश्यकता नहीं है।

(@ConnorLSW के लिए एक गुच्छा सहेजा गया)


1
@StewieGriffin TIO में आउटपुट कैशिंग है। सेटिंग्स ड्रॉअर में "आउटपुट आउटपुट कैश अक्षम करें" चुनें, और यह अलग-अलग परिणाम देता है।
22

शायद मुझे कुछ याद आ रहा है, लेकिन -fऑपरेटर कुछ भी करने के लिए प्रकट नहीं होता है। कि बाहर ले और का उपयोग करके forबजाय पाश while, और उसके बाद की दोनों मामलों को बदलने get-dateके लिए date, मैं 22 बाइट्स बंद दाढ़ी बनाने के लिए कर रहा था। इसे ऑनलाइन आज़माएं!
ब्रायनटिस्ट

@briantist TIO की आवश्यकता है Get-Dateक्योंकि अन्यथा यह लिनक्स dateकमांड का उपयोग करता है , जो अलग है। आप इसे Windows पर छोड़ सकते हैं क्योंकि PowerShell Windows dateकमांड को लपेटता है । लेकिन, forपाश निर्माण के लिए धन्यवाद !
AdmBorkBork

@AdmBorkBork हाँ, मैंने उस पर ध्यान दिया, लेकिन एक स्टॉक विंडोज वातावरण में यह काम करेगा। मुझे आश्चर्य है कि क्या यह सिर्फ nal date get-dateTIO में हेडर के लिए स्वीकार्य है ?
ब्रेंटिस्ट

@AdmBorkBork और विंडोज़ पर यह विंडोज़ की तारीख कमांड को लपेटता नहीं है, यह सिर्फ इसे अनदेखा करता है क्योंकि यह विंडोज़ पर .exe नहीं है, इसलिए यह वापस उसी व्यवहार में आता है जैसे random( get-बाकी सब विफल होने पर कमांड को पूर्वनिर्मित के साथ आज़माएं )।
ब्रेंटिस्ट

5

MATL , 78 बाइट्स

सुधार के लिए @Maltysen और @DigitalTrauma का धन्यवाद ।

1e5 1e3`XK10&XxyXIy/t0>*12L/'MM:SS'XO'Time remaining: 'whD-r.3<?1e4Yr}K]I0>]xx

MATL ऑनलाइन पर यह कोशिश करो ! (आपको शुरू में काम नहीं करने पर कई बार "रन" प्रेस करने की आवश्यकता हो सकती है)।

30 सेकंड के बाद ऑनलाइन दुभाषिया बार। आप प्रदर्शन की गति बढ़ाने के 10लिए कुछ छोटा करना ( जैसे3 सेकंड के दसवें भाग में समय बदलना ) कर सकते हैं

व्याख्या

1e5                  % Push 1e5: file size in 10-kB units
1e3                  % Push 1e3: initial rate in 10-kB/s units
`                    % Do...while
  XK                 %   Copy current rate into clipboard K (doesn't consume it)
  10&Xx              %   Wait 1 second and clear screen
  y                  %   Duplicate current file size onto the top of the stack
  XI                 %   Copy it to clipboard I (doesn't consume it)
  y                  %   Duplicate current rate onto the top of the stack
  /                  %   Divide. This gives the estimated remaining time in seconds
                     %   It may be negative in the last iteration, because the
                     %   "remaining" file size may have become negative
  t0>*               %   If negative, convert to 0
  12L/               %   Push 86400 and divide, to convert from seconds to days
  'MM:SS'XO          %   Format as a MM:SS string, rounding down
  'Time remaining: ' %   Push this string
  wh                 %   Swap, concatenate
  D                  %   Display
  -                  %   Subtract. This gives the new remaining file size
  r                  %   Push random number uniformly distributed in (0,1)
  .3<                %   Is it less than 0.3?
  ?                  %   If so
    1e4Yr            %     Random integer between 1 and 1e4. This is the new rate 
                     %     in 10-kB/s units
  }                  %   Else
    K                %     Push rate that was copied into clipboard K
  ]                  %   End
  I                  %   Push previous remaining file size from clipboard I
  0>                 %   Is it positive?
]                    % End. If top of the stack is true: next iteration
xx                   % Delete the two numbers that are on the stack

मुझे MATL समझ में नहीं आता है, लेकिन यह मुझे ऐसा लगता है जैसे आप हमेशा अपने स्पष्टीकरण से केवल 30% समय के बजाय एक नई दर प्राप्त कर रहे हैं।
माल्टसेन

@Maltysen अब ठीक हो गया। सर उठाने के लिए धन्यवाद!
लुइस मेंडो

@DigitalTrauma अब ठीक हो गई
लुइस

5

रूबी, 116 110 बाइट्स

ऑनलाइन यह प्रयास करें, सिवाय repl.it पढ़ता है \rएक नई पंक्ति के रूप में है और यह भी उपयोग नहीं कर सकते $><<, तो यह अपने 5-बाइट बराबर के साथ बदल रहा है print

\rलाइन को रीसेट करने के लिए उपयोग करने के प्रारंभिक विचार के लिए जोनासवेलेकी को चिल्लाओ ।

f=1e5;r=1e3;(k=f/r=rand<0.3?1+rand(1e4):r;$><<"\rTime remaining: %02d:%02d"%[k/60,k%60];f-=r;sleep 1)while f>0

यह संस्करण विंडोज पर अनटाइटेड है, लेकिन यूनिक्स पर काम करता है।


4

बाश + आम बर्तन, 117

सीधा कार्यान्वयन। 10000 से विभाजित करके बचाए गए कुछ बाइट्स:

for((b=10**5,r=1000;b>0;r=RANDOM%10<3?RANDOM%10000+1:r,b-=r));{
clear
date -ud@$[b/r] "+Time remaining: %T"
sleep 1
}

इसे ऑनलाइन आज़माएंsleep 0TIO का उपयोग करना ताकि आपको इंतजार न करना पड़े। clearTIO पर काम नहीं करता है।


3

जावास्क्रिप्ट (ईएस 6), 162 बाइट्स

मिनट दिखाता है जैसे गद्देदार सेकंड (तैरता हुआ)

उदाहरण के लिए, 123:45

t=1e5
s=1e3
setInterval(c=>c.log(`Time remaining: ${c.clear(d=t/s),d/60|0}:`+`0${t-=s>t?t:s,r=Math.random,s=r()<0.3?1+r()*1e4|0:s,d%60|0}`.slice(-2)),1e3,console)


मुझे लगता है कि आप को छोटा console.clearकरना भूल गया c.clear;-) यह एक महान विचार है, BTW
ETHproductions

@ETHproductions Ooooops! धन्यवाद :)
जॉर्ज रीथ

HTML को जोड़कर आप इसे 154 बाइट्स तक ले जा सकते हैं - <input id=o>- और कुछ अन्य समायोजन कर सकते हैं:t=1e5;i=s=1e3;setInterval(_=>o.value=`Time remaining: ${(d=t/s)/60|0}:`+`0${t-=s>t?t:s,r=Math.random(),s=r<.3?1+r*1e4|0:s,d%60|0}`.slice(-2),i)
Shaggy

2

पायथन 3.6 ( 212 203 बाइट्स)

from random import*
import time,datetime
r=1e7
d=1e9
while 1:
 print(f"\x1b[KTime remaining: {datetime.timedelta(seconds=d//r)}",end="\r");d=max(0,d-r);time.sleep(1)
 if random()>.7:r=randint(1,1e4)*1e4

बहुत सीधा, मुझे लगता है। ANSI एस्केप सीक्वेंस और Kकमांड का उपयोग करके लाइन मिटाता है ।

  • सहेजे गए 9 बाइट @ValueInk को धन्यवाद

1
अपनी पहली पंक्ति में एक स्थान छोड़ें from random import*d//rसे छोटा है int(d/r)। इसके अलावा, r=1e7;d=1e9शुरू से ही साथ जा सकते हैं ।
वैल्यू इंक

@ValueInk राइट, आर और डी के लिए 1eX के बारे में नहीं सोचा था क्योंकि मैं उन्हें पूर्णांक बनाना चाहता था; जब मैंने रैंडिन्ट लाइन को छोटा किया, तो मैं इस बारे में भूल गया ... :)
जोनास

1

बैच, 193 बाइट्स

@set/ap=10000,s=p*10,r=p/10
:l
@set/at=s/r,m=t/60,n=t%%60+100,s-=r
@cls
@echo Time remaining: %m%:%n:~1%
@timeout/t>nul 1
@if %random:~-1% lss 3 set/ar=%random%%%p+1
@if %t% gtr 0 goto l

नोट: 27.68 एमबी / एस या उससे कम की दरों के लिए थोड़ा सा पूर्वाग्रह।


1

सी 184 171 155 बाइट्स

f(){i,j=0,r=1e7;for(i=1e9;i>0;i-=r){j=i/r;printf("Time remaining: %02d:%02d:%02d\r",j/3600,(j/60)%60,j%60);sleep(1);if(rand()%10<3)r=(rand()%10000)*1e4;}}

मुझे उम्मीद है कि यह योग्य है।

Ungolfed संस्करण:

void f()
{
    int j=0;
    float rate=1e7; 
    for(int size=1e9;i>0; size-=rate)
    {     
       j=size/rate;      
       printf("Time remaining: %02d:%02d:%02d\r",j/3600,(j/60)%60,j%60);
       sleep(1);

       if(rand()%10<3)
          rate=(rand()%10000)*1e4;          



   }

}

स्पष्टीकरण: golfed संस्करण में iसे मेल खाती है sizeungolfed संस्करण में और rहै rateungolfed संस्करण में। jसेकंड में शेष समय संग्रहीत करता है।

  • मेरे पास कॉपी करने के लिए 10 ^ 9 बाइट्स हैं। मैं 10 मेगाबाइट / सेकंड की दर से नकल करना शुरू करता हूं,
  • यदि संभाव्यता 30% से कम है, तो दर बदलें (10 किलोबाइट से 100 मेगाबाइट प्रति सेकंड)

@ValueInk 13 बाइट बचाने के लिए धन्यवाद।

@ nmjcman101 16 बाइट बचाने के लिए धन्यवाद।


यह ऐसा नहीं लगता कि यह वास्तव में चुनौती क्या कहती है। क्या आप बता सकते हैं कि यह कैसे काम करता है?
वैल्यू इंक

यह सिर्फ टाइम आउटपुट का अनुकरण करता है, मुझे यह पता नहीं चला है कि डेटा ट्रांसफर पार्ट को कैसे करना है। मुझे लगता है मैं तब तक पकड़ पर रख रहा हूँ।
हाबिल टॉम

आप 3 पुनरावृत्तियों के बाद दर नहीं बदलते हैं। इसे बदलने का 30% मौका है। तो आप शायद निम्नलिखित के समान कुछ करना चाहते हैं: if(rand()%10<3)r=(rand()%10000+1)*1e4;(विशेषकर चूंकि न्यूनतम दर 10 केबी / एस है, न कि 1 एमबी / एस जैसा कि आपका समाधान कह रहा है, और दर मौका कुछ समान वितरण होना चाहिए।)
मूल्य इंक

@ValueInk बहुत बहुत धन्यवाद। :) अपडेट किया गया। हो जाता है काम! मुझे नहीं पता था कि 30% संभावना वाले भाग का अनुकरण कैसे किया जाए। अब इतना साफ है।
हाबिल टॉम

आप गोल्फ j/3600,(j/60)%60,j%60(21) s=60;और j/s/s,j/s%s,j%s(20)
दावीद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.