Створення катастрофи Y2K [закрито]


13

Ваша програма може робити все, що завгодно. Єдиною умовою є те, що вона буде виконана так, як очікувалося, якщо дата до 2000 року , а згодом не вражає. Визначайте ефектно, як би ви хотіли.

Для всіх тих людей, хто пропустив перший Y2K, ось ваш шанс!

Відповідь з найбільшою кількістю виграшів.


3
Мені подобаються відповіді досі, але я справді шукав те, що виглядає «ненавмисно».
ike

Гммм ... я спробую подумати про те, як я міг би зробити щось подібне ;-)
Doorknob

Що повинно статися 1899 року? Або щось на зразок 573 року до н.е.? Невизначена поведінка?
Конрад Боровський

4
Цікаво, чи комусь вдасться створити фактичну "помилку", деякі
голосові

Відповіді:


30

Пітон

Справжні помилки Y2K приблизно за рік представляються двозначним числом. І робити щось не так, коли це число переповнюється до 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
ike

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

Де katastrof.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
Код, який має проблему Y2K, і вимагає 64-розрядної версії Windows (перший реліз якого був випущений у 2001 році). Я не знав, що у вас може виникнути проблема Y2K в коді, який вимагає написання програмного забезпечення після 2000 року.
Конрад Боровський

1
Справедливий момент, але це був приклад, який можна перевірити на моїй машині. Ще в 2000 році IE не був таким поганим, тому жарт теж не спрацьовує ....
Juan Sebastian Lozano

25

Ruby, код гольфу (31 знак)

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

Нічого не потрібно робити. Відмова досить "вражаючий" (на старих системах Unix без збереженого кореневого прапора) :-)


22
УВАГА. НЕ РОБИТИ ЦЕ лол.
Cruncher

це дещо небезпечно XD
Netorica

Вихід. Яка невдача.
Чарлі

Не дуже оригінально, тому що очевидно. Крім того, як пише Денніс , "[r] eal Y2K помилки приблизно за рік представляються як двоцифрове число".
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))

Остерігайтеся, інакше це поширюватиметься як вірус знищення.

8

SH

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

Лежати - це дуже страшна річ :)


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! Жах !!!! 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

Це працює за задумом 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, ...);
}

Тоді ІНШЕРТ почав виходити з ладу у 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і наступна інструкція виходить з ладу.

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

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 на деякий час, тому мої баш-навички трохи іржаві.
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.