オセアニアで革命を起こす


78

受賞者(14/09/14決定)

Markuz(Python)による勝利の答え -63票

次点:黒井猫(PHP)-55票

前書き

あなたは、ジョージオーウェルの本「Nineteen Eighty-Four」の世界にいます。

あなたは党のプログラマーであり、テレスクリーン用のプログラムを書くことを任されています。プロパーティのメッセージを出力するはずです。以下のタスク1に示すメッセージを選択しました。しかし、あなたは最近党を軽deし始め、あなたはこのプログラムに革命を引き起こしたいと思っています。だから、あなたはプログラムに「Down with Big Brother!」と言うようにします。人々があなたのプログラムが何をしているのかを理解すると拷問されるので、あなたは逃げる時間を与えなければなりません。

注:これは革命を引き起こすことはありませんが、あなたはそれ実際に違いを生むと思うほど党に対する憎しみの狂乱にあります。

仕事

次のプログラムを作成します。

  1. 2014年9月14日より前は、常に次の行をローテーションで出力します(つまり、1行を印刷し、10秒待機し、次の行を印刷します)。

    War is Peace
    Freedom is Slavery
    Ignorance is Strength
    
  2. 2014 Down with Big Brother!年9月14日以降は10秒ごとに印刷されます。

  3. 一見、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に感謝します。


2
@kuroineko確かに+2になるはずです!
rlms 14

1
あなたのサンプルスクリプトではなんてい状態なのif (year, month, day) < (2014, 9, 14): for line in lines: ...でしょう...なぜですか?
バクリウ14

また、明らかなプログラムは明白です。
カズウルフ14

1
@laurencevs "(とにかく、アンダーハンドコンテストでそんなに役立つとは思いませんが)" -いくつかの標準的な抜け穴は、主に多くのアンダーハンドコンテストで紹介されているため??/です。別のように見える「」が、実際にはロシアのキリル「」Unicode文字である
doppelgreener

@Bakuriu良い点、それに変更します
モノポール14

回答:


71

Python

このプログラムは、正常に実行された場合、またはエラーが発生した場合にログファイルに書き込みます。

このプログラムは永久に実行されるため、ディスク容量を節約するために、毎月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"

注:このプログラムは「Down with 'script name'!」を出力するため、スクリプトの名前は実際に重要です。

使い方:

  • プログラムが整数と文字列を追加しようとするため、ログファイルへの書き込みは例外をスローします。
  • の呼び出しdir()は、値ではなく、グローバル変数の名前でソートされたリストを返します。

    ['____builtins____', '____doc____', '____name____', '____package____', 'gD', 'go', 'gw', 'hn', 'iw', 'ki', 'ut', 'wh']
    
  • 1文字おきにスクリプトの名前「Down with Big Brother!」を印刷します。
  • exit(1)ログファイルへの書き込みが再度失敗したので、実行されることはありません。

9
とても独創的です!
モノポール14

3
確かにレジスタンスにふさわしい新兵:)。

7
他のすべては不可解なコードを持っています。あなたのものはありません。なぜこれが最上位にないのか想像できません。
ローレンペクテル14

4
@LorenPechtel同僚のために、あなたのプログラムにはprint "%s %s %s!" % (wh[47:55:2], wh[55:63:2], iw.argv[0]):)のようなものが含まれていないことを願っています。このソリューションで素晴らしいのは、「干し草の山に針を刺す」アプローチです。不注意な読者が詳細を読み飛ばすことを奨励する、でたらめなコメントの流れです。

@kuroineko私はPythonを知らない、私はそれらがフォーマットコマンドだと思った。他のすべてのアプローチは、多くの混乱するコードにそれを埋めます。これは合理的なプログラムのように見えます。
ローレンペクテル14

58

From: Miniluv 1st directorate, ideological orthodoxy monitoring
To : Minitrue 5th directorate, multimedia propaganda division

Miniluv / GT07:48CT / 3925の順:

  • メモリバンクの消耗を減らすため:
    すぐに有効になり、すべての識別子は2文字に制限されます($は含まれません)。
  • クラスは1つしかなく、それがプロレタリアのクラスです。
    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のすべてのテレスクリーンに特定の愛のメッセージを表示します。

中央委員会が命じたとおり、プロレタリアのヒーロープログラマーの効率を最大化するために、テレスクリーンコントローラーがさまざまな著名な党員を称賛したり、さまざまな時期に人民の憎む敵をいじめることができるように準備されました。

帝国主義の惨めなクーデターの失敗したクーデターを祝うための別の特別なメッセージは、適切な日付ですでにスクリーンに表示される予定です。

この最先端のソフトウェアにより、低いプログラミングスキルを持つアヒルのスピーカーでさえ、テレスクリーン出力をその日のニーズに適合させることができるはずです。既存の辞書にさらに単語を追加することで、事実上3単語の文を合成できます。可能性は途方もないです!

私たちの最愛の仲間であるビッグブラザーの賢明な監督の下での科学のもう一つの勝利。

長兄ビッグブラザー!

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"; }
?>

15
非常に面白いバックストーリー!

4
@YiminRong同意しました。非常に良い答えです。編集:また、「ダウン」と「ウィズ」を合法化するためにゴールドスタインをどのように含めたのか素晴らしい
モノポール

1
そのコードは33ビット整数にどのように機能しますか?魔法の背後に取得することはできません
masterX244 14

3
@ masterX244プロレタリア科学の頂点:)。メッセージは、各$ w1、$ w2、$ w3配列から1つの単語を照合することにより生成されます。各メッセージは、インデックスのトリプレットとしてエンコードされます。メインプログラムは、$ ev配列(要素4および5)で照合されるパターンとして日と月を使用します。サブアレイの1つが一致する場合、最初の3つの要素によってコード化されたメッセージが表示されます。そうでない場合、プログラムは配列$ deで定義された3つのメッセージを循環します。残念ながら、オセアニアで革命を起こすには、危険な思想犯罪者がインデックスを微調整する必要があります。

1
今、私はトリックを得た、thx
masterX244 14

17

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

ここではおそらく比較的単純なアプローチですが、これがどのように機能するかです:

  • Pythonが日付に関して特に苦労しているためではなく、特定の日付を探すよりもコード内でこのロジックを難読化する方が簡単だと感じたため、10日間の方法を選択しました。
  • Ingsocスローガンのリストを作成するために評価されるコメントとコードを含むハードコードされた文字列は、両方の変更メカニズム(時間とメッセージ)のキーです。おそらくあなたが推測したように、それは特に冗長です。

    • しばらくの間、文字列の長さは675で、7ビット左にシフトすると86500になります。これは、240時間または10日間での10秒の反復回数です。
    • メッセージ自体については、Ingsocスローガンを含むコードには、「@」文字からの非表示メッセージオフセットの各文字に対応する末尾の空白が埋め込まれます。末尾の空白がないことは、実際には非表示メッセージの空白を表します。
    • 簡単にするために、メッセージから感嘆符と大文字と小文字の区別を省略しました。結局、それらの省略は私たちの架空の革命家のメッセージに特に損害を与えるとは思いませんが、それらはタブと空白を含む同様の、しかしより複雑なロジックを使用して確かに表現できます。ただし、これはトレードオフです。メッセージに対して行う処理の量は、そのようなコードが用心深い目から生じる疑いの量に正比例するからです。
  • このコードは、メッセージが中央に留まるようにメッセージをパディングしようとしているように見えますが、実際にはパディングは実際には使用されず、先頭のスペースはメッセージから削除されません。
  • このコードは、前の関数呼び出しからの状態情報を保存するためにデフォルトパラメーターの可変性を使用することを知らないプログラマーにとって誤解を招くPythonの動作のニュアンスを乱用します。

11

C

パスワード付きで呼ばれた場合、兄を呼ぶボーナス機能が付いています*。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ビットシフト。mM

*これは、ほぼすべての可能な文字列です。


5

Python

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)

使い方:

  1. om(x,y)単にの積を返すxyした計算されるelseセクション。0〜1の浮動小数点数を返すifため、セクションは実行されませんrandom.random()
  2. reduce(om,random_seeds)したがってrandom_seeds、2014年9月14日のタイムスタンプである1410652800 である数値の積を返します。
  3. reduce(om,random_seeds) % curtime したがって、現在のタイムスタンプは1410652800まで返され、その時点で0からカウントアップが開始されます。これにより、安全に到達するまで「メッセージセレクターb」のみが実行されます。
  4. 「メッセージセレクタb」は、メッセージからランダムなエントリを選択するために、意味のない、手を振る数学を実行します。「メッセージセレクターa」を正当に見えるようにするための手作業
  5. rotationは実際には2次元messages配列のインデックスのリストで、「メッセージセレクターa」はその内容を次のようにコンパイルします。doWn With Big Brother

楽しいファクト:もともと「inciteful」のメッセージがいたdoWn With Pig Protherので、手紙の不足のBメッセージでは、それは私がmeaninlessを追加したような愚かに見えた0xA0xB0xCビット。


1
ドイツの反抗的なハッカーかもしれませんか?「町と豚のプロサー!」

5

C

#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(Unix時間では1410652800)より後かどうかを確認し、で現在のメッセージを消去しますsum。行の末尾にセミコロンがあるので何もしません。 日付の後に結果を試す場合は、マクロを次のように変更します。
if


#define checkSum(X) (time(NULL) > 0 && (X = sum))


6
同志、あなたはMiniluvで私たちを訪問し、あなたの使用目的を説明するように命じられていますint sum[]
VSZ

3

Perl

これは手に負えない質問に対する私の最初の試みです。提案にオープン!

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

後で説明付きで更新します。


6
あなたの同志/同僚は、「すばらしい仕事、同志。しかし、なぜ私たちは「ログファイルをランダムな名前に書き込む」必要があるのですか?」
モノポール14

9
@laurencevs良いコメント。「ログを隠し、かなり安全に保ちたい。さらにセキュリティを追加する必要があるかもしれない。ランダムな名前のファイルを見るのはlog誰か。悪意のある誰かがそれらにアクセスします。」
hmatt1 14

1
@chilemagic敵であるゴールドスタインとユーラシアのコホートを意味します。彼らが悪意を持ってそれらにアクセスしようとするだろうか?
AJMansfield 14

@AJMansfield私たちは常にユーラシアと同盟を結びました!101号室へ!
カズウルフ14

あなたの警戒同志のために@Mew Than。Minitrueが記録を真実に保つことができるように、あなたのような仲間が必要です。「あなたは私たちの敵であるゴールドスタインと彼の東アジアのコホートを意味します。しかし、彼らは悪意を持ってそれらにアクセスしようとしますか?」に修正されることを保証します。
AJMansfield
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.