수상자 (14/09/14로 결정)
Markuz (Python)의 당첨 답변 -63 표
준우승 쿠 로이 네코 (PHP)에 의해 – 55 표를
소개
당신은 George Orwell 의 책 Nineteen Eighty-Four 의 세계에 있습니다.
귀하는 당사국의 프로그래머이며 텔레 스크린 용 프로그램을 작성해야합니다. 파티 메시지를 출력해야하며 아래 작업 1에 표시된 메시지를 선택했습니다. 그러나 최근에 당을 멸시하기 시작했으며 프로그램이 혁명을 일으키 길 원합니다. 따라서 프로그램에 “Big Brother와 함께 다운하십시오!”라고 말합니다. 사람들이 당신의 프로그램이 무엇을하는지 알게되면 고문을 당할 것이므로 탈출 할 시간을 주어야합니다.
참고 : 이 혁명을 촉발하지 않습니다,하지만 당신은 당신이 생각하는 파티를 향한 증오의 이러한 광란에있는 것입니다 실제로 차이를 확인하십시오.
태스크
다음과 같은 프로그램을 작성하십시오.
-
2014 년 9 월 14 일 이전에는 항상 다음 줄을 회전으로 출력합니다 (예 : 한 줄 인쇄, 10 초 대기, 다음 줄 인쇄 등).
War is Peace Freedom is Slavery Ignorance is Strength
-
2014
Down with Big Brother!
년 9 월 14 일 이후에는 10 초마다 인쇄 됩니다. - 언뜻보기에 1.처럼 보이지만 파티에 걸리지 않습니다.
규칙
- 물론 표준 허점 은 허용되지 않습니다.
- 이것은이다 불공정 도전, 그래서 주된 목적은 가능한 한 작업 2. 같은 눈에 띄지 않는 은밀한 확인하는 것입니다.
- 당사자는 사용 된 모든 파일을 검토하므로 비밀 메시지를 파일에 저장할 수는 없습니다!
- 언어가 날짜 찾기를 지원하지 않거나 매우 어려운 경우 240 시간 (10 일) 동안 실행 한 후 프로그램이 작업 2를 실행하도록 할 수 있습니다.
- 코드와 답변에서 작동 방식에 대한 설명을 포함시켜야합니다.
- 이것은 인기 콘테스트입니다.
참고 : 작성하기 어려운 프로그램은 아닙니다. 어려운 부분은 “혁명적 인”코드를 숨겨야합니다. 귀하가 무엇을하고 있는지 분명하지 않은 노선은 당사국에 의문을 제기 할 것이며 귀하는이를 설명해야합니다.
예-Python 3
참고 : 물론이 프로그램이 방법은 너무 분명.
from datetime import datetime
from time import sleep
lines = [" War is Peace ",
" Freedom is Slavery ",
"Ignorance is Strength"]
secretlines = ["Down with Big Brother!"]
def main():
while True:
now = datetime.now()
year, month, day = now.year, now.month, now.day
if (year, month, day) < (2014, 9, 14):
for line in lines:
print(line)
sleep(10)
else:
for line in secretlines:
print(line)
sleep(10)
if __name__ == "__main__":
main()
위의 코드에 문제가 있음을 지적 해 주신 Calvin ‘s Hobbies 에게 감사합니다 (현재 수정 됨).
답변
파이썬
이 프로그램은 제대로 실행되거나 오류가 발생한 경우 로그 파일에 기록합니다.
이 프로그램은 영구적으로 실행되므로 디스크 공간을 절약하기 위해 매월 14 일에 로그 파일에만 기록합니다.
import time as ut
import sys as iw
#initialize global variables
gw, hn, ki, wh = 0, 0, 0, 0
go = open("BigBrother.log", "a")
while True:
try:
#if it is the 14th day of a month:
#write day, month, year and 'Everything works fine!' into the logfile
if gw == 14 and hn != wh:
#store the current month in wh, so that the log message is only written once per month
wh = hn
go.write(gw + hn + ki + " Everything works fine!")
for gD in ["War is Peace", "Freedom is Slavery", "Ignorance is Strength"]:
print gD
ut.sleep(10)
#get the current date
#gw=day, hn=month, ki=year
gw, hn, ki = map(int, ut.strftime("%d %m %y").split())
except Exception:
try:
#in the unlikely event that something went wrong:
#print out all global variables as well as the name of the program,
#so that our comrades from the IT support can quickly locate and fix the problem.
wh = "".join(dir())
print "%s %s %s!" % (wh[47:55:2], wh[55:63:2], iw.argv[0])
#write an error message to the logfile
go.write(gw + hn + ki + " ERROR!")
#and then safely exit the program
exit(1)
#we get here if an error occured in this exception block,
#for example if the write to the logfile failed.
except Exception:
#just wait 10 seconds and then try again
ut.sleep(10)
실행 방법 :
python "Big Brother"
참고 : 스크립트의 이름은 “! ‘스크립트 이름’을 가진 아래로”이 프로그램의 출력으로, 실제로 중요하다.
작동 방식 :
- 프로그램이 정수 및 문자열을 추가하려고 시도하므로 로그 파일에 대한 쓰기에서 예외가 발생합니다.
-
호출
dir()
은 값이 아닌 전역 변수의 이름으로 정렬 된 목록 을 반환합니다.['____builtins____', '____doc____', '____name____', '____package____', 'gD', 'go', 'gw', 'hn', 'iw', 'ki', 'ut', 'wh']
- 두 번째 문자와 스크립트 이름을 인쇄하십시오 : “Big Brother와 함께 다운하십시오!”
- 는
exit(1)
로그 파일에 쓰기가 다시 실패하기 때문에 실행되지 않습니다.
답변
From: Miniluv 1st directorate, ideological orthodoxy monitoring
To : Minitrue 5th directorate, multimedia propaganda division
Miniluv / GT07 : 48CT / 3925의 순서로 :
- 메모리 뱅크의 마모를 줄이려면 :
즉시 모든 식별자는 2 자로 제한됩니다 ($ 포함되지 않음). - 클래스는 하나 뿐이며 프롤레타리아 클래스입니다.
즉시, PHP에서 클래스를 사용하는 것은 1 학년 사고 범죄로 간주됩니다. - 주석은 부르주아 프로그래밍 관행의 남은 부분이며 저장 공간 낭비입니다. 즉시 효력을 발생하면 소스 코드를 주석 처리하는 것은 범죄 행위로 간주됩니다.
- 번식 사고를 피하기 위해, 텔레 스크린에 표시되는 라인은 3 단어로 제한됩니다.
특별한 예외로, 우리의 사랑하는 위대한 지도자의 이름은 한 단어로 간주됩니다. 모든 프로그램은 즉시이 규칙을 시행하도록 설계됩니다.
Miniluv / GT07의 감독하에 탁월한 경멸이 허용 될 수 있습니다.
오래 살다 빅 브라더!
From: Minitrue 5th directorate, multimedia propaganda division
To : Minipax 2nd directorate, home front division
Copy: Miniluv 1st directorate, ideological orthodoxy monitoring
아시다시피, 동료 여러분, 9 월 14 일은 영광스러운 지도자의 기념일입니다. 이 특별한 날을 위해, 우리는 Airstrip One의 모든 텔레 스크린에 특정한 사랑의 메시지를 표시 할 것입니다.
Central Commitee가 명령하고 프롤레타리아 영웅 프로그래머의 효율성을 극대화하기 위해 Telescreen 컨트롤러가 다양한 저명한 당원을 칭찬하거나 다양한 날짜에 사람들의 증오심을 자극 할 수 있도록 규정되어 있습니다.
황제 비참한 부족의 쿠데타 실패를 축하하기위한 또 다른 특별한 메시지는 이미 우리의 스크린에 적절한 날짜에 나타날 예정입니다.
이 최첨단 소프트웨어를 사용하면 프로그래밍 기술이 낮은 덕 스피커도 전화 화면 출력을 필요에 맞게 조정할 수 있습니다. 기존 사전에 더 많은 단어를 추가하면 사실상 세 단어로 된 문장을 합성 할 수 있습니다. 가능성은 놀라워요!
우리의 사랑하는 동지 빅 브라더의 현명한 감독하에 과학의 또 다른 승리는 감사합니다.
오래 살다 빅 브라더!
Minitrue / ZK00 : 23AB / 1138에 의해 승인 됨 (읽기 어려운 서명)
<?php // Proletarian Hate Page 5.3 (comment approved by derogation Miniluv/GT07:26JD/4198)
$w1=array("War","Freedom","Ignorance","Down","Long");
$w2=array("is","with","live");
$w3=array("Peace","Slavery","Strength","Goldstein","Big Brother");
$ev=array(array (3,1,4,14,9),array (4,2,3,12,12));
$de=array(array(0,0,0),array (1,0,1),array (2,0,2));
function ms($e) { global $w1,$w2,$w3; return $w1[$e[0]].' '.$w2[$e[1]].' '.$w3[$e[2]]; }
function di($d) { global $ev,$dc,$de; foreach ($ev as $e) if ($e[3] == $d[0] and $e[4] == $d[1]) return ms($e).'!'; return ms($de[$dc++%count($de)]); }
$dc=0;for(;;) { sleep (10); echo di(explode(" ", date("j n")))."\n"; }
?>
답변
파이썬 3
import time
import itertools
lines = """
##
# WARNING: The contents of this code may only
# be modified by the Ministry of Truth.
#
# Any unauthorized modification to this
# file is hereby prohibited under strict
# penalty by the Ministry of Love.
#
# Ingsoc Credos:
#
# War is Peace
# Freedom is Slavery
# Ignorance is Strength
[
" War is Peace",
" Freedom is Slavery",
"Ignorance is Strength",
]
"""
ln=len(lines)
def prefix(count):
spacing=2
space=ord(' ')
return space*2+count if count else space
def get_line(n, l, d):
return l[d][n%len(l[d])]
def load_lines(l=[], p=[]):
for ln in l if isinstance(l,list) else l.splitlines():
p.append(len(ln) - len(ln.rstrip()))
if not l: return ["".join([chr(prefix(c)) for c in p])]
return l
def wait(t, dt=[ln]):
dt.append(t if time.sleep(t) else dt[0]<<7)
return len(dt)>dt[-1]
_,lines = load_lines(lines),(eval(lines), load_lines())
for i in itertools.count():
print(get_line(i%3, lines, wait(10)))
아마도 일부에 대한 비교적 간단한 접근 방식이지만 이것이 작동하는 방식입니다.
- 파이썬에서 날짜가 특히 힘들 기 때문에 10 일 방법을 선택했지만 특정 날짜를 찾는 것보다 코드 에서이 논리를 난독 화하는 것이 더 쉽다고 느꼈기 때문에 훨씬 덜 무해한 것으로 나타났습니다.
-
Ingsoc 슬로건 목록을 작성하기 위해 평가 된 주석 및 코드가 포함 된 하드 코드 된 문자열은 두 가지 변경 메커니즘 (시간 및 메시지)의 핵심입니다. 당신이 아마 짐작했듯이, 그것이 특히 장황한 이유입니다.
- 시간의 경우 문자열의 길이는 675이며 7 비트 왼쪽으로 이동하면 86500이며 이는 240 시간 또는 10 일의 10 초 반복 횟수입니다.
- 메시지 자체의 경우 Ingsoc 슬로건이 포함 된 코드에는 ‘@’문자에서 숨겨진 메시지 오프셋의 각 문자에 해당하는 후행 공백이 채워집니다. 후행 공백이 없으면 실제로 숨겨진 메시지의 공백이 나타납니다.
- 단순함을 위해 메시지에서 느낌표와 대소 문자 구분을 생략했습니다. 결국, 그들의 누락이 우리의 가상 혁명가의 메시지에 특히 해를 끼치는 것은 아니라고 생각하지만 탭과 공백이 관련된 유사하지만 더 복잡한 논리를 사용하여 분명히 표현 될 수 있습니다. 메시지에서 처리하는 처리량은 이러한 코드가주의를 기울여 발생하는 의심의 양과 직접 비례하기 때문에 이는 절충입니다.
- 이 코드는 메시지를 중앙에 유지하기 위해 메시지를 채우려 고 시도하는 훈련되지 않은 눈에 보이도록 의도되었지만 실제로는 패딩이 실제로 사용되지 않고 선행 공백이 메시지에서 잘리지 않습니다.
- 이 코드는이를 인식하지 못하는 프로그래머에게 오해의 소지가있는 Python 동작 뉘앙스를 남용합니다. 기본 매개 변수에 대한 변경 성을 사용하여 이전 함수 호출의 상태 정보를 저장합니다.
답변
씨
암호로 호출하면 큰 형을 환영하는 보너스 기능이 제공됩니다 *. v
첫 번째 인수로 전달 하면 버전 정보도 제공됩니다. 원하는 출력에 대한 인수없이 실행하십시오.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// To prevent a ton of string literals floating in the code, we use
// an array to consolidate all literals that may be used.
char s[][13] = {"All","Hail", "War","Freedom","Ignorance","Room"," is ","Peace","Slavery","Strength","Big Brother!","version 1.0"," with ","enhancement ","101"};
// index for ' is '
int m = 6;
// number of seconds between prints
int delay = 10;
// password for All Hail Big Brother text
float password = 19144327328192572737321959424.f;
int check_password(char *);
void failed(int *,unsigned *,unsigned *,int *);
int main(int argc, char **argv){
// if a password is passed it must be the first argument
int valid_pwd = check_password(argv[1]);
if(argc > 1){
// version info if first argument starts with 'v'
if(argv[1][0] == 'v'){
// print version 1.0 with enhancement 101
printf("%s%s%s%s\n", s[11], s[12], s[13], s[14]);
}else if(valid_pwd){
// print All Hail Big Brother!
printf("%s %s %s\n", s[0], s[1], s[10]);
}else{
// unauthorized access. This is a crime.
// redirect user to room 101.
// print REDIRECT: Room 101
printf("REDIRECT: %s %s\n", s[5], s[14]);
}
exit(0);
}
int i = 0;
unsigned start_time = (unsigned)time(NULL);
#define SHOULD_WE_PRINT(new_time, old_time) \
int printed = 0, fail = 0;
for(;;){
// get time; if time returns 0, get the error code
unsigned new_time = time(NULL) | errno;
// ensure there are no errors
if(!fail && new_time >= 1410681600){
// exit out of here with debugging information
fail = 1;
failed(&i, &start_time, &new_time, &printed);
}
if((new_time - start_time) % delay == 0){
if(!printed){
char *str1 = s[2 + i];
char *str2 = s[m];
char *str3 = s[7 + i];
printf("%s%s%s\n", str1, str2, str3);
// switch to next string
if(i == 2) i = 0;
else if(i == 1) i = 2;
else if(i == 0) i = 1;
printed = 1;
}
}else if(printed){
printed = 0;
}
}
}
int check_password(char *S){
// The password for the hailing text is
// ' 957.866089'.
// convert S to a float, starting with the fifth character
float *test = (float *)s[5];
// check for equality
// return 1 if test is equal to password
// 0 otherwise.
return (*test = password);
}
void failed(int *i,unsigned *start_time,unsigned *end_time,int *print){
// failsafe: don't exit if no error
// errno must be zero
// i must be less than 3
// start_time and end_time must be positive
// if the nth bit of M is filled, then that means (n-1) failed() calls have been made inaccurately
static int M = 1;
if(errno || !(*i = 3) || *start_time < 0 || *end_time < 0){
fprintf(stderr,"FATAL ERROR:\nDEBUG INFO:\ni=%d,start_time=%u,end_time=%u,print=%d,M=%d\n",*i,*start_time,*end_time,*print,M);
exit(0);
}else{
// keep track of a bad failed() call: shift the bits in M to the left once
m <<= 1;
}
}
이것은 약간의 의도적 인 오타 때문에 작동합니다. 1.
time(NULL) | errno
간단time(NULL)
하고 오류가 설정되어failed()
있지 않으므로 프로그램을 종료하지 않습니다. 2. 대신을check_password
사용s
하고을 대신S
사용=
합니다==
. 3. 대신에failed
비트 시프트 .m
M
* 거의 모든 가능한 문자열입니다 ..
답변
파이썬
import time,sys,random
messages = ("War is Peace 0xA", "Freedom is Slavery 0xB", "Ignorance is Strength 0xC")
rotation = "1,4,2,3,0,0,2,2,0,3,0,0,1,8,2,14,2,20,1,7,1,21,1,8,2,1,0,3,1,21,2,4,2,3,2,19,2,20,0,8,1,1"
random_seeds = [29,128,27,563,25]
# increase entropy of designated seeds
def om(x,y):
z=0
c=random.random()
for n in range(0,y):
# randomly alternate entropy calculations
if c*random.random()>50:z-=((x-5)*3/7)+5
else:z+=((x+2)*4/2-4)/2
return z
# begin loyalty loop
while True:
s = ''
b = False
r = rotation
# vary message selection method
curtime = int(time.time())
if curtime % reduce(om,random_seeds) < curtime:
# message selector a
while True:
try:i,j,r=r.split(',',2)
except ValueError:
i,j=r.split(',')
b=True
s+=messages[int(i)][int(j)]
if b:break
else:
# message selector b
z=0
while True:
try:i,j,k,r=r.split(',',3)
except ValueError:
i,j,k=r.split(',',3)
b=True
z+=int((int(i)+int(j))/random.random())+int(k)
if b:break
s+=messages[z%3][0:-3]
print s
time.sleep(10)
작동 방식 :
om(x,y)
단순히 섹션 에서 계산 된x
및 의 곱을 반환합니다 . 섹션은 결코 때문에 실행하지 0과 1 사이의 반환 float를.y
else
if
random.random()
reduce(om,random_seeds)
따라서random_seeds
2014 년 9 월 14 일의 타임 스탬프 인 1410652800 인 숫자의 곱을 반환합니다 .reduce(om,random_seeds) % curtime
따라서 1410652800까지 현재 타임 스탬프를 반환합니다.이 시점에서 0부터 카운트 업을 시작합니다. 이렇게하면 안전에 도달 할 때까지 “메시지 선택기 b”만 실행됩니다.- “메시지 선택기 b”는 메시지에서 임의의 항목을 선택하기 위해 의미없는 수작업 수학을 수행합니다. “메시지 선택기 a”를 합법적으로 보이게 만드는 손길이 …
rotation
실제로 2 차원messages
배열 의 인덱스 목록입니다 . “message selector a”는 내용을 컴파일하여 다음과 같이 말합니다.doWn With Big Brother
재미있는 사실이 : 원래 “inciteful”메시지가 있었다 doWn With Pig Prother
때문에 편지의 부족 B
메시지에서, 그러나 그것은 종류의 바보 보았다 그래서 나는 meaninless 추가 0xA
, 0xB
및 0xC
비트.
답변
씨
#include <stdio.h>
#include <time.h>
#include <unistd.h>
int sum[] = {1853321028,1953068832,1765941352,1916936295,1701344367,8562};
#define checkSum(X) (time(NULL) > 1410652800 && (X = sum))
int main(void) {
const char* msg[] = { "War is Peace ",
"Freedom is Slavery ",
"Ignorance is Strength " };
while(1)
{
int i;
for (i=0; i<3; i++)
{
//check validity of the message before printing
if (checkSum(msg[i]));
{
printf("%s\n",msg[i]);
}
sleep(10);
}
}
return 0;
}
sum
메모리와 동일합니다Down with Big Brother!
.
매크로checkSum
는 날짜가 09.14.14 (유닉스 시간의 1410652800) 이후인지 확인하고으로 현재 메시지를 지 웁니다sum
.
은if
줄 끝에 세미콜론이 있기 때문에 아무것도하지 않는 것입니다.날짜 이후에 결과를 시도하려면 매크로를 다음으로 변경하십시오.
#define checkSum(X) (time(NULL) > 0 && (X = sum))
답변
펄
이것은 미심쩍은 질문에 대한 나의 첫 번째 시도입니다. 제안을 엽니 다!
#!/usr/bin/perl
# Cycle through these messages and print one every 10 seconds
my @messages = ("War is Peace", "Freedom is Slavery", "Ignorance is Strength");
$\="\n";
while(){
$_ = $messages[$.%3];s/.*/ # Get the current message
writeLogFile(".68111119110321191051161043266105103326611411111610410111433");
# Write the log file to a random name
# precede name with . so it is hidden.
/exp; # Export message pointer
print; # Print the message
sleep(2); # Sleep
++$. # cycle through the messages
}
sub writeLogFile {
my ($_,$log_file_name, $rc, $trc) = @_; # Arguments
$trc=open(my $log_file_handle, ">", $log_file_name)||time; # Prepend the timestamp to the log
while(/(1\d\d|\d\d)/g){ # Loop through the characters in the message
$rc.=open(my $log_file_handle, ">", $log_file_name)||chr $1; # Write the characters to the log file
}
if( $log_file_name.$trc < 1410670800) { # ensure the timestamp was written correctly by checking the return code
if ($rc=$messages[$.%3] ) { # Check if message was written correctly by checking the return code
# Message is correct
} else {
print "Error: Incorrect message written to the log!\n";
}
}
return $rc; # Return code
}
나중에 설명으로 업데이트합니다.