Buat bencana Y2K [ditutup]

13

Program Anda dapat melakukan apa pun yang Anda inginkan. Satu-satunya syarat adalah bahwa ia berkinerja seperti yang diharapkan jika tanggalnya sebelum tahun 2000 , dan gagal secara spektakuler sesudahnya. Tetapkan secara spektakuler apa pun yang Anda inginkan.

Untuk semua orang yang melewatkan Y2K pertama, inilah kesempatan Anda!

Jawab dengan kemenangan skor tertinggi.

ike
sumber
3
Saya suka jawabannya sejauh ini, tetapi saya benar-benar mencari sesuatu yang terlihat "tidak disengaja".
ike
Hmmm ... Saya akan mencoba memikirkan bagaimana saya bisa membuat sesuatu seperti itu ;-)
Gagang Pintu
Apa yang harus terjadi pada 1899? Atau sekitar 573 SM? Perilaku tidak terdefinisi?
Konrad Borowski
4
Saya ingin tahu apakah ada yang akan berhasil membuat "bug" yang sebenarnya, beberapa jawaban yang terpilih pada dasarnya hanya "jika tanggal> 1999 melakukan bencana"
w4etwetewtwet

Jawaban:

30

Python

Bug Y2K asli sekitar tahun yang direpresentasikan sebagai angka 2 digit. Dan melakukan sesuatu yang salah ketika jumlah itu melonjak ke 0. Seperti pengawas rudal nuklir ini, meluncurkan semua ICBM jika kami belum menerima pesan detak jantung dari HQ dalam 60 detik.

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
sumber
1
Sangat tidak bertanggung jawab, tapi ya. +1
ike
1
Saya membayangkan pesta Tahun Baru di HQ berlangsung ramai pada pagi hari tanggal 1 Januari 2000.
Kevin
26

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

Di mana disaster.bat berada

@echo off
Start ""  "C:\Program Files (x86)\Internet Explorer\iexplore.exe"
Juan Sebastian Lozano
sumber
11
Apakah saya mengerti benar bahwa Internet Explorer adalah bencana Anda? +1
Justin
12
Ya, Internet Explorer adalah bencana saya: P
Juan Sebastian Lozano
Tidak cukup perusahaan, karena jalur ke Internet Explorer adalah hardcode. Itu tidak akan mulai pada versi 32-bit Windows, misalnya.
Nama Tampilan
5
Kode yang memiliki masalah Y2K, dan membutuhkan Windows 64-bit (rilis pertama dirilis pada tahun 2001). Saya tidak tahu Anda dapat memiliki masalah Y2K dalam kode yang memerlukan perangkat lunak yang ditulis setelah tahun 2000.
Konrad Borowski
1
Titik yang adil, tetapi itu adalah contoh yang bisa diuji pada mesin saya. Kembali pada tahun 2000, IE juga tidak terlalu buruk, jadi leluconnya tidak benar-benar berfungsi ....
Juan Sebastian Lozano
25

Ruby, kode golf (31 karakter)

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

Seharusnya tidak melakukan apa pun. Kegagalannya cukup "spektakuler" (pada sistem Unix lama tanpa mempertahankan root flag) :-)

Gagang pintu
sumber
22
PERINGATAN. JANGAN LARI INI lol.
Cruncher
ini agak berbahaya XD
Netorica
Oof. Kegagalan.
Charlie
Tidak terlalu asli karena jelas. Juga, seperti yang ditulis Dennis , "bug Y2K asli sekitar tahun yang direpresentasikan sebagai angka 2 digit."
wchargin
10

Ruby (962 karakter)

Sejujurnya, bencana di sini tidak terlihat asli. Saya memutuskan untuk membuat sesuatu yang tampaknya lebih ... uhm ... sah. Kode ini adalah The Daily WTF yang layak, tetapi selain itu, dapat dipercaya (jika Anda bekerja di perusahaan pemrograman yang sangat buruk, itu).

Peringatan: Kode ini berbahaya, dan itu akan merusak komputer Anda (jika Anda tidak memiliki --no-preserve-rootperlindungan, itu adalah). Jangan lari.

# 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
sumber
Waspadalah, atau ini akan beredar sebagai virus perusak-barang.
8

SH

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

Berbohong adalah hal yang sangat mengerikan :)

ike
sumber
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);
    }        
}
Mendongkrak
sumber
1
Tidaaaaaak! Menyeramkan!!!! 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

Ini berfungsi sebagaimana dimaksud pada Slackware Linux 4.0 (dirilis Mei 1999) - hingga ada file yang terakhir dimodifikasi pada tahun 2000, yang ditimpa oleh versi lama dari tahun 1999!

PleaseStand
sumber
4

SQL

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

Sayangnya, tabel ini mewarisi beberapa "karakteristik" dari sistem sebelumnya. Salah satunya adalah bidang dua digit untuk mengadakan tahun penghentian.

menyodok
sumber
4

Java + SQL

Saya pikir ini cocok dengan tujuan dari pertanyaan yang lebih baik - yaitu kerusakan yang tidak disengaja.

Katakanlah ini adalah aplikasi untuk pencatatan kelahiran, di mana mereka merekam bayi yang baru lahir dalam database dan mengeluarkan akta kelahiran. Beberapa "genius" mendesain meja agak seperti ini:

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

Dan aplikasi java untuk mendaftarkan kelahiran memiliki beberapa kode di sepanjang baris:

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

Kemudian INSERT akan mulai gagal pada tahun 2000 dan tidak ada yang bisa mendapatkan akta kelahiran lagi. Alasan - java.util.Date # getYear () mengembalikan tahun minus 1900, yang memiliki 3 digit mulai tahun 2000.

aditsu berhenti karena SE adalah JAHAT
sumber
4

Saya bukan seorang programmer, tapi saya suka membaca posting-posting ini untuk melihat apa yang orang-orang berbakat lainnya (dan untuk tertawa). Skrip shell sesekali sekitar sedekat saya sampai pada pengkodean yang benar. Ini satu untuk campuran:

Pesta

#!/bin/bash

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

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

Apa yang terjadi:

Hei, generator angka acak! Keren! Saya bisa menggunakannya untuk ... ehm ... yah, tidak masalah.

Program ini menggunakan nilai time_t plus konstanta yang benar-benar acak untuk menghasilkan sebuah seed. Sayangnya, nilai ini pada 2000/01/01 menjadi lebih tinggi dari 2.147.483.647 yang merupakan intbatasnya. Konversi time_tmenghasilkan integer overflow. Ini tidak akan menjadi masalah jika bukan karena Math.Logfungsinya, yang mencoba sekarang untuk menghitung logarythm dari kuantitas negatif, yang tidak mungkin. Benih menjadi NaNdan instruksi berikut gagal.

EDIT: Menghapus sebaris kode yang tidak dibutuhkan, warisan solusi sebelumnya yang saya tinggalkan sebelum menulis yang ini.

Vereos
sumber
2

SH

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

seharusnya mencetak sh: \: command not found, rusak parah setelah tahun 2000

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

Program ini gagal karena dua tahun digit. Secara harfiah.

Catatan: Pastikan Anda telah menyimpan semua data sebelum menjalankan ini atau menerapkan batas proses. Ini akan menjalankan bom fork,

wei2912
sumber
2

Python 343 karakter

947 karakter dengan komentar, 343 karakter tanpa komentar

Saya agak yakin yang satu ini telah menyebabkan masalah aktual (dan melewati tahun 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)
Tupai Suci
sumber
1

C ++ - 194 Karakter

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

Pada 2000, itu akan menampilkan pesan bahwa komputer Anda tidak kompatibel dengan Y2K dan shutdown.


sumber
1
Ini tahun 2000 , bukan 2014.
seperti
1

SH

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

Ini tidak berbahaya sejak kita di tahun 2013. Cobalah sendiri;).

CATATAN: Komentar di atas adalah lelucon , skrip SH di atas sangat berbahaya dan mungkin akan merusak sistem Anda.

C1D
sumber
kamu membutuhkan ; sebelumnya then, juga apakah Anda benar-benar bermaksud untuk mencetaksh: rm -rf ~: command not found
mniip
@niip terima kasih untuk itu. Saya belum berada di linux untuk sementara waktu sehingga kemampuan bash saya sedikit berkarat.
C1D
6
Anda bisa mengujinya;)
mniip
1

Oracle SQL

ORDERSberisi informasi yang berkaitan dengan pemrosesan pesanan katalog pesanan melalui pos. Masing order_id- masing dapat memiliki beberapa transaksi (dibuat, diproses, dipenuhi, dibatalkan)

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

Pertahankan hanya transaksi terbaru per pesanan:

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