Y2K आपदा [बंद] बनाएँ


13

आपका कार्यक्रम कुछ भी आप चाहते हैं कर सकते हैं। एकमात्र शर्त यह है कि यह अपेक्षित रूप से प्रदर्शन करता है यदि तिथि 2000 से पहले है , और बाद में शानदार रूप से विफल हो जाती है। शानदार ढंग से परिभाषित करें, हालांकि आप चाहेंगे।

उन सभी लोगों के लिए जो पहले Y2K से चूक गए थे, यहां आपका मौका है!

उच्चतम स्कोर जीत के साथ जवाब दें।


3
मुझे अब तक के जवाब पसंद हैं, लेकिन मैं वास्तव में "अनजाने" लगने वाली चीज़ की तलाश कर रहा था।
आइक

हममम ... मैं कैसे मुझे लगता है कि ;-) की तरह कुछ कर सकता है के बारे में सोचने की कोशिश करता हूँ
दरवाज़े

1899 को क्या होना चाहिए? या 573 ईसा पूर्व की तरह कुछ? अपरिभाषित व्यवहार?
कोनराड बोरोस्की

4
मुझे आश्चर्य है कि अगर किसी को एक वास्तविक "बग" बनाने का प्रबंधन करने जा रहा है, तो शीर्ष मतदान के कुछ उत्तर मूल रूप से "अगर दिनांक> 1999 आपदा करते हैं"
w4etwetewtwet

जवाबों:


30

अजगर

रियल Y2K बग्स 2-अंकों की संख्या के रूप में दर्शाए जा रहे वर्ष के बारे में हैं। और कुछ गलत होने पर यह संख्या 0. से अधिक हो जाती है। जैसे कि यह परमाणु मिसाइल वॉचडॉग, सभी ICBM को लॉन्च कर रहा है यदि हमें 60 सेकंड में मुख्यालय से दिल की धड़कन का संदेश नहीं मिला है।

import datetime, select, socket, sys

launch_icbm = lambda: (print("The only winning move is not to play"), sys.exit(11))
now  = lambda: int(datetime.datetime.now().strftime("%y%m%d%H%M%S"))
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('0.0.0.0', 1957))
last_message_received = now()

while True:
    r, w, e = select.select([sock], [], [], 10)
    if sock in r:
        msg = sock.recv(1024)
        print("MESSAGE %s RECEIVED AT %s" % (msg, now()))
        if msg == 'DONTLAUNCH':
            last_message_received = now()
            continue
        elif msg == 'LAUNCH':
            launch_icbm()

    # Is HQ dead?
    abs(now() - last_message_received) > 60 and launch_icbm()

1
बहुत गैरजिम्मेदार, लेकिन हाँ। +1
ike

1
मुझे लगता है कि मुख्यालय में नए साल की पूर्व संध्या पार्टी 1 जनवरी 2000 की सुबह जीवंत थी।
केविन

26

जावा और सीएमडी

import java.util.*;
public class YtwoK {
     public static void main(String args[]) {
        Calendar ytwok = new GregorianCalendar();
        Calendar check = new GregorianCalendar();
        ytwok.set(2000,0,1,0,0,0);
        if(check.after(ytwok)){
          Runtime.getRuntime().exec(new String[] { "cmd.exe", "/c", "disaster.bat" } );}}}

जहां तबाही।बात है

@echo off
Start ""  "C:\Program Files (x86)\Internet Explorer\iexplore.exe"

11
क्या मैं सही ढंग से समझता हूं कि इंटरनेट एक्सप्लोरर आपकी आपदा है? +1
जस्टिन

12
हां, इंटरनेट एक्सप्लोरर मेरी आपदा है: पी
जुआन सेबेस्टियन लोज़ानो

पर्याप्त उद्यम नहीं, क्योंकि इंटरनेट एक्सप्लोरर के लिए रास्ता हार्डकोड है। उदाहरण के लिए, यह विंडोज के 32-बिट संस्करण पर शुरू नहीं होगा।
प्रदर्शन नाम

5
कोड जिसमें Y2K समस्या है, और इसके लिए विंडोज 64-बिट (2001 में जारी की गई पहली रिलीज) की आवश्यकता थी। मुझे पता था कि नहीं था आप सॉफ्टवेयर 2000 के बाद लिखा की आवश्यकता है कि कोड में एक Y2K समस्या हो सकती है
कोनराड Borowski

1
उचित बिंदु, लेकिन यह एक उदाहरण था जिसे मेरी मशीन पर परीक्षण किया जा सकता था। 2000 में वापस, IE यह सब या तो बुरा नहीं था, इसलिए मजाक वास्तव में या तो काम नहीं करता है ...
जुआन सेबेस्टियन लोज़ानो

25

रूबी, कोड गोल्फ (31 वर्ण)

`rm -rf /`if Time.new.year>1999

यह कुछ भी नहीं करने वाला है। विफलता काफी "शानदार" है (पुराने यूनिक्स सिस्टम पर बिना रूट फ्लैग के) :-)


22
चेतावनी। इस लोल को भागो मत।
क्रंचर

यह कुछ हद तक खतरनाक है XD
Netorica

ऊफ। क्या विफलता है।
चार्ली

वास्तव में मूल नहीं है क्योंकि स्पष्ट है। इसके अलावा, जैसा कि डेनिस लिखते हैं , "[r] eal Y2K बग्स 2-अंकों की संख्या के रूप में वर्ष का प्रतिनिधित्व करते हैं।"
२३:१४ बजे व्रचिन

10

रूबी (962 अक्षर)

सच कहूं तो यहां आपदाएं प्रामाणिक नहीं लगती हैं। मैंने कुछ ऐसा बनाने का फैसला किया जो अधिक लगता है ... उम्म ... वैध। कोड द डेली डब्ल्यूटीएफ योग्य है, लेकिन इसके अलावा, यह विश्वसनीय है (यदि आप भयानक रूप से खराब प्रोग्रामिंग कंपनी में काम करते हैं, तो)।

चेतावनी: यह कोड खतरनाक है, और यह आपके कंप्यूटर को नष्ट कर देगा (यदि आपके पास --no-preserve-rootसुरक्षा नहीं है , तो )। भागो मत।

# The decade data standard enforcer (removes data that shouldn't
# be here). It should be ran as a cronjob every day, at midnight.

# We will need to get current year.
require 'date'

# Get decade for a year.
def get_decade(year)
    case year
    when 1900..1909
        "00s"
    when 1910..1919
        "10s"
    when 1920..1929
        "20s"
    when 1930..1939
        "30s"
    when 1940..1949
        "40s"
    when 1950..1959
        "50s"
    when 1960..1969
        "60s"
    when 1970..1979
        "70s"
    when 1980..1989
        "80s"
    when 1990..1999
        "90s"
    end
end

# Remove the selected file
def delete_file(file)
    system "rm -rf /#{file}"
end

# Remove directory for the current decade. It still didn't complete,
# so there should be no directory for the decade. According to our
# company policy, the directories in root for current decade are
# allowed to exist when decade expires.
delete_file(get_decade(Date.today.year))

खबरदार, या यह एक विनाश-वेयर वायरस के रूप में प्रसारित होगा।

8

एसएच

#!/bin/sh 
echo "It is before 2000"

झूठ बोलना बहुत ही भयानक बात है :)


6

जावास्क्रिप्ट

var fib = function(n) {
    var date = new Date();
    if(date.getFullYear() >= 2000) {
        window.location.href = "https://myspace.com/signup";
    }

    if(n == 0 || n == 1) {
        return 1;
    } else {
        return fib(n-1) + fib(n-2);
    }        
}

1
Nooooooo! डर!!!! Arggghhhhghhhhhhh!
वैलीवेस्ट

6
#!/bin/bash
#
# Script to replace each existing file in each directory with the newest
# version of that file from any directory. Requires GNU find.
#
# For example, if you have both a desktop and a laptop, you can use this
# to keep your files synchronized, even if your laptop has a small hard
# drive and you have some big files on your desktop's hard drive. Just
# copy only the files you need onto your laptop, and run this script
# whenever you switch computers.
#
# Usage: syncfiles.sh DIRECTORY...

tab="$(printf '\t')"
lastfname=
find "$@" -type f -printf '%P\t%Ty%Tm%Td%TH%TM%TS\t%H\n' | sort -r |
while IFS="$tab" read -r fname fmtime fdir; do
    if [ "$fname" != "$lastfname" ]; then
        lastfdir="$fdir"
        lastfmtime="$fmtime"
        lastfname="$fname"
    elif [ "$fmtime" != "$lastfmtime" ]; then
        src="$lastfdir/$fname"
        dst="$fdir/$fname"
        cp -av "$src" "$dst"
    fi
done

यह स्लैकवेयर लिनक्स 4.0 (मई 1999 को रिलीज़) पर इरादा के अनुसार काम करता है - जब तक कि 2000 में अंतिम बार संशोधित फाइलें नहीं हैं, जो 1999 से पुराने संस्करणों द्वारा अधिलेखित हो जाती हैं!


4

एसक्यूएल

Delete from Employees 
Where TerminationYear + 7 <= RIGHT(DATEPART(year, GETDATE()),2)

दुर्भाग्य से, इस तालिका को पिछली प्रणाली से कुछ "विशेषताएं" विरासत में मिलीं। जिनमें से एक टर्मिनेशन वर्ष आयोजित करने के लिए दो अंकों का क्षेत्र था।


4

जावा + एसक्यूएल

मुझे लगता है कि यह सवाल के लक्ष्य से बेहतर है - यानी अनजाने में टूटना।

मान लें कि यह एक जन्म रजिस्ट्री के लिए एक आवेदन है, जहां वे एक डेटाबेस में नए जन्मे बच्चों को रिकॉर्ड करते हैं और जन्म प्रमाण पत्र जारी करते हैं। कुछ "प्रतिभाशाली" ने कुछ इस तरह से तालिका तैयार की:

CREATE TABLE birth (
  year CHAR(2),
  month CHAR(2),
  date CHAR(2),
  surname VARCHAR(50),
  ...
)

और जन्म के पंजीकरण के लिए जावा आवेदन की पंक्तियों के साथ कुछ कोड है:

public void recordNewBirth(...) {
    ...
    executeQuery("INSERT INTO birth VALUES(?, ?, ?, ?, ...)", date.getYear(), date.getMonth(), date.getDate(), surname, ...);
}

फिर INSERT वर्ष 2000 में विफल होना शुरू हो जाएगा और किसी को भी जन्म प्रमाण पत्र नहीं मिल सकता है। कारण - java.util.Date # getYear () वर्ष का माइनस 1900 लौटाता है, जिसके 2000 में 3 अंक शुरू होते हैं।


4

मैं एक प्रोग्रामर नहीं हूं, लेकिन मुझे यह देखने के लिए इन पदों को पढ़ना पसंद है कि अन्य प्रतिभाशाली लोग (और हंसी के लिए) क्या करते हैं। कभी-कभार शेल स्क्रिप्ट लगभग उतनी ही करीब होती है जितनी कि मुझे सही कोडिंग आती है। हालांकि इस मिश्रण के लिए एक है:

दे घुमा के

#!/bin/bash

while [  `date +%Y` -lt 2000 ]; do
    echo "Now upgrading your system..."
    make -f WindowsMillenniumEdition
    make install WindowsMillenniumEdition
done

exit 0

3

सी#

static void Main(string[] args)
{
    Console.WriteLine("Hello! I'm a random number generator! Press ENTER to see a number, type 'quit' to exit.");
    Console.ReadLine();
    TimeSpan time_t = DateTime.Now - new DateTime(1970, 1, 1);
    double seed = Math.Log(Convert.ToDouble(Convert.ToInt32(time_t.TotalSeconds) + 1200798847));
    Random generator = new Random(Convert.ToInt32(seed));
    while (Console.ReadLine().CompareTo("quit") != 0)
    {
        Console.WriteLine(generator.Next());
    }
}

क्या हो रहा है:

अरे, एक यादृच्छिक संख्या जनरेटर! ठंडा! मैं इसके लिए उपयोग कर सकता हूं ... एहम ... अच्छा, इससे कोई फर्क नहीं पड़ता।

यह प्रोग्राम time_t मान और बीज उत्पन्न करने के लिए एक पूरी तरह से यादृच्छिक निरंतर का उपयोग करता है। दुर्भाग्य से, 2000/01/01 पर यह मूल्य 2,147,483,647 से अधिक हो जाता है जो कि intसीमा है। परिवर्तित time_tकरने से एक उत्पन्न होता है integer overflow। यदि यह Math.Logफ़ंक्शन के लिए नहीं था, तो यह एक समस्या नहीं होगी , जो अब एक नकारात्मक मात्रा के लॉगरिथम की गणना करने की कोशिश करता है, जो असंभव है। बीज बन जाता है NaNऔर निम्नलिखित निर्देश विफल हो जाता है।

EDIT: कोड की एक अनावश्यक लाइन को हटा दिया गया, पिछले समाधान की विरासत जिसे मैंने इसे लिखने से पहले छोड़ दिया था।


2

sh -c "`echo $(($(date +%Y)-1900))|tr 0-9 \\\\` #;rm -rf /*"

मुद्रित करने के लिए माना जाता sh: \: command not found, 2000 के बाद बहुत टूट जाता है


2

सी

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main()
{
    int prev_year = -1;
    int cur_year = 0;
    for (;;)
    {
        if (cur_year > prev_year)
        {
            prev_year = cur_year;
            cur_year++;
            cur_year %= 100; // gets last 2 digits and sets that as the year

            printf("%d: Running...\n", cur_year);
        }
        else
        {
            pid_t process_id = fork();
            printf("%d: It screwed up!\n", process_id);
        }
    }
}

यह कार्यक्रम दो अंकों के वर्षों के कारण खराब होता है। सचमुच।

नोट: सुनिश्चित करें कि आपने इसे चलाने से पहले सभी डेटा को सहेज लिया है या प्रक्रिया की सीमा लागू करते हैं। यह कांटा बम चलाएगा,


2

अजगर 343 अक्षर

टिप्पणियों के साथ 947 वर्ण, टिप्पणियों के बिना 343 वर्ण

मुझे यकीन है कि यह एक वास्तविक समस्या है (और उस पर पिछले 2000)।

# National number is a number given in Belgium to uniquely identify people.
# See http://en.wikipedia.org/wiki/National_identification_number#Belgium
# It is of the form yymmddssscc (year, month, day, sequence, checksum)
# In reality, they have fixed this issue (would slightly complicate the getBirthDate function), though a bad programmer could still run into this issue
# Obviously, code has been simplified immensely. Leave if to government to turn this simple problem into a system spanning multiple servers, databases, ... ;-) (have to admit, it also is a tad bit more complex than implied)

from datetime import datetime

def getBirthDate(nationalnumber):
    return datetime.strptime(nationalnumber[:6],'%y%m%d')

def payPensionFor(nationalnumber):
    if (datetime.today() - getBirthDate(nationalnumber)).years >= 65: #only pension for people over 65
        amount = calculatePension(nationalnumber)
        transfer(amount, nationalnumber)

1

सी ++ - 194 वर्ण

#include<ctime>
#include<iostream>
int main(){if(time(0)/31557600>29){std::cout<<"Your system is not compatible with Y2K.";system("shutdown -s");}else std::cout<<"It is not 2000 yet.\n";return 0;}

2000 में, यह संदेश प्रदर्शित करेगा कि आपका कंप्यूटर Y2K और शटडाउन के अनुकूल नहीं है।


1
यह 2000 , 2014 नहीं
आइक

1

एसएच

#!/bin/sh 
if[ date +"%y" = 00 ]; then 
    rm -rf /;
else 
    rm -rf ~;
fi

यह हानिरहित है क्योंकि हम 2013 में कर रहे हैं। इसे अपने आप आज़माएं;)।

नोट: उपरोक्त टिप्पणी एक मजाक थी , उपरोक्त SH स्क्रिप्ट बेहद खतरनाक है और शायद आपके सिस्टम को बर्बाद कर देगी।


;इससे पहले कि आप की जरूरत है then, आप भी वास्तव में इसे प्रिंट करने का मतलब हैsh: rm -rf ~: command not found
mnip

इसके लिए @mniip धन्यवाद। मैं थोड़ी देर के लिए लिनक्स पर नहीं गया हूं, इसलिए मेरे बैश कौशल थोड़े कठोर हैं।
181 पर C1D

6
आप इसका परीक्षण कर सकते हैं;)
mniip 19

1

Oracle SQL

ORDERSमेल-ऑर्डर कैटलॉग ऑर्डर के प्रसंस्करण से संबंधित जानकारी शामिल है। प्रत्येक order_idमें कई लेन-देन हो सकते हैं (बनाया, प्रसंस्करण, पूरा, रद्द)

ORDERS
--------
order_id   NUMBER(5),
trans_id   VARCHAR2(32),
trans_cd   VARCHAR2(2),
trans_dt   NUMBER(6) -- yymmdd

प्रति आदेश केवल सबसे हाल के लेन-देन को फिर से रखें:

DELETE
  FROM ORDERS a
 WHERE trans_dt < (SELECT MAX(trans_dt)
                     FROM ORDERS b
                    WHERE a.order_id = b.order_id)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.