Utwórz katastrofę Y2K [zamknięte]

13

Twój program może zrobić wszystko, co chcesz. Jedynym warunkiem jest to, by działał zgodnie z oczekiwaniami, jeśli data przypada przed 2000 r. , A potem zawodzi spektakularnie. Zdefiniuj spektakularnie , jak chcesz.

Dla wszystkich tych, którzy przegapili pierwszy Y2K, masz szansę!

Odpowiedź z najwyższym wynikiem wygrywa.

ike
źródło
3
Do tej pory lubię odpowiedzi, ale naprawdę szukałem czegoś, co wygląda „niezamierzenie”.
ike
Hmmm ... Spróbuję wymyślić, jak mógłbym zrobić coś takiego ;-)
Klamka
Co powinno się stać w 1899 roku? A może coś w rodzaju 573 pne? Nieokreślone zachowanie?
Konrad Borowski,
4
Zastanawiam się, czy ktokolwiek zdoła stworzyć prawdziwy „błąd”, niektóre z najczęściej głosowanych odpowiedzi są po prostu „jeśli data> 1999
dozna

Odpowiedzi:

30

Pyton

Rzeczywiste błędy Y2K przedstawiają około roku jako dwucyfrową liczbę. I robienie czegoś złego, gdy liczba ta przepełni się do 0. Na przykład ten organ nadzorujący pociski nuklearne, uruchamiający wszystkie ICBM, jeśli nie otrzymamy wiadomości pulsu od kwatery głównej w ciągu 60 sekund.

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()
Dennis Kaarsemaker
źródło
1
Bardzo nieodpowiedzialne, ale tak. +1
ike
1
Wyobrażam sobie, że impreza sylwestrowa w centrali była pełna życia rano 1 stycznia 2000 r.
Kevin
26

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

Gdzie jest disaster.bat

@echo off
Start ""  "C:\Program Files (x86)\Internet Explorer\iexplore.exe"
Juan Sebastian Lozano
źródło
11
Czy rozumiem poprawnie, że Internet Explorer jest twoją katastrofą? +1
Justin
12
Tak, Internet Explorer to moja katastrofa: P
Juan Sebastian Lozano
Za mało przedsiębiorstw, ponieważ ścieżka do Internet Explorera jest zakodowana na stałe. Na przykład nie uruchamia się w 32-bitowej wersji systemu Windows.
Nazwa wyświetlana
5
Kod, który ma problem z Y2K i wymaga 64-bitowego systemu Windows (pierwsze wydanie zostało wydane w 2001 r.). Nie wiedziałem, że możesz mieć problem z kodem Y2K, który wymaga oprogramowania napisanego po 2000 roku.
Konrad Borowski,
1
Racja, ale był to przykład, który można przetestować na moim komputerze. W 2000 roku IE też nie było takie złe, więc żart tak naprawdę nie działa ...
Juan Sebastian Lozano
25

Ruby, kod golfowy (31 znaków)

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

To nie powinno nic zrobić. Awaria jest dość „spektakularna” (na starych systemach uniksowych bez flagi rootowania) :-)

Klamka
źródło
22
OSTRZEŻENIE. NIE URUCHAMIAJ TEGO lol.
Cruncher
jest to nieco niebezpieczne XD
Netorica
Nie. Co za porażka.
Charlie,
Niezupełnie oryginalny, ponieważ oczywisty. Ponadto, jak pisze Dennis , „błędy w Y2K dotyczą około 2-cyfrowego roku”.
wchargin
10

Ruby (962 znaków)

Szczerze mówiąc, katastrofy tutaj nie wyglądają autentycznie. Postanowiłem zrobić coś, co wydaje się bardziej ... hmm ... legalne. Kod jest warty Daily WTF, ale poza tym jest wiarygodny (to znaczy, jeśli pracujesz w strasznie złej firmie programistycznej).

Ostrzeżenie: ten kod jest niebezpieczny i zniszczy Twój komputer (jeśli nie masz --no-preserve-rootochrony). Nie biegać.

# 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))
Konrad Borowski
źródło
Uwaga, w przeciwnym razie będzie się on rozprzestrzeniał jako wirus destrukcyjny.
8

SH

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

Kłamstwo jest bardzo okropną rzeczą :)

ike
źródło
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);
    }        
}
Jacek
źródło
1
Nieeeee! Horror!!!! Arggghhhhghhhhhh!
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

Działa to zgodnie z przeznaczeniem w systemie Slackware Linux 4.0 (wydanym w maju 1999 r.) - do czasu ostatniej modyfikacji plików w 2000 r., Które zostaną zastąpione starymi wersjami z 1999 r.!

Proszę wstać
źródło
4

SQL

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

Niestety, ta tabela odziedziczyła pewne „cechy” z poprzedniego systemu. Jednym z nich było dwucyfrowe pole na rok wypowiedzenia.

szturchać
źródło
4

Java + SQL

Myślę, że to lepiej pasuje do celu pytania - tj. Niezamierzonego złamania.

Powiedzmy, że jest to aplikacja do rejestru urodzeń, w którym rejestrują noworodki w bazie danych i wydają akty urodzenia. Niektórzy „geniusze” zaprojektowali stół w taki sposób:

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

Aplikacja Java do rejestrowania urodzeń zawiera kod podobny do:

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

Wówczas INSERT zacząłby zawodzić w 2000 roku i nikt już nie mógłby uzyskać aktu urodzenia. Powód - java.util.Date # getYear () zwraca rok minus 1900, który ma 3 cyfry począwszy od 2000 roku.

aditsu zrezygnowało, ponieważ SE jest ZŁEM
źródło
4

Nie jestem programistą, ale lubię czytać te posty, aby zobaczyć, co wymyślą inni utalentowani ludzie (i dla śmiechu). Sporadyczny skrypt powłoki jest tak blisko, jak tylko dochodzę do prawdziwego kodowania. Oto jeden z miksu:

Grzmotnąć

#!/bin/bash

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

exit 0
OwenITGuy
źródło
3

DO#

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

Co się dzieje:

Hej, generator liczb losowych! Chłodny! Mogę go użyć do ... ehm ... cóż, to nie ma znaczenia.

Ten program używa wartości time_t plus całkowicie losowa stała do wygenerowania ziarna. Niestety, wartość z 2000/01/01 staje się wyższa niż 2 147 483 647, co stanowi intlimit. Konwersja time_tgeneruje integer overflow. Nie byłby to problem, gdyby nie Math.Logfunkcja, która próbuje teraz obliczyć logarytm ujemnej wielkości, co jest niemożliwe. Ziarno staje się NaNi następująca instrukcja nie działa.

EDYCJA: Usunąłem niepotrzebną linię kodu, dziedzictwo poprzedniego rozwiązania, które porzuciłem przed napisaniem tego.

Vereos
źródło
2

sh

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

powinien drukować sh: \: command not found, strasznie się psuje po 2000 roku

mniip
źródło
2

do

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

Ten program się psuje z powodu dwucyfrowych lat. Dosłownie

Uwaga: upewnij się, że zapisałeś wszystkie dane przed uruchomieniem tego lub egzekwuj limit procesu. To uruchomi bombę widelcową,

wei2912
źródło
2

Python 343 znaków

947 znaków z komentarzami, 343 znaków bez komentarzy

Jestem raczej pewien, że ten spowodował rzeczywiste problemy (i to po 2000 roku).

# 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)
HolySquirrel
źródło
1

C ++ - 194 znaków

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

W 2000 roku wyświetli komunikat, że twój komputer nie jest zgodny z Y2K i zamknął się.


źródło
1
Jest 2000 , a nie 2014.
ike
1

SH

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

Jest to nieszkodliwe, ponieważ jesteśmy w 2013 roku. Spróbuj sam;).

UWAGA: Powyższy komentarz był żartem , powyższy skrypt SH jest wyjątkowo niebezpieczny i prawdopodobnie zrujnuje twój system.

C1D
źródło
potrzebujesz ;wcześniej then, czy naprawdę miałeś na myśli to do wydrukowaniash: rm -rf ~: command not found
mniip
@mniip dzięki za to. Od jakiegoś czasu nie byłem na Linuksie, więc moje umiejętności bashowe są trochę zardzewiałe.
C1D
6
mogłeś to przetestować;)
mniip
1

Oracle SQL

ORDERSzawiera informacje dotyczące przetwarzania zamówień z katalogu wysyłkowego. Każda order_idmoże mieć wiele transakcji (utworzonych, przetwarzanych, zrealizowanych, anulowanych)

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

Zachowaj tylko najnowszą transakcję dla zamówienia:

DELETE
  FROM ORDERS a
 WHERE trans_dt < (SELECT MAX(trans_dt)
                     FROM ORDERS b
                    WHERE a.order_id = b.order_id)
Joe
źródło