Создать катастрофу 2000 года [закрыто]


13

Ваша программа может делать все что угодно. Единственным условием является то, что он работает так, как ожидалось, если дата до 2000 года , и после этого эффектно проваливается. Определите эффектно, как бы вы ни хотели.

Для всех тех, кто пропустил первый Y2K, вот ваш шанс!

Ответ с наибольшим количеством побед.


3
Мне пока нравятся ответы, но я действительно искал что-то, что выглядит «непреднамеренно».
Ike

Хммм ... Я постараюсь подумать о том, как я могу сделать что-то подобное ;-)
Дверная ручка

Что должно произойти в 1899 году? Или что-то вроде 573 г. до н.э.? Неопределенное поведение?
Конрад Боровски

4
Интересно, если кому-то удастся создать реальную «ошибку», некоторые из самых популярных ответов - это просто «если дата> 1999 - катастрофа»
w4etwetewtwet

Ответы:


30

питон

Реальные ошибки 2000 года примерно год представлены в виде двузначного числа. И делать что-то не так, когда это число переполняется до 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
ик

1
Я представляю, что новогодняя вечеринка в штаб-квартире была оживленной утром 1 января 2000 года.
Кевин

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
Хуан Себастьян Лосано

Не достаточно предприятия, потому что путь к Internet Explorer жестко закодирован. Например, он не запустится в 32-битной версии Windows.
Отображаемое имя

5
Код, который имеет проблему 2000 года и требует Windows 64-бит (первый выпуск которого был выпущен в 2001 году). Я не знал, что у вас может быть проблема Y2K в коде, который требует программного обеспечения, написанного после 2000 года.
Конрад Боровски

1
Справедливо, но это был пример, который можно было проверить на моей машине. В 2000 году IE тоже не был таким уж плохим, поэтому шутка тоже не сработала ...
Хуан Себастьян Лосано

25

Рубин, код гольф (31 символ)

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

Это должно ничего не делать. Ошибка довольно «впечатляющая» (на старых системах Unix без флага сохранения корня) :-)


22
ПРЕДУПРЕЖДЕНИЕ. НЕ ПРОПУСТИТЕ ЭТО LOL.
Cruncher

это несколько опасно XD
Неторика

Уф. Какой провал.
Чарли

Не совсем оригинально, потому что очевидно. Кроме того, как пишет Деннис , «ошибочные данные 2000 года о годе представлены в виде двузначного числа».
wchargin

10

Рубин (962 символа)

Если честно, бедствия здесь не выглядят подлинными. Я решил сделать что-то, что кажется более ... хм ... законным. Код The ​​Daily 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))

Осторожно, иначе это будет распространяться как вирус уничтожения.


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
Nooooooo! Ужас!!!! Arggghhhhghhhhhhh!
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

Это работает, как и предполагалось, в Slackware Linux 4.0 (выпущен в мае 1999 г.) - до тех пор, пока не появятся файлы, которые были в последний раз изменены в 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, который имеет 3 цифры, начиная с 2000 года.


4

Я не программист, но мне нравится читать эти посты, чтобы посмотреть, что придут другие талантливые люди (и для смеха). Случайный сценарий оболочки примерно так же близок, как я подошел к истинному кодированию. Вот один из них, хотя:

удар

#!/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 становится выше 2 147 483 647, что является intпределом. Преобразование time_tсоздает integer overflow. Это не было бы проблемой, если бы не Math.Logфункция, которая сейчас пытается вычислить логарифм отрицательной величины, что невозможно. Семя становитсяNaN и следующая инструкция терпит неудачу.

РЕДАКТИРОВАТЬ: Удалена ненужная строка кода, наследие предыдущего решения, от которого я отказался до написания этого.


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

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.
Ike

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

@mniip спасибо за это. Я не был на Linux некоторое время, поэтому мои навыки в Bash немного ржавые.
C1D

6
Вы могли бы проверить это;)
mniip

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 и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.