Y2K 재해 만들기 [닫기]


13

당신의 프로그램은 당신이 원하는 무엇이든 할 수 있습니다. 유일한 조건은 날짜가 2000 이전 인 경우 예상대로 수행되고 이후에 실패 한다는 것 입니다. 그러나 원하는대로 훌륭하게 정의하십시오 .

첫 번째 Y2K를 놓친 모든 사람들에게 기회가 여기 있습니다!

가장 높은 점수로 승리하십시오.


3
나는 지금까지 답변을 좋아하지만 실제로는 "의도하지 않은"것을 찾고있었습니다.
ike

흠 ... 나는 어떻게 그런 식으로 만들 수 있을지 생각하려고 노력할 것이다 ;-)
Doorknob

1899 년에 어떻게됩니까? 아니면 기원전 573 년? 정의되지 않은 동작?
Konrad Borowski 2014

4
누군가가 실제 "버그"를 생성 할 것인지 궁금하다면, 가장 많이 투표 된 답변 중 일부는 기본적으로 "1999 년이 재난을
일으킨다면

답변:


30

파이썬

실제 Y2K 버그는 연도가 약 2 자리 숫자로 표시됩니다. 이 숫자가 0으로 넘칠 때 잘못된 일이 있습니다.이 핵 미사일 워치 독과 같이 60 초 안에 본사에서 하트 비트 메시지를받지 못하면 모든 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
본부 신년 전야 파티가 2000 년 1 월 1 일 아침에 활기
Kevin

26

자바와 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
Juan Sebastian Lozano

Internet Explorer에 대한 경로가 하드 코드되어 있기 때문에 엔터프라이즈가 충분하지 않습니다. 예를 들어 32 비트 버전의 Windows에서는 시작되지 않습니다.
표시 이름

5
Y2K 문제가 있고 Windows 64 비트 (2001 년 첫 번째 릴리스가 릴리스 된)가 필요한 코드입니다. 2000 년 이후에 작성된 소프트웨어를 요구하는 코드에서 Y2K 문제가 발생할 수 있다는 것을 몰랐습니다.
Konrad Borowski

1
좋은 점이지만 내 컴퓨터에서 테스트 할 수있는 예였습니다. 2000 년에 IE는 그다지 나쁘지 않았으므로 농담은 실제로 작동하지 않습니다 ....
Juan Sebastian Lozano

25

루비, 코드 골프 (31 문자)

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

아무것도하지 않아야합니다. 실패는 꽤 "경험적"입니다 (유지 루트 플래그가없는 오래된 유닉스 시스템에서) :-)


22
경고. 이 롤을 실행하지 마십시오.
Cruncher

이것은 다소 위험한 XD
Netorica

돈. 이 얼마나 실패.
Charlie

명백하기 때문에 실제로 독창적이지는 않습니다. 또한 Dennis가 쓴 것처럼 "Y2K 버그는 연도가 약 2 자리 숫자로 표시됩니다."
wchargin 님이

10

루비 (962 자)

솔직히 말해서 여기의 재앙은 정통으로 보이지 않습니다. 좀 더 ... 합법적으로 보이는 것을 만들기로 결정했습니다. 이 코드는 데일리 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

자바 스크립트

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

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)

불행히도이 테이블은 이전 시스템의 일부 "특성"을 상속했습니다. 그 중 하나는 해지 연도를 유지하기위한 두 자리 필드였습니다.


4

자바 + 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, ...);
}

그런 다음 INSERT는 2000 년에 실패하기 시작했으며 더 이상 출생 증명서를받을 수 없었습니다. 이유-java.util.Date # getYear ()는 연도에서 1900을 뺀 값을 반환하며 2000에서 3 자리 숫자로 시작합니다.


4

나는 프로그래머가 아니지만 다른 재능있는 사람들이 무엇을 생각해 내는지 (그리고 웃음을 위해)이 게시물을 읽는 것을 좋아합니다. 간혹 쉘 스크립트는 내가 진정한 코딩에 가깝습니다. 혼합에 대한 하나는 다음과 같습니다.

세게 때리다

#!/bin/bash

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

exit 0

3

씨#

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의이 값은 2,147,483,647보다 높아져 int한계입니다. 변환 time_t하면을 생성합니다 integer overflow. Math.Log함수 가 아닌 경우에는 문제가되지 않았으며, 이제 음수의 로그를 계산하려고 시도하기 때문에 불가능합니다. 씨가 NaN되고 다음 명령이 실패합니다.

편집 : 불필요한 코드 줄을 제거했습니다.이 솔루션을 작성하기 전에 포기한 이전 솔루션의 유산입니다.


2

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

인쇄하기로되어 있으며 sh: \: command not found2000 년 이후 끔찍하게 부서짐


2

#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

파이썬 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
그것은의 2,000 하지, 2014
아이크

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 감사합니다. 나는 한동안 리눅스를 사용하지 않았기 때문에 내 배쉬 기술은 조금 녹슬었다.
C1D

6
당신은 그것을 테스트 할 수 있었다;)
mniip

1

오라클 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.