Criar um desastre para o ano 2000 [fechado]


13

Seu programa pode fazer o que você quiser. A única condição é que o desempenho seja o esperado se a data for anterior a 2000 e falhará espetacularmente depois. Defina espetacularmente como quiser.

Para todas as pessoas que perderam o primeiro Y2K, aqui está sua chance!

Responda com vitórias mais altas.


3
Até agora, gosto das respostas, mas estava procurando algo que parecia "não intencional".
ike

Hmmm ... Eu vou tentar pensar em como eu poderia fazer algo assim ;-)
Doorknob

O que deveria acontecer em 1899? Ou algo como 573 aC? Comportamento indefinido?
Konrad Borowski

4
Gostaria de saber se alguém conseguirá criar um "bug" real, algumas das principais respostas votadas são basicamente apenas "se a data> 1999 causar um desastre"
w4etwetewtwet 29/12/13

Respostas:


30

Pitão

Os erros reais do ano 2000 são representados no ano como um número de 2 dígitos. E fazer algo errado quando esse número ultrapassar os 0. Como esse cão de guarda de mísseis nucleares, lançar todos os ICBMs se não recebermos uma mensagem de pulsação do HQ em 60 segundos.

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
Muito irresponsável, mas sim. +1
ike

1
Eu imagino que a festa da véspera de Ano Novo no QG foi animada na manhã de 1º de janeiro de 2000. #
3131 Kevin Kevin

26

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

Onde disaster.bat está

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

11
Entendo corretamente que o Internet Explorer é seu desastre? +1
Justin

12
Sim, o Internet Explorer é o meu desastre: P
Juan Sebastian Lozano

Não é suficientemente corporativo, porque o caminho para o Internet Explorer é codificado. Não será iniciado na versão de 32 bits do Windows, por exemplo.
Exibir nome

5
Código com problema Y2K e requer Windows de 64 bits (cuja primeira versão foi lançada em 2001). Eu não sabia que você pode ter um problema Y2K no código que requer software escrito depois de 2000.
Konrad Borowski

1
Ponto justo, mas foi um exemplo que poderia ser testado na minha máquina. Em 2000, o IE também não era tão ruim assim, então a piada também não funciona ...
Juan Sebastian Lozano

25

Ruby, código de golfe (31 caracteres)

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

É suposto não fazer nada. A falha é bastante "espetacular" (em sistemas Unix antigos sem a bandeira de preservação de raiz) :-)


22
ATENÇÃO. NÃO EXECUTE ESTE lol.
Cruncher

isso é um pouco perigoso XD
Netorica

Oof. Que fracasso.
29413 Charlie

Não é realmente original porque óbvio. Além disso, como escreve Dennis , "os erros reais do Y2K são sobre o ano sendo representados como um número de 2 dígitos".
wchargin

10

Ruby (962 caracteres)

Para ser sincero, os desastres aqui não parecem autênticos. Eu decidi fazer algo que parece mais ... uhm ... legítimo. O código é digno do The Daily WTF, mas, além disso, é crível (se você trabalha em uma empresa de programação muito ruim).

Aviso: este código é perigoso e destruirá seu computador (se você não tiver --no-preserve-rootproteção, é isso). Não corra.

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

Cuidado, ou isso circulará como um vírus de destruição.

8

SH

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

Mentir é uma coisa muito terrível :)


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! O horror!!!! Arggghhhhghhhhhhh!
Wally West

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

Isso funciona como planejado no Slackware Linux 4.0 (lançado em maio de 1999) - até que haja arquivos modificados pela última vez em 2000, que são substituídos pelas versões antigas a partir de 1999!


4

SQL

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

Infelizmente, esta tabela herdou algumas "características" do sistema anterior. Um dos quais era um campo de dois dígitos para conter o ano de término.


4

Java + SQL

Eu acho que isso corresponde melhor ao objetivo da pergunta - ou seja, quebra não intencional.

Digamos que este seja um aplicativo para um registro de nascimento, onde eles gravam bebês recém-nascidos em um banco de dados e emitem certidões de nascimento. Alguns "gênios" projetaram a tabela mais ou menos assim:

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

E o aplicativo java para registrar nascimentos tem algum código ao longo das linhas de:

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

Então o INSERT começaria a falhar no ano 2000 e ninguém mais poderia obter uma certidão de nascimento. Razão - java.util.Date # getYear () retorna o ano menos 1900, que possui três dígitos a partir de 2000.


4

Não sou programador, mas gosto de ler essas postagens para ver o que outras pessoas talentosas inventam (e para as risadas). O script shell ocasional é o mais próximo que chego da codificação verdadeira. Aqui está um para a mistura:

Bater

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

O que está acontecendo:

Ei, um gerador de números aleatórios! Legal! Eu posso usá-lo para ... ehm ... bem, isso não importa.

Este programa usa o valor time_t mais uma constante totalmente aleatória para gerar uma semente. Infelizmente, esse valor em 01/01 2000 se torna maior que 2.147.483.647, que é o intlimite. A conversão time_tgera um integer overflow. Isso não teria sido um problema se não fosse pelaMath.Log função, que tenta agora calcular o logarma de uma quantidade negativa, o que é impossível. A semente se torna NaNe a instrução a seguir falha.

EDIT: Removida uma linha de código desnecessária, herdada de uma solução anterior que eu abandonei antes de escrever esta.


2

sh

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

deveria imprimir sh: \: command not found, quebra terrivelmente depois de 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);
        }
    }
}

Este programa estraga tudo devido a dois dígitos do ano. Literalmente.

Nota: Verifique se você salvou todos os dados antes de executar isso ou imponha um limite de processo. Isto irá executar uma bomba de garfo,


2

Python 343 caracteres

947 caracteres com comentários, 343 caracteres sem comentários

Estou bastante certo de que este causou problemas reais (e no ano 2000 até então).

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

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

Em 2000, ele exibirá a mensagem de que seu computador não é compatível com o Y2K e o desligamento.


1
É 2000 , não 2014.
ike

1

SH

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

Isso é inofensivo desde que estamos em 2013. Experimente você mesmo;).

NOTA: O comentário acima foi uma piada , o script SH acima é extremamente perigoso e provavelmente arruinará seu sistema.


você precisa ;antes then, também que você realmente quer dizer isso para imprimirsh: rm -rf ~: command not found
mniip

@ mniip obrigado por isso. Eu não estou no Linux há um tempo, então minhas habilidades no bash estão um pouco enferrujadas.
C1D

6
você poderia tê-lo testado;)
mniip 28/12/2013

1

Oracle SQL

ORDERScontém informações referentes ao processamento de pedidos de catálogo de pedidos por correio. Cada um order_idpode ter várias transações (criadas, processadas, preenchidas, canceladas)

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

Reter apenas a transação mais recente por pedido:

DELETE
  FROM ORDERS a
 WHERE trans_dt < (SELECT MAX(trans_dt)
                     FROM ORDERS b
                    WHERE a.order_id = b.order_id)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.