Crear un desastre Y2K [cerrado]


13

Su programa puede hacer lo que quiera. La única condición es que funcione como se esperaba si la fecha es anterior a 2000 , y falla espectacularmente después. Define espectacularmente como quieras.

Para todas aquellas personas que se perdieron el primer Y2K, ¡esta es su oportunidad!

Responda con la puntuación más alta gana.


3
Hasta ahora me gustan las respuestas, pero realmente estaba buscando algo que pareciera "involuntario".
ike

Hmmm ... Trataré de pensar en cómo podría hacer algo así ;-)
Pomo de la puerta

¿Qué debería pasar en 1899? ¿O algo así como 573 aC? Comportamiento indefinido?
Konrad Borowski

44
Me pregunto si alguien logrará crear un "error" real, algunas de las respuestas más votadas son básicamente "si la fecha> 1999 es un desastre"
w4etwetewtwet

Respuestas:


30

Pitón

Los errores reales del año 2000 se representan aproximadamente en el año como un número de 2 dígitos. Y hacer algo mal cuando ese número se desborda a 0. Como este perro guardián de misiles nucleares, que lanza todos los ICBM si no hemos recibido un mensaje de corazón en 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
Muy irresponsable, pero sí. +1
ike

1
Me imagino que la fiesta de Nochevieja en HQ fue animada la mañana del 1 de enero de 2000.
Kevin

26

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

Donde está desastre.bat

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

11
¿Entiendo correctamente que Internet Explorer es tu desastre? +1
Justin

12
Sí, Internet Explorer es mi desastre: P
Juan Sebastian Lozano

No es lo suficientemente empresarial, porque la ruta a Internet Explorer está codificada. No se iniciará en la versión de Windows de 32 bits, por ejemplo.
Nombre para mostrar el

55
Código que tiene un problema Y2K y requiere Windows de 64 bits (la primera versión de la cual se lanzó en 2001). No sabía que puede tener un problema Y2K en el código que requiere software escrito después de 2000.
Konrad Borowski

1
Punto justo, pero fue un ejemplo que podría probarse en mi máquina. En 2000, IE tampoco era tan malo, por lo que la broma tampoco funciona ...
Juan Sebastian Lozano

25

Ruby, código golf (31 caracteres)

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

Se supone que no debe hacer nada. El fallo es bastante "espectacular" (en sistemas Unix antiguos sin el indicador raíz de preservar) :-)


22
ADVERTENCIA. NO EJECUTE ESTE jajaja.
Cruncher

esto es algo peligroso XD
Netorica

Oof Que fracaso
Charlie

No es realmente original porque es obvio. Además, como escribe Dennis , "[los errores reales del año 2000 son aproximadamente el año que se representa como un número de 2 dígitos".
wchargin

10

Rubí (962 caracteres)

Para ser sincero, los desastres aquí no parecen auténticos. Decidí hacer algo que parece más ... uhm ... legítimo. El código es digno de The Daily WTF, pero aparte de eso, es creíble (si trabajas en una empresa de programación terriblemente mala, claro).

Advertencia: este código ES peligroso y destruirá su computadora (si no tiene --no-preserve-rootprotección, eso es). No corras.

# 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, o esto circulará como un virus de destrucción.

8

SH

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

Mentir es una cosa muy terrible :)


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

Esto funciona según lo previsto en Slackware Linux 4.0 (lanzado en mayo de 1999), ¡hasta que haya archivos modificados por última vez en 2000, que se sobrescriben con las versiones anteriores de 1999!


4

SQL

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

Desafortunadamente, esta tabla heredó algunas "características" del sistema anterior. Uno de los cuales era un campo de dos dígitos para contener el año de terminación.


4

Java + SQL

Creo que esto coincide mejor con el objetivo de la pregunta, es decir, la rotura involuntaria.

Digamos que esta es una aplicación para un registro de nacimientos, donde registran a los recién nacidos en una base de datos y emiten certificados de nacimiento. Algunos "genios" diseñaron la tabla de esta manera:

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

Y la aplicación de Java para registrar nacimientos tiene un código similar al siguiente:

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

Luego, el INSERT comenzaría a fallar en el año 2000 y ya nadie podría obtener un certificado de nacimiento. Motivo: java.util.Date # getYear () devuelve el año menos 1900, que tiene 3 dígitos a partir de 2000.


4

No soy un programador, pero me gusta leer estas publicaciones para ver lo que otras personas talentosas inventan (y para las risas). El script de shell ocasional es lo más parecido a la verdadera codificación. Sin embargo, aquí hay uno para la mezcla:

Golpetazo

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

Qué esta pasando:

¡Hola, un generador de números aleatorios! ¡Frio! Puedo usarlo para ... ehm ... bueno, no importa.

Este programa utiliza el valor time_t más una constante totalmente aleatoria para generar una semilla. Desafortunadamente, este valor en 2000/01/01 se vuelve más alto que 2,147,483,647, que es el intlímite. La conversión time_tgenera un integer overflow. Esto no habría sido un problema si no fuera por la Math.Logfunción, que ahora trata de calcular el logarythm de una cantidad negativa, lo cual es imposible. La semilla se convierte NaNy la siguiente instrucción falla.

EDITAR: Se eliminó una línea de código innecesaria, legado de una solución anterior que abandoné antes de escribir esta.


2

sh

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

se supone que imprime sh: \: command not found, se rompe terriblemente después del 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 se arruina debido a años de dos dígitos. Literalmente.

Nota: Asegúrese de haber guardado todos los datos antes de ejecutar esto o imponer un límite de proceso. Esto ejecutará una bomba tenedor,


2

Python 343 caracteres

947 caracteres con comentarios, 343 caracteres sin comentarios

Estoy bastante seguro de que este ha causado problemas reales (y más allá del 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 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;}

En 2000, mostrará el mensaje de que su computadora no es compatible con Y2K y se apagará.


1
Es 2000 , no 2014.
ike

1

SH

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

Esto es inofensivo ya que estamos en 2013. Pruébalo tú mismo;).

NOTA: El comentario anterior fue una broma , el script SH anterior es extremadamente peligroso y probablemente arruinará su sistema.


lo que necesitabas ;antes then, también sh: rm -rf ~: command not found
querías

@mniip gracias por eso. No he estado en Linux por un tiempo, así que mis habilidades de bash están un poco oxidadas.
C1D

66
podrías haberlo probado;)
mniip

1

Oracle SQL

ORDERScontiene información relacionada con el procesamiento de pedidos por catálogo de pedidos por correo. Cada uno order_idpuede tener múltiples transacciones (creadas, procesadas, cumplidas, canceladas)

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

Conserve solo la transacción más reciente por pedido:

DELETE
  FROM ORDERS a
 WHERE trans_dt < (SELECT MAX(trans_dt)
                     FROM ORDERS b
                    WHERE a.order_id = b.order_id)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.