Y2K felaketi oluşturma [kapalı]


13

Programınız istediğiniz her şeyi yapabilir. Tek şartı beklendiği gibi gerçekleştirmek olduğunu eğer tarih öncedir 2000 ve olağanüstü sonra başarısız olur. İstediğiniz gibi muhteşem bir şekilde tanımlayın .

İlk Y2K'yı kaçıran herkes için işte şansın!

En yüksek puanı kazanan cevap.


3
Şimdiye kadar cevapları seviyorum, ama gerçekten "kasıtsız" görünen bir şey arıyordum.
Aralık'ta ike

Hmmm ... Böyle bir şeyi nasıl yapabileceğimi düşünmeye çalışacağım ;-)
Doorknob

1899'da ne olmalı? Yoksa MÖ 573 gibi bir şey mi? Tanımsız davranış?
Konrad Borowski

4
Herkes gerçek bir "hata" oluşturmak
başaracak

Yanıtlar:


30

piton

Gerçek Y2K hataları, yaklaşık 2 haneli bir sayı olarak temsil edilen yıllardır. Ve bu sayı 0'a düştüğünde yanlış bir şey yapmak. Bu nükleer füze bekçisi gibi, 60 saniyede HQ'dan kalp atışı mesajı almazsak tüm ICBM'leri başlatır.

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
Çok sorumsuz, ama evet. +1
ike

1
Merkezdeki Yılbaşı Partisi'nin 1 Ocak 2000 sabahı canlı olduğunu hayal ediyorum.
Kevin

26

Java ve 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 nerede

@echo off
Start ""  "C:\Program Files (x86)\Internet Explorer\iexplore.exe"

11
Internet Explorer'ın felaketiniz olduğunu doğru anladım mı? +1
Justin

12
Evet, Internet Explorer benim felaketim: P
Juan Sebastian Lozano

Yeterince kurumsal değil, çünkü Internet Explorer'a giden yol sabit kodlanmış. Örneğin, Windows'un 32 bit sürümünde başlamaz.
Görünen Ad

5
Y2K sorunu olan ve Windows 64 bit (ilk sürümü 2001'de piyasaya sürülen) gerektiren kod. 2000'den sonra yazılı yazılım gerektiren bir Y2K problemi olabileceğini bilmiyordum.
Konrad Borowski

1
Adil nokta, ama benim makine üzerinde test edilebilir bir örnek oldu. 2000 yılında, IE de o kadar da kötü değildi, bu yüzden şaka da gerçekten işe yaramıyor ....
Juan Sebastian Lozano

25

Ruby, kod golf (31 karakter)

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

Hiçbir şey yapmamalıydı. Hata oldukça "muhteşem" (kök bayrağı korumak olmayan eski Unix sistemlerde) :-)


22
UYARI. BU lol ÇALIŞTIRMAYIN.
Cruncher

bu biraz tehlikeli XD
Netorica

Oof. Ne başarısızlık.
Charlie

Gerçekten orijinal değil çünkü belli. Ayrıca, Dennis'in yazdığı gibi , "[2] eal Y2K hataları yaklaşık 2 basamaklı bir sayı olarak temsil ediliyor."
wchargin

10

Ruby (962 karakter)

Dürüst olmak gerekirse, buradaki felaketler gerçek görünmüyor. Daha fazla görünen ... bir şey yapmaya karar verdim. Kod Daily WTF layık, ama bunun dışında, inanılır (çok kötü bir programlama şirketinde çalışıyorsanız, yani).

Uyarı: Bu kod tehlikelidir ve bilgisayarınızı yok edecektir ( --no-preserve-rootkorumanız yoksa , yani). Koşma.

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

Dikkat edin, yoksa bu bir yıkım virüsü olarak dolaşacaktır.

8

SH

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

Yalan söylemek çok korkunç bir şey :)


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

Bu, Slackware Linux 4.0'da (Mayıs 1999'da piyasaya sürüldü) amaçlanan şekilde çalışır - en son 2000'de değiştirilen ve 1999'dan eski sürümler tarafından üzerine yazılan dosyalar olana kadar!


4

SQL

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

Ne yazık ki, bu tablo önceki sistemden bazı "özellikleri" miras aldı. Bunlardan biri fesih yılını tutmak için iki basamaklı bir alandır.


4

Java + SQL

Bence bu, sorunun amacına daha iyi uyuyor - yani kasıtsız kırılma.

Diyelim ki bu bir doğum kayıt için bir uygulama, bir veritabanında yeni doğan bebekler kaydetmek ve doğum sertifikaları vermek için bir uygulama. Bazı "dahi" tabloyu şöyle tasarladı:

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

Ve doğumları kaydetmek için java uygulamasının aşağıdaki satırlarda bazı kodları vardır:

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

Ardından INSERT 2000 yılında başarısız olmaya başlayacaktı ve artık kimse doğum belgesi alamadı. Sebep - java.util.Date # getYear (), eksi 1900 yılını döndürür ve 2000'de başlayan 3 rakama sahiptir.


4

Ben bir programcı değilim, ama diğer yetenekli insanların (ve kahkahalar için) geldiklerini görmek için bu yazıları okumayı seviyorum. Ara sıra kabuk betiği gerçek kodlamaya geldiğim kadar yakın. İşte karışım için bir tane:

darbe

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

Ne oluyor:

Hey, rastgele bir sayı üreticisi! Güzel! Bunu ... ehm ... için kullanabilirim, önemli değil.

Bu program, bir tohum oluşturmak için time_t değeri artı tamamen rastgele bir sabit kullanır. Ne yazık ki, 2000/01/01 tarihinde bu değer, intsınır olan 2.147.483.647'den daha yüksek olur . Dönüştürme bir time_türetir integer overflow. Bu, Math.Logişlev için olmasaydı, şimdi negatif bir miktarın mantıksallığını hesaplamaya çalışan, bu imkansız olan bir sorun olmazdı . Tohum olur NaNve aşağıdaki talimat başarısız olur.

DÜZENLEME: Gereksiz bir kod satırı, bunu yazmadan önce terk ettiğim önceki bir çözümün mirası kaldırıldı.


2

sh

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

yazdırması gerekiyordu sh: \: command not found, 2000'den sonra çok kırılıyor


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

Bu program iki basamaklı yıl nedeniyle bozulur. Kelimenin tam anlamıyla.

Not: Bunu çalıştırmadan önce tüm verileri kaydettiğinizden emin olun veya bir işlem sınırı uygulayın. Bu bir çatal bomba çalıştırır,


2

Python 343 karakterler

947 karakter yorumlu, 343 karakter yorumsuz

Bunun gerçek sorunlara (ve geçmişte 2000) neden olduğuna eminim.

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

2000'de, bilgisayarınızın Y2K ve kapatma ile uyumlu olmadığını belirten bir mesaj görüntüler.


1
O var 2000 değil, 2014
ike

1

SH

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

2013'te olduğumuzdan beri bu zararsızdır. Kendiniz deneyin;).

NOT: Yukarıdaki yorum bir şakaydı , yukarıdaki SH betiği son derece tehlikelidir ve muhtemelen sisteminizi mahvedecektir.


daha ;önce ihtiyacınız var then, ayrıca gerçekten yazdırmak istedinizsh: rm -rf ~: command not found
mniip

@mniip bunun için teşekkürler. Bir süredir linux'da bulunmadım, bu yüzden bash becerilerim biraz paslı.
C1D

6
test edebilirdiniz;)
13'te

1

Oracle SQL

ORDERSposta siparişi katalog siparişlerinin işlenmesine ilişkin bilgiler içerir. Her order_idbirinin birden fazla işlemi olabilir (oluşturulmuş, işlenmiş, yerine getirilmiş, iptal edilmiş)

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

Sipariş başına yalnızca en son işlemi sakla:

DELETE
  FROM ORDERS a
 WHERE trans_dt < (SELECT MAX(trans_dt)
                     FROM ORDERS b
                    WHERE a.order_id = b.order_id)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.