Tạo thảm họa Y2K [đã đóng]


13

Chương trình của bạn có thể làm bất cứ điều gì bạn muốn. Điều kiện duy nhất là nó hoạt động như mong đợi nếu ngày trước năm 2000 và thất bại một cách ngoạn mục sau đó. Xác định một cách ngoạn mục tuy nhiên bạn muốn.

Đối với tất cả những người đã bỏ lỡ Y2K đầu tiên, đây là cơ hội của bạn!

Trả lời với số điểm cao nhất sẽ thắng.


3
Tôi thích câu trả lời cho đến nay, nhưng tôi thực sự đang tìm kiếm thứ gì đó có vẻ "vô tình".
ike

Hmmm ... Tôi sẽ cố gắng nghĩ về cách tôi có thể làm một cái gì đó như thế ;-)
Doorknob

Điều gì sẽ xảy ra vào năm 1899? Hay một cái gì đó như 573 trước Công nguyên? Hành vi không xác định?
Konrad Borowski

4
Tôi tự hỏi liệu có ai sẽ quản lý để tạo ra một "lỗi" thực sự không, một số câu trả lời được bình chọn hàng đầu về cơ bản chỉ là "nếu ngày> 1999 gây ra thảm họa"
w4etwetewtwet

Câu trả lời:


30

Con trăn

Các lỗi Y2K thực sự là về năm được biểu diễn dưới dạng số có 2 chữ số. Và đã làm gì đó sai khi con số đó tràn về 0. Chẳng hạn như cơ quan giám sát tên lửa hạt nhân này, khởi chạy tất cả các ICBM nếu chúng tôi không nhận được tin nhắn nhịp tim từ HQ trong 60 giây.

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
Rất vô trách nhiệm, nhưng vâng. +1
ike

1
Tôi tưởng tượng bữa tiệc đêm giao thừa tại HQ diễn ra sôi nổi vào sáng ngày 1 tháng 1 năm 2000.
Kevin

26

Java và cmd

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

Thảm họa ở đâu

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

11
Tôi có hiểu chính xác rằng Internet Explorer là thảm họa của bạn không? +1
Justin

12
Đúng, Internet Explorer là thảm họa của tôi: P
Juan Sebastian Lozano

Không đủ doanh nghiệp, vì đường dẫn đến Internet Explorer bị mã hóa cứng. Nó sẽ không bắt đầu trên phiên bản Windows 32 bit chẳng hạn.
Tên hiển thị

5
Mã có vấn đề Y2K và yêu cầu Windows 64 bit (bản phát hành đầu tiên được phát hành năm 2001). Tôi không biết bạn có thể gặp sự cố Y2K trong mã yêu cầu phần mềm được viết sau năm 2000.
Konrad Borowski

1
Điểm công bằng, nhưng đó là một ví dụ có thể được thử nghiệm trên máy của tôi. Trở lại năm 2000, IE cũng không tệ lắm, vì vậy trò đùa cũng không thực sự hiệu quả ....
Juan Sebastian Lozano

25

Ruby, mã golf (31 ký tự)

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

Nó không phải làm gì cả. Lỗi này khá "ngoạn mục" (trên các hệ thống Unix cũ không có cờ gốc bảo toàn) :-)


22
CẢNH BÁO. ĐỪNG CHẠY NÀY lol.
Cruncher 27/12/13

Điều này hơi nguy hiểm XD
Netorica

Ôi. Thật là một thất bại.
Charlie

Không thực sự nguyên bản vì rõ ràng. Ngoài ra, như Dennis viết , "[r] eal các lỗi Y2K là về năm được biểu diễn dưới dạng số có 2 chữ số."
wchargein

10

Ruby (962 ký tự)

Thành thật mà nói, những thảm họa ở đây không có vẻ xác thực. Tôi quyết định làm một cái gì đó có vẻ nhiều hơn ... uhm ... hợp pháp. Mã này là xứng đáng WTF hàng ngày, nhưng ngoài điều đó, nó đáng tin cậy (nếu bạn làm việc trong công ty lập trình cực kỳ tồi tệ, đó là).

Cảnh báo: Mã này nguy hiểm và nó sẽ phá hủy máy tính của bạn (nếu bạn không có --no-preserve-rootbảo vệ, nghĩa là). Đừng chạy.

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

Coi chừng, hoặc điều này sẽ lưu hành dưới dạng virus phá hủy.

8

SH

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

Nói dối là một điều rất khủng khiếp :)


6

Javascript

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
Không! Kinh dị!!!! Arggghhhhhhhhhhh!
WallyWest

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

Điều này hoạt động như dự định trên Slackware Linux 4.0 (phát hành tháng 5 năm 1999) - cho đến khi có các tệp được sửa đổi lần cuối vào năm 2000, được ghi đè bởi các phiên bản cũ từ năm 1999!


4

SQL

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

Thật không may, bảng này được thừa hưởng một số "đặc điểm" từ hệ thống trước đó. Một trong số đó là một trường có hai chữ số để tổ chức năm kết thúc.


4

Java + SQL

Tôi nghĩ rằng điều này phù hợp với mục tiêu của câu hỏi tốt hơn - tức là phá vỡ không chủ ý.

Giả sử đây là một ứng dụng cho đăng ký khai sinh, nơi họ ghi lại những đứa trẻ mới sinh trong cơ sở dữ liệu và cấp giấy khai sinh. Một số "thiên tài" đã thiết kế chiếc bàn giống như thế này:

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

Và ứng dụng java để đăng ký khai sinh có một số mã dọc theo dòng:

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

Sau đó, INSERT sẽ bắt đầu thất bại vào năm 2000 và không ai có thể nhận được giấy khai sinh nữa. Lý do - java.util.Date # getYear () trả về năm trừ 1900, có 3 chữ số bắt đầu từ năm 2000.


4

Tôi không phải là một lập trình viên, nhưng tôi thích đọc những bài đăng này để xem những người tài năng khác nghĩ gì (và để cười). Kịch bản shell thỉnh thoảng gần với mã hóa thực sự. Đây là một trong những hỗn hợp mặc dù:

Bash

#!/bin/bash

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

exit 0

3

C #

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

Chuyện gì đang xảy ra:

Này, một trình tạo số ngẫu nhiên! Mát mẻ! Tôi có thể sử dụng nó cho ... ehm ... tốt, nó không thành vấn đề.

Chương trình này sử dụng giá trị time_t cộng với hằng số hoàn toàn ngẫu nhiên để tạo hạt giống. Thật không may, giá trị này vào ngày 2000/01/01 trở nên cao hơn 2.147.483.647 là intgiới hạn. Chuyển đổi time_ttạo ra một integer overflow. Điều này sẽ không thành vấn đề nếu nó không có Math.Logchức năng, mà bây giờ cố gắng tính toán logic của một đại lượng âm, điều này là không thể. Hạt giống trở thành NaNvà hướng dẫn sau đây thất bại.

EDIT: Đã xóa một dòng mã không cần thiết, di sản của một giải pháp trước đây tôi đã từ bỏ trước khi viết cái này.


2

sh

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

Được cho là in sh: \: command not found, phá vỡ khủng khiếp sau năm 2000


2

C

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

Chương trình này không vít lên do hai chữ số năm. Nghĩa đen

Lưu ý: Đảm bảo bạn đã lưu tất cả dữ liệu trước khi chạy này hoặc thực thi giới hạn quy trình. Điều này sẽ chạy một quả bom ngã ba,


2

Python 343 ký tự

947 ký tự có bình luận, 343 ký tự không có bình luận

Tôi khá chắc chắn rằng điều này đã gây ra vấn đề thực tế (và năm 2000 trước đó).

# 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

C ++ - 194 ký tự

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

Vào năm 2000, nó sẽ hiển thị thông báo rằng máy tính của bạn không tương thích với Y2K và tắt máy.


1
Đó là năm 2000 , không phải năm 2014.
ike

1

SH

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

Điều này là vô hại kể từ khi chúng tôi vào năm 2013. Hãy tự thử;).

LƯU Ý: Nhận xét trên là một trò đùa , tập lệnh SH ở trên cực kỳ nguy hiểm và có thể sẽ phá hỏng hệ thống của bạn.


bạn cần ;trước khi then, cũng đã bạn thực sự có nghĩa là nó để insh: rm -rf ~: command not found
mniip

@mniip cảm ơn vì điều đó. Tôi đã không ở trên linux được một thời gian vì vậy các kỹ năng bash của tôi hơi bị rỉ sét.
C1D

6
bạn có thể đã thử nó;)
mniip 28/12/13

1

Oracle SQL

ORDERSchứa thông tin liên quan đến việc xử lý các đơn đặt hàng danh mục đặt hàng qua thư. Mỗi order_idcó thể có nhiều giao dịch (được tạo, xử lý, hoàn thành, hủy bỏ)

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

Chỉ giữ lại giao dịch gần đây nhất trên mỗi đơn hàng:

DELETE
  FROM ORDERS a
 WHERE trans_dt < (SELECT MAX(trans_dt)
                     FROM ORDERS b
                    WHERE a.order_id = b.order_id)
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.