Erstellen Sie eine Y2K-Katastrophe [geschlossen]

13

Ihr Programm kann alles, was Sie wollen. Die einzige Bedingung ist, dass es wie erwartet funktioniert, wenn das Datum vor 2000 liegt und danach spektakulär versagt. Definieren Sie spektakulär, wie Sie möchten.

Für alle, die das erste Jahr verpasst haben, ist hier Ihre Chance!

Antwort mit höchster Punktzahl gewinnt.

ike
quelle
3
Bisher mag ich die Antworten, aber ich habe wirklich nach etwas gesucht, das "ungewollt" aussieht.
ike
Hmmm ... ich werde versuchen darüber nachzudenken, wie ich so etwas machen könnte ;-)
Türklinke
Was soll 1899 passieren? Oder so etwas wie 573 v. Undefiniertes Verhalten?
Konrad Borowski
4
Ich frage mich, ob es irgendjemandem
gelingen wird, einen echten

Antworten:

30

Python

Echte Y2K-Bugs werden etwa im Jahr als zweistellige Zahl dargestellt. Und etwas falsch machen, wenn diese Zahl auf 0 überläuft. Zum Beispiel dieser Atomwächter, der alle ICBMs startet, wenn wir innerhalb von 60 Sekunden keine Heartbeat-Nachricht vom HQ erhalten haben.

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
quelle
1
Sehr verantwortungslos, aber ja. +1
ike
1
Ich stelle mir vor, dass die Silvesterparty im Hauptquartier am Morgen des 1. Januar 2000 lebhaft war.
Kevin,
26

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

Wo ist disaster.bat?

@echo off
Start ""  "C:\Program Files (x86)\Internet Explorer\iexplore.exe"
Juan Sebastian Lozano
quelle
11
Verstehe ich richtig, dass Internet Explorer Ihre Katastrophe ist? +1
Justin
12
Ja, der Internet Explorer ist meine Katastrophe: P
Juan Sebastian Lozano
Nicht unternehmensfähig genug, da der Pfad zum Internet Explorer fest codiert ist. Es startet beispielsweise nicht mit einer 32-Bit-Version von Windows.
Anzeigename
5
Code, der ein Y2K-Problem hat und Windows 64-Bit erfordert (die erste Version wurde 2001 veröffentlicht). Ich wusste nicht, dass Sie ein Y2K-Problem in Code haben können, für das Software erforderlich ist, die nach 2000 geschrieben wurde.
Konrad Borowski
1
Guter Punkt, aber es war ein Beispiel, das auf meiner Maschine getestet werden konnte. Im Jahr 2000 war der IE auch nicht so schlimm, also funktioniert der Witz auch nicht wirklich ....
Juan Sebastian Lozano
25

Ruby, Code Golf (31 Zeichen)

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

Es soll nichts tun. Der Fehler ist ziemlich "spektakulär" (auf alten Unix-Systemen ohne die Option "root" beibehalten) :-)

Türknauf
quelle
22
WARNUNG. LÄUFE DIESES NICHT LOL.
Cruncher
das ist etwas gefährlich XD
Netorica
Uff. Was für ein Versager.
Charlie
Nicht wirklich originell, weil offensichtlich. Auch, wie Dennis schreibt : „[r] EAL Y2K Fehler sind über das Jahr als 2-stellige Zahl dargestellt wird.“
Wchargin
10

Ruby (962 Zeichen)

Um ehrlich zu sein, die Katastrophen hier sehen nicht authentisch aus. Ich habe beschlossen, etwas zu machen, das mehr ... ähm ... legitim zu sein scheint. Der Code ist The Daily WTF würdig, aber ansonsten ist es glaubwürdig (wenn Sie in einer schrecklich schlechten Programmierfirma arbeiten).

Warnung: Dieser Code ist gefährlich und zerstört Ihren Computer (wenn Sie keinen --no-preserve-rootSchutz haben ). Renne nicht.

# 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
quelle
Vorsicht, sonst zirkuliert dies als Zerstörungsvirus.
8

Sch

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

Lügen ist eine sehr schreckliche Sache :)

ike
quelle
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);
    }        
}
Jack
quelle
1
Nooooooo! Der Horror!!!! 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

Dies funktioniert unter Slackware Linux 4.0 (freigegeben im Mai 1999) wie vorgesehen - bis es Dateien gibt, die zuletzt im Jahr 2000 geändert wurden und von alten Versionen aus dem Jahr 1999 überschrieben wurden!

PleaseStand
quelle
4

SQL

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

Leider hat diese Tabelle einige "Merkmale" vom vorherigen System geerbt. Eines davon war ein zweistelliges Feld für das Kündigungsjahr.

Sack
quelle
4

Java + SQL

Ich denke, dies entspricht besser dem Ziel der Frage - dh unbeabsichtigtes Brechen.

Nehmen wir an, dies ist eine Anwendung für ein Geburtsregister, in dem Neugeborene in einer Datenbank erfasst und Geburtsurkunden ausgestellt werden. Einige "Genies" haben den Tisch so gestaltet:

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

Und die Java-Anwendung zum Registrieren von Geburten enthält folgenden Code:

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

Dann würde das INSERT im Jahr 2000 scheitern und niemand könnte mehr eine Geburtsurkunde bekommen. Grund - java.util.Date # getYear () gibt das Jahr minus 1900 zurück, das ab 2000 aus 3 Ziffern besteht.

aditsu
quelle
4

Ich bin kein Programmierer, aber ich lese gerne diese Beiträge, um zu sehen, was andere talentierte Leute (und für die Lacher) einfallen. Das gelegentliche Shell-Skript ist ungefähr so ​​nah, wie ich es mit der wahren Codierung kenne. Hier ist eine für den Mix:

Bash

#!/bin/bash

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

exit 0
OwenITGuy
quelle
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());
    }
}

Was ist los:

Hey, ein Zufallsgenerator! Cool! Ich kann es für ... ähm ... naja, es ist egal.

Dieses Programm verwendet den Wert time_t plus eine völlig zufällige Konstante, um einen Startwert zu generieren. Leider wird dieser Wert am 01.01.2000 höher als 2.147.483.647, was der intGrenzwert ist. Konvertieren time_terzeugt eine integer overflow. Math.LogOhne die Funktion, die nun versucht, den Logarythmus einer negativen Größe zu berechnen, wäre dies kein Problem gewesen , was unmöglich ist. Samen wird NaNund die folgende Anweisung schlägt fehl.

BEARBEITEN: Eine nicht benötigte Codezeile wurde entfernt, das Erbe einer früheren Lösung, die ich vor dem Schreiben dieser Lösung aufgegeben habe.

Vereos
quelle
2

Sch

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

soll drucken sh: \: command not found, bricht schrecklich nach 2000

mniip
quelle
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);
        }
    }
}

Dieses Programm ist aufgrund von zweistelligen Jahren fehlerhaft. Buchstäblich.

Hinweis: Stellen Sie sicher, dass Sie alle Daten gespeichert haben, bevor Sie dies ausführen, oder erzwingen Sie ein Prozesslimit. Dies wird eine Gabelbombe laufen,

wei2912
quelle
2

Python 343 Zeichen

947 Zeichen mit Kommentaren, 343 Zeichen ohne Kommentare

Ich bin mir ziemlich sicher, dass dies tatsächlich Probleme verursacht hat (und das seit 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)
HolySquirrel
quelle
1

C ++ - 194 Zeichen

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

Bei 2000 wird die Meldung angezeigt, dass Ihr Computer nicht mit Y2K kompatibel ist und heruntergefahren wird.


quelle
1
Es ist 2000 , nicht 2014.
wie
1

Sch

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

Das ist harmlos, seit wir im Jahr 2013 sind. Probieren Sie es aus;).

HINWEIS: Der obige Kommentar war ein Witz , das obige SH-Skript ist extrem gefährlich und wird wahrscheinlich Ihr System ruinieren.

C1D
quelle
Sie brauchen ;vor then, meine hast du wirklich auch , es zu druckensh: rm -rf ~: command not found
mniip
@mniip danke dafür. Ich war schon eine Weile nicht mehr auf Linux, deshalb sind meine Schlagfertigkeiten etwas verrostet.
C1D
6
du hättest es testen können;)
Mittwoch,
1

Oracle SQL

ORDERSEnthält Informationen zur Abwicklung von Versandkatalogbestellungen. Jeder order_idkann mehrere Transaktionen haben (angelegt, bearbeitet, erledigt, storniert)

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

Behalten Sie nur die letzte Transaktion pro Bestellung bei:

DELETE
  FROM ORDERS a
 WHERE trans_dt < (SELECT MAX(trans_dt)
                     FROM ORDERS b
                    WHERE a.order_id = b.order_id)
Joe
quelle