西暦2000年災害の作成[終了]


13

あなたのプログラムはあなたが望むものを何でもすることができます。唯一の条件は、日付が2000年より前である場合に期待どおりに実行されその後で劇的に失敗することです。思いのままに見事に定義します。

最初のY2Kを逃したすべての人々のために、ここにあなたのチャンスがあります!

最高得点で答えます。


3
私はこれまでのところ答えが好きでしたが、「意図的ではない」ように見えるものを本当に探していました。
ike

うーん...私はどうやってそのようなものを作ることができるか考えようとします;-)
ドアノブ

1899年にはどうなりますか?または、紀元前573年のようなものですか?未定義の動作?
コンラッドボロスキー

4
私は誰のは、実際の「バグ」を作成するために管理しようとしている場合、上位のいくつかは、「日付> 1999災害をすれば、」答えはただ基本的に票を投じたのかしら
w4etwetewtwetを

回答:


30

Python

実際のY2Kバグは、約1年が2桁の数字で表されています。そして、その数が0にオーバーフローしたときに何か間違ったことをします。この核ミサイル監視犬のように、60秒以内にHQからハートビートメッセージを受信しなかった場合、すべてのICBMを起動します。

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

disaster.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問題があり、Windows 64ビットを必要とするコード(最初のリリースは2001年にリリースされました)。2000
Konrad Borowski

1
公正なポイントですが、それは私のマシンでテストできる例でした。戻る2000年に、IEはないすべてが悪いのどちらか、冗談が本当にどちらか動作しませんので....だった
フアン・セバスティアン・ロサノ

25

ルビー、コードゴルフ(31文字)

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

何もしないはずです。失敗はかなり「壮観」です(preserve rootフラグのない古いUnixシステムで):-)


22
警告。この笑を実行しないでください。
ランチャー

これはやや危険なXD
Netorica

ウーフ。なんて失敗だ。
チャーリー

明らかだから本当にオリジナルではない。また、Dennisが書いているように、「[r] eal Y2Kバグは、2桁の数字で表される年についてです。」
wchargin 14年

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
いやぁ!ホラー!!!!なんてこった!
WallyWest 14年

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年5月リリース)で意図したとおりに機能します。2000年に最後に変更されたファイルが1999年以降の古いバージョンで上書きされるまでです。


4

SQL

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

残念ながら、このテーブルは以前のシステムからいくつかの「特性」を継承していました。その1つは、終了年を保持する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年にINSERTが失敗し始め、だれも出生証明書を取得できなくなりました。理由-java.util.Date#getYear()は、2000から始まる3桁の年から1900を引いた値を返します。


4

私はプログラマーではありませんが、これらの投稿を読んで、他の才能のある人々が何を思いついたのかを見るのが好きです(そして笑いのために)。ときどきシェルスクリプトは、私が真のコーディングに近づくのとほぼ同じです。ミックス用の1つを次に示します。

バッシュ

#!/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のこの値は、int制限である2,147,483,647よりも高くなります。変換time_tするとinteger overflow。これはMath.Log、負の量の対数を計算しようとする関数ではなく、不可能な場合は問題になりませんでした。シードがNaNなり、次の命令が失敗します。

編集:不要なコード行を削除しました。これは、このソリューションを書く前に放棄した以前のソリューションの遺産です。


2

sh

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

印刷することになっていてsh: \: command not found、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);
        }
    }
}

このプログラムは2桁の年のために失敗します。文字通り。

注:これを実行する前にすべてのデータを保存したことを確認するか、プロセス制限を実施してください。これはフォークボムを実行します


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を使用していないので、私のbashスキルは少し錆びています。
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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.