造成Y2K灾难[关闭]


13

您的程序可以做任何您想做的事情。唯一的条件是,如果日期在2000年之前,它会按预期方式运行,而在此之后会急剧失败。定义壮观,但是你会喜欢。

对于所有错过第一个Y2K的人,这是您的机会!

以最高分数获胜的答案。


3
到目前为止,我很喜欢这些答案,但是我确实在寻找看起来“无意”的东西。
ike,

嗯...我将尝试考虑如何制作类似的东西;-)
门把手

1899年会发生什么?还是公元前573年?未定义的行为?
Konrad Borowski

4
我想知道是否有人会设法创建一个实际的“错误”,因此,一些投票最多的答案基本上只是“如果date> 1999做灾难”
w4etwetewtwet

Answers:


30

蟒蛇

真正的Y2K错误大约是以2位数字表示的年份。并且当该数字溢出到0时做错了事。例如这个核导弹监视程序,如果我们在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
ike13年

1
我以为总部的除夕晚会是2000
Kevin

26

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

哪里有灾害。蝙蝠

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

11
我是否正确理解Internet Explorer是您的灾难?+1
贾斯汀

12
是的,Internet Explorer是我的灾难:P
Juan Sebastian Lozano

不够企业,因为Internet Explorer的路径是硬编码的。例如,它不会在Windows的32位版本上启动。
显示名称

5
代码具有Y2K问题,并且需要Windows 64位(其第一版于2001年发布)。我不知道您的代码中是否会出现Y2K问题,需要在2000
。– Konrad Borowski

1
公平的观点,但这是可以在我的机器上测试的示例。早在2000年,IE是不是所有的坏的,所以这个笑话并没有真正工作,要么....
胡安·塞巴斯蒂安·洛萨诺

25

Ruby,编码高尔夫(31个字符)

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

它应该什么都不做。失败非常“壮观”(在没有保留根标志的旧Unix系统上):-)


22
警告。不要运行这个大声笑。
Cruncher

这有点危险XD
Netorica

钱币。真是失败
查理

不是很原始,因为很明显。而且,正如丹尼斯所写的那样,“ 2000年的Y2K错误大约用2位数表示。”
wchargin 2014年

10

Ruby(962个字符)

老实说,这里的灾难看起来并不真实。我决定做些看起来更……合法的事情。该代码值得“每日WTF”使用,但除此之外,它还是令人信服的(如果您在非常糟糕的编程公司中工作)。

警告:此代码很危险,并且会破坏您的计算机(如果没有--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

SH

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

说谎是一件非常可怕的事情:)


6

Java脚本

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
不!惊恐的事件!!!!啊啊啊啊啊啊啊啊!
WallyWest 2014年

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

这可以在Slackware Linux 4.0(1999年5月发布)上按预期工作–直到有2000年最后修改的文件,这些文件被1999年以前的旧版本覆盖!


4

的SQL

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

不幸的是,该表继承了先前系统的一些“特性”。其中之一是两位数字字段,用于保存终止年份。


4

Java + SQL

我认为这更符合问题的目标-即意外损坏。

假设这是出生登记的应用程序,他们在数据库中记录新生婴儿并颁发出生证明。一些“天才”设计了如下表格:

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

而且用于注册出生的Java应用程序具有一些类似于以下内容的代码:

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

我不是程序员,但我喜欢阅读这些文章,以了解其他有才干的人的想法(并发笑)。偶尔的shell脚本与我真正的编码差不多。这是混合的一种:

重击

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

发生了什么:

嘿,一个随机数发生器!凉!我可以用它...嗯...好吧,没关系。

该程序使用time_t值加上一个完全随机的常数来生成种子。不幸的是,此值在2000/01/01上变得高于int限制2147483647 。转换会time_t产生integer overflow。如果不是该Math.Log函数,这将不是问题,该函数现在尝试计算负数的对数,这是不可能的。种子变为NaN,并且以下指令失败。

编辑:删除了不需要的代码行,这是我在编写此解决方案之前放弃的先前解决方案的遗产。


2

SH

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

应该打印sh: \: command not found,在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);
        }
    }
}

由于两位数的年,该程序确实搞砸了。从字面上看。

注意:在运行此命令或执行过程限制之前,请确保已保存所有数据。这将开叉炸弹,


2

Python 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

C ++-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
。– ike13年

1

SH

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

自从我们在2013年以来,这是无害的。您可以自己尝试一下;)。

注意:上面的评论是一个玩笑,上面的SH脚本非常危险,可能会破坏您的系统。


;之前需要的内容then,还真的要打印sh: rm -rf ~: command not found

@mniip对此表示感谢。我已经有一段时间没有使用linux了,所以我的bash技能有些生锈。
C1D

6
您可能已经测试过;)
mniip 2013年

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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.