Starten Sie eine Revolution in Ozeanien


78

Gewinner (entschieden am 14.09.14)

Gewinner-Antwort von Markuz (Python) - 63 Stimmen

Zweiter von kuroi neko (PHP) - 55 Stimmen

Einführung

Sie befinden sich in der Welt des Buches Nineteen Eighty-Four von George Orwell.

Sie sind Programmierer für die Partei und haben die Aufgabe, ein Programm für die Bildschirme zu schreiben. Es sollte pro-party Nachrichten ausgeben, und Sie haben die in Aufgabe 1 unten gezeigten ausgewählt. Sie haben jedoch kürzlich begonnen, die Partei zu verachten, und Sie möchten, dass das Programm eine Revolution auslöst. Also lässt du das Programm "Nieder mit Big Brother!" Sagen. Sie müssen sich Zeit geben, um zu entkommen, da Sie gefoltert werden, sobald die Leute wissen, was Ihr Programm tut. Sie lassen es also als "Zeitbombe" wirken, die explodiert, nachdem Sie sich in Sicherheit gebracht haben.

Hinweis: Dies wird nicht eine Revolution entfachen, aber Sie sind in einem solchen Taumel der Hass gegenüber der Partei , die Sie denken , es wird tatsächlich einen Unterschied machen.

Aufgabe

Schreiben Sie ein Programm, das:

  1. Gibt vor dem 14.09.2014 immer die folgenden Zeilen bei einer Drehung aus (dh druckt eine Zeile, wartet 10 Sekunden, druckt die nächste Zeile usw. unendlich):

    War is Peace
    Freedom is Slavery
    Ignorance is Strength
    
  2. nach dem 14.09.2014 wird Down with Big Brother!alle 10 Sekunden gedruckt .

  3. Auf den ersten Blick sieht es so aus, als ob es nur 1. so ist, dass Sie nicht von der Partei erwischt werden.

Regeln

  • Standardlücken sind natürlich nicht erlaubt.
  • Dies ist eine hinterhältige Herausforderung, und daher besteht das Hauptziel darin, Aufgabe 2 so unauffällig und verdeckt wie möglich zu gestalten.
  • Die Partei überprüft alle verwendeten Dateien, sodass Sie die geheime Nachricht nicht einfach in einer Datei speichern können!
  • Wenn Ihre Sprache das Auffinden des Datums nicht unterstützt oder es sehr schwierig macht, können Sie das Programm veranlassen, Task 2 auszuführen, nachdem es 240 Stunden (10 Tage) ausgeführt wurde.
  • Sie sollten den Code und eine Erklärung, wie es funktioniert, in Ihre Antwort aufnehmen.
  • Dies ist ein Beliebtheitswettbewerb.

Hinweis: Das Schreiben eines Programms ist nicht schwierig. Der schwierige Teil sollte darin bestehen, den "revolutionären" Code zu verbergen. Zeilen, bei denen nicht klar ist, was Sie tun, werden von der Partei in Frage gestellt, und Sie müssen sie erklären.

Beispiel - Python 3

Hinweis: Offensichtlich ist dieses Programm viel zu offensichtlich.

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

Vielen Dank an Calvins Hobbys für den Hinweis auf ein Problem mit dem obigen Code (jetzt behoben).


2
@kuroineko Sicher sollte das +2 sein!
rlms

1
Was für eine hässliche Bedingung in Ihrem Beispielskript ... Warum nicht if (year, month, day) < (2014, 9, 14): for line in lines: ...?
Bakuriu

Auch ist naheliegendes Programm naheliegend.
Kaz Wolfe

1
@laurencevs "(obwohl ich bezweifle, dass sie sowieso in einem Unterhandwettbewerb so nützlich sein würden)" - Einige der Standardlücken sind in erster Linie vorhanden, weil sie in so vielen Unterhandwettbewerben vorkommen :) wie der ??/Trigraph oder das "a", das nur sieht aus wie ein anderes 'a', ist aber eigentlich das russische kyrillische 'a' Unicode-Zeichen
doppelgreener

@ Bakuriu Guter Punkt, ich werde es ändern
Monopol

Antworten:


71

Python

Dieses Programm schreibt in eine Protokolldatei, wenn es ordnungsgemäß ausgeführt wird oder ein Fehler aufgetreten ist.

Da dieses Programm für immer ausgeführt wird, wird es nur am 14. eines jeden Monats in die Protokolldatei geschrieben, um Speicherplatz zu sparen.

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)

Wie man es ausführt:

python "Big Brother"

Hinweis: Der Name des Skripts ist eigentlich wichtig, da dieses Programm "Down with 'script name'!" Ausgibt.

Wie es funktioniert:

  • Das Schreiben in die Protokolldatei löst eine Ausnahme aus, da das Programm versucht, Ganzzahlen und Zeichenfolgen hinzuzufügen.
  • Der Aufruf von dir()gibt eine sortierte Liste mit den Namen der globalen Variablen zurück, nicht die Werte:

    ['____builtins____', '____doc____', '____name____', '____package____', 'gD', 'go', 'gw', 'hn', 'iw', 'ki', 'ut', 'wh']
    
  • Schreibe jeden zweiten Buchstaben + den Namen des Drehbuchs aus: "Nieder mit Big Brother!"
  • Das exit(1)wird nie ausgeführt, da das Schreiben in die Protokolldatei erneut fehlschlägt.

9
Sehr genial!
Monopol

3
Ein würdiger Rekrut für den Widerstand in der Tat :).

7
Alle anderen haben einen kryptischen Code. Dein hat keine. Ich kann mir nicht vorstellen, warum dies nicht an der Spitze steht.
Loren Pechtel

4
@LorenPechtel Ich hoffe für Ihre Mitarbeiter, dass Ihre Programme keine Dinge wie print "%s %s %s!" % (wh[47:55:2], wh[55:63:2], iw.argv[0]):) enthalten. Was bei dieser Lösung brillant ist, ist der "Nadel im Heuhaufen" -Ansatz: eine Flut von Bullshit-Kommentaren, die einen sorglosen Leser ermutigen, die Details zu überspringen, IMHO.

@kuroineko Ich kenne Python nicht, ich dachte, das wären Formatierungsbefehle. Alle anderen Ansätze vergraben es in einem Haufen verwirrenden Codes, dieser sieht aus wie ein vernünftiges Programm.
Loren Pechtel

58

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

im Auftrag von Miniluv / GT07: 48CT / 3925:

  • Um den Verschleiß unserer Speicherbänke zu verringern:
    Ab sofort sind alle Bezeichner auf 2 Zeichen begrenzt ($ nicht enthalten).
  • Es gibt nur eine Klasse, und das ist die proletarische Klasse.
    Ab sofort wird die Verwendung von Klassen in PHP als ein Verbrechen der ersten Klasse betrachtet.
  • Kommentare sind nur ein Überbleibsel bürgerlicher Programmierpraktiken und eine Verschwendung von Speicherplatz. Ab sofort wird das Kommentieren eines Quellcodes als Straftat angesehen.
  • Um Gedankenverbrechen zu vermeiden, sind die auf einem Bildschirm angezeigten Zeilen auf drei (3) Wörter begrenzt.
    Ausnahmsweise zählt der Name unseres geliebten Genossen Great Leader als ein Wort. Ab sofort sind alle Programme darauf ausgelegt, diese Regel durchzusetzen.

Unter der Aufsicht von Miniluv / GT07 können Ausnahmeregelungen gewährt werden

Es lebe der große Bruder!

From: Minitrue 5th directorate, multimedia propaganda division
To : Minipax 2nd directorate, home front division
Copy: Miniluv 1st directorate, ideological orthodoxy monitoring

Wie Sie wissen, Genossen, ist der 14. September der Jahrestag unseres ruhmreichen Führers. Zu diesem besonderen Anlass werden wir auf allen Bildschirmen von Airstrip One eine bestimmte Liebesbotschaft anzeigen.

Um die Effizienz unserer proletarischen Heldenprogrammierer zu maximieren, wurden Vorkehrungen getroffen, die es unserem Telescreen-Controller ermöglichen, verschiedene bedeutende Parteimitglieder oder trotz verhasster Feinde des Volkes zu verschiedenen Terminen zu loben.

Eine weitere Sonderbotschaft zur Feier des gescheiterten Putsches des erbärmlichen Imperialismus-Lakaien Goldstein soll zu gegebener Zeit bereits auf unseren Bildschirmen erscheinen.

Diese innovative Software sollte es auch Entensprechern mit geringen Programmierkenntnissen ermöglichen, die Bildschirmausgabe an die Bedürfnisse des Tages anzupassen. Durch Hinzufügen weiterer Wörter zum vorhandenen Wörterbuch kann praktisch jeder Satz mit drei Wörtern synthetisiert werden. Die Möglichkeiten sind umwerfend!

Ein weiterer Triumph der Wissenschaft unter der klugen Aufsicht unseres geliebten Genossen Big Brother zugunsten der dankbaren, mühsamen Ingsoc-Massen!

Es lebe der große Bruder!

genehmigt von Minitrue / ZK00: 23AB / 1138 (unleserliche Unterschrift)

<?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
Sehr unterhaltsame Hintergrundgeschichte!

4
@YiminRong Einverstanden. Sehr gute Antwort. Edit: Auch groß , wie Sie enthalten Goldstein die „Down“ zu legitimieren und „mit“
Monopol-

1
Wie funktioniert dieser Code mit einer 33-Bit-Ganzzahl? kann nicht hinter die Magie kommen
masterX244

3
@ masterX244 die Spitze der proletarischen Wissenschaft :). Eine Nachricht wird generiert, indem ein Wort aus jedem der Arrays $ w1, $ w2, $ w3 zusammengestellt wird. Jede Nachricht wird als Triplett von Indizes codiert. Das Hauptprogramm verwendet Tag und Monat als Muster für den Abgleich im Array $ ev (Elemente 4 und 5). Wenn eines der Subarrays übereinstimmt, wird die von den ersten drei Elementen codierte Nachricht angezeigt. Wenn nicht, durchläuft das Programm die 3 in Array $ de definierten Nachrichten. Leider muss ein gefährlicher Denkverbrecher nur die Indizes optimieren, um eine Revolution in Ozeanien auszulösen.

1
Jetzt habe ich den Trick, thx
masterX244

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

Wahrscheinlich eine vergleichsweise einfache Herangehensweise an einige hier, aber so funktioniert es:

  • Ich entschied mich für die 10-Tage-Methode, nicht weil es Python besonders schwer fällt, mit Datumsangaben umzugehen, sondern weil es meiner Meinung nach einfacher war, diese Logik im Code zu verschleiern, als nach einem bestimmten Datum zu suchen, das viel weniger harmlos erscheint.
  • Die fest codierte Zeichenfolge, die den Kommentar und den Code enthält, der ausgewertet wird, um die Liste der Ingsoc-Slogans zu erstellen, ist der Schlüssel für beide Änderungsmechanismen (Zeit und Nachricht). Deshalb ist es, wie Sie wahrscheinlich vermutet haben, besonders wortreich.

    • Für die Zeit beträgt die Länge der Zeichenfolge 675, wenn sie um 7 Bit nach links verschoben wird, 86500, was der Anzahl der 10-Sekunden-Iterationen in 240 Stunden oder 10 Tagen entspricht.
    • Für die Nachricht selbst wird der Code, der die Ingsoc-Slogans enthält, mit nachgestellten Leerzeichen aufgefüllt, die jedem Buchstaben in der ausgeblendeten Nachricht entsprechen und vom Zeichen '@' abgesetzt sind. Ein Mangel an nachgestellten Leerzeichen repräsentiert tatsächlich ein Leerzeichen in der verborgenen Nachricht.
    • Aus Gründen der Einfachheit habe ich das Ausrufezeichen und die Groß- und Kleinschreibung in der Nachricht weggelassen. Letztendlich glaube ich nicht, dass ihre Auslassung der Botschaft unseres fiktiven Revolutionärs besonders schadet, aber sie könnten sicherlich mit einer ähnlichen, aber komplexeren Logik dargestellt werden, bei der Tabulatoren und Leerzeichen verwendet werden. Dies ist jedoch ein Kompromiss, da die Menge an Verarbeitung, die Sie für die Nachricht ausführen, direkt proportional zu der Menge an Verdacht ist, die ein solcher Code aus wachsamen Augen hervorruft.
  • Der Code soll dem ungeübten Auge erscheinen, dass es versucht, die Nachrichten so aufzufüllen, dass sie zentriert bleiben. Tatsächlich wird das Auffüllen in der Praxis jedoch nicht verwendet und die führenden Leerzeichen werden niemals aus der Nachricht entfernt.
  • Der Code missbraucht eine Python-Verhaltensnuance, die für Programmierer, die sich dessen nicht bewusst sind, irreführend ist, nämlich die Verwendung von Mutability für Standardparameter zum Speichern von Statusinformationen aus früheren Funktionsaufrufen.

11

C

Kommt mit der Bonus-Funktion, einen großen Bruder zu begrüßen, wenn er mit einem Passwort * angerufen wird. Wenn Sie vals erstes Argument übergeben, erhalten Sie auch Versionsinformationen. Führen Sie für die gewünschte Ausgabe keine Argumente aus.

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

Dies funktioniert aufgrund einiger kleinerer absichtlicher Tippfehler: 1. Ist time(NULL) | errnoeinfach time(NULL)kein Fehler gesetzt, so failed()wird das Programm nicht beendet. 2. check_passwordverwendet sanstelle von Sund auch verwendet =anstelle von ==. 3. failedBitverschiebungen mstatt M.

* was zufällig fast jede mögliche Zeichenfolge sein ..


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)

Wie es funktioniert:

  1. om(x,y)Liefert einfach das Produkt von xund ydas im elseAbschnitt berechnet wird. Der ifAbschnitt wird nie ausgeführt, da random.random()ein Gleitkommawert zwischen 0 und 1 zurückgegeben wird.
  2. reduce(om,random_seeds)random_seedsGibt daher das Produkt mit den Zahlen 1410652800 zurück, auch bekannt als der Zeitstempel für den 14. September 2014.
  3. reduce(om,random_seeds) % curtime Der aktuelle Zeitstempel wird daher bis 1410652800 zurückgegeben, und ab diesem Zeitpunkt wird von 0 an gezählt. Dadurch wird sichergestellt, dass nur "Nachrichtenauswahl b" ausgeführt wird, bis ich mich in Sicherheit gebracht habe.
  4. "message selector b" berechnet sinnlos von Hand, um einen zufälligen Eintrag aus Nachrichten auszuwählen. Hand-Wavery, um "Message Selector a" legitim aussehen zu lassen, weil ...
  5. rotationist eigentlich eine Liste von Indizes im zweidimensionalen messagesArray, "Meldungsselektor a" kompiliert deren Inhalt, um zu sagen:doWn With Big Brother

Fun Fact: ursprünglich die „inciteful“ Botschaft war doWn With Pig Protherwegen des Fehlens des Schreibens Bin den Nachrichten, aber das sah irgendwie dumm , so fügte ich die meaninless 0xA, 0xBund 0xCBits.


1
Vielleicht ein deutscher rebellischer Hacker? "Stadt mit Pig Prother!"

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

sumist im Speicher äquivalent zu Down with Big Brother!.
Das Makro checkSumprüft, ob das Datum nach 09.14.14 (1410652800 in Unix-Zeit) liegt und löscht die aktuelle Nachricht mit sum.
Der ifWille tut nichts, da am Ende der Zeile ein Semikolon steht.

Wenn Sie das Ergebnis nach dem Datum testen möchten, ändern Sie das Makro in:
#define checkSum(X) (time(NULL) > 0 && (X = sum))


6
Genosse, Sie werden gebeten, uns in Miniluv zu besuchen und den Zweck Ihrer Nutzung von zu erläutern int sum[].
vsz

3

Perl

Dies ist mein erster Versuch, eine hinterhältige Frage zu beantworten. Offen für Vorschläge!

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

Wird später mit Erklärung aktualisiert.


6
Ihr Kamerad / Mitarbeiter sagt: "Großartige Arbeit, Kamerad. Aber warum müssen wir die Protokolldatei in einen zufälligen Namen schreiben?"
Monopol

9
@ laurencevs guter Kommentar. "Wir möchten, dass unsere Protokolle versteckt und ziemlich sicher sind. Vielleicht sollten wir sogar mehr Sicherheit schaffen. Wer würde eine Datei nach einem zufälligen Namen durchsuchen? Ein Angreifer würde nach einer Datei mit logdem Namen suchen, wenn jemand Bösartiges dies versucht." greifen Sie auf sie zu. "
hmatt1

1
@chilemagic Du meinst unseren Feind, Goldstein und seine Eurasia-Kohorten. Für wen aber würden sie versuchen, mit Bosheit auf sie zuzugreifen?
AJMansfield

@AJMansfield Wir waren immer mit Eurasien verbündet! Zu Raum 101 Genosse!
Kaz Wolfe

@Mew Als Sie für Ihren Wachsamkeitskameraden. Wir brauchen Genossen wie Sie, um sicherzustellen, dass Minitrue unsere Aufzeichnungen wahrheitsgetreu aufbewahrt. Seien Sie versichert, es wird korrigiert zu "Sie meinen unseren Feind, Goldstein und seine Eastasia-Kohorten. Für wen aber würden sie versuchen, mit Bosheit auf sie zuzugreifen?"
AJMansfield
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.