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.


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

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"

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) :-)


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))

Vorsicht, sonst zirkuliert dies als Zerstörungsvirus.

8

Sch

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

Lügen ist eine sehr schreckliche Sache :)


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! 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!


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.


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.


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

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.


2

Sch

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

soll drucken sh: \: command not found, bricht schrecklich nach 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);
        }
    }
}

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,


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)

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.


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.


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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.