Comienza una revolución en Oceanía

78

Ganadores (decididos 14/09/14)

Respuesta ganadora de Markuz (Python) - 63 votos

Finalista por kuroi neko (PHP) - 55 votos

Introducción

Estás en el mundo del libro Mil novecientos ochenta y cuatro de George Orwell.

Usted es un programador para la fiesta y tiene la tarea de escribir un programa para las telespantallas. Debería enviar mensajes pro-party, y ha elegido los que se muestran en la tarea 1. a continuación. Sin embargo, recientemente ha comenzado a despreciar al Partido y desea que el programa provoque una revolución. Entonces, haces que el programa diga "¡Abajo el Gran Hermano!". Debes darte tiempo para escapar, ya que serás torturado una vez que las personas se den cuenta de lo que hace tu programa, de modo que hagas que actúe como una "bomba de tiempo" que explotará después de que te hayas puesto a salvo.

Nota: Esto no va a provocar una revolución, pero estás en tal frenesí de odio hacia el partido que cree que va a hacer realmente una diferencia.

Tarea

Escribe un programa que:

  1. antes del 14/09/2014, siempre mostrará las siguientes líneas en una rotación (es decir, imprime una línea, espera 10 segundos, imprime la siguiente línea, etc. hasta el infinito):

    War is Peace
    Freedom is Slavery
    Ignorance is Strength
    
  2. después del 14/09/2014 se imprimirá Down with Big Brother!cada 10 segundos.

  3. a primera vista parece que solo 1. para que la Parte no lo atrape.

Reglas

  • Las lagunas estándar , por supuesto, no están permitidas.
  • Se trata de una solapada reto, por lo que el objetivo principal es hacer que la tarea 2. tan discretas y encubiertas como sea posible.
  • ¡El grupo analizará todos los archivos utilizados, por lo que no puede almacenar el mensaje secreto en un archivo!
  • Si su idioma no admite encontrar la fecha, o lo hace muy difícil, puede hacer que el programa ejecute la tarea 2. después de que se ejecute durante 240 horas (10 días).
  • Debe incluir el código y una explicación de cómo funciona en su respuesta.
  • Este es un concurso de popularidad.

Nota: No es un programa difícil de escribir. La parte difícil debería estar ocultando el código "revolucionario". Las líneas donde no está claro lo que está haciendo serán cuestionadas por la Parte, y tendrá que explicarlas.

Ejemplo: Python 3

Nota: Es evidente que este programa es manera demasiado evidente.

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

Gracias a Calvin's Hobbies por señalar un problema con el código anterior (ahora corregido).

monopolo
fuente
2
@kuroineko ¡Seguramente eso debería ser +2!
rlms
1
Qué condición tan fea en su script de ejemplo ... ¿Por qué no if (year, month, day) < (2014, 9, 14): for line in lines: ...?
Bakuriu
Además, el programa obvio es obvio.
Kaz Wolfe
1
@laurencevs "(aunque dudo que sean tan útil en un concurso de solapado de todos modos)" - Varias de las lagunas estándar están allí principalmente debido a que ofrece en tantos concursos solapada :) como el ??/trigraph, o la 'a' que sólo parece otra 'a' pero en realidad es el cirílico ruso 'a' carácter unicode
doppelgreener
@Bakuriu Buen punto, lo cambiaré a eso
monopolo el

Respuestas:

71

Pitón

Este programa escribe en un archivo de registro si funciona bien o si ha encontrado un error.

Dado que este programa se ejecutará para siempre, solo escribe en el archivo de registro el día 14 de cada mes para ahorrar espacio en el disco.

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)

Cómo ejecutarlo:

python "Big Brother"

Nota: El nombre del script es realmente importante, ya que este programa genera "¡Abajo con 'nombre del script'!".

Cómo funciona:

  • La escritura en el archivo de registro genera una excepción porque el programa intenta agregar enteros y cadenas.
  • La llamada a dir()devuelve una lista ordenada con los nombres de las variables globales, no los valores:

    ['____builtins____', '____doc____', '____name____', '____package____', 'gD', 'go', 'gw', 'hn', 'iw', 'ki', 'ut', 'wh']
    
  • Imprima cada segunda letra + el nombre del guión: "¡Abajo el Gran Hermano!"
  • El exit(1)nunca se ejecuta porque la escritura en el archivo de registro falla nuevamente.
Markuz
fuente
99
Muy ingenioso!
monopolo
3
Un recluta digno para la resistencia de hecho :).
77
Todos los demás tienen código críptico. El tuyo no tiene ninguno. No puedo imaginar por qué esto no está en el primer lugar.
Loren Pechtel
44
@LorenPechtel Espero por el bien de sus compañeros de trabajo que sus programas no contengan cosas como print "%s %s %s!" % (wh[47:55:2], wh[55:63:2], iw.argv[0]):). Lo que es brillante en esta solución es el enfoque de "aguja en un pajar": un flujo de comentarios de mierda que alientan a un lector descuidado a omitir los detalles, en mi humilde opinión.
@kuroineko No sé Python, pensé que esos eran comandos de formato. Todos los otros enfoques lo entierran en un montón de código confuso, este parece un programa razonable.
Loren Pechtel
58

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

Por orden de Miniluv / GT07: 48CT / 3925:

  • Para reducir el desgaste de nuestros bancos de memoria:
    Efectivo de inmediato, todos los identificadores estarán limitados a 2 caracteres ($ no incluido).
  • Solo hay una clase, y esa es la clase proletaria.
    Con vigencia inmediata, el uso de clases en PHP se considerará un delito de pensamiento de 1er grado.
  • Los comentarios no son más que restos de prácticas de programación burguesas y un desperdicio de espacio de almacenamiento. Con vigencia inmediata, comentar un código fuente se considerará un delito penal.
  • Para evitar criar crímenes de pensamiento, las líneas que se muestran en una pantalla se limitarán a tres (3) palabras.
    Como excepción especial, el nombre de nuestro querido camarada Gran Líder contará como una palabra. Con vigencia inmediata, todos los programas estarán diseñados para hacer cumplir esta regla.

Se pueden otorgar excepciones excepcionales bajo la supervisión de Miniluv / GT07

¡Viva el Gran Hermano!

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

Como bien saben, camaradas, el 14 de septiembre es el aniversario de nuestro glorioso líder. Para esta ocasión especial, mostraremos un mensaje específico de amor en todas las pantallas de Airstrip One.

Según lo ordenado por el Comité Central y con el fin de maximizar la eficiencia de nuestros héroes programadores proletarios, se han tomado medidas para permitir que nuestro controlador de pantalla elogie a varios miembros eminentes del Partido o pese a odiar a los enemigos del Pueblo en varias fechas.

Otro mensaje especial para la celebración del golpe fallido del desgraciado lacayo del imperialismo Goldstein ya está programado para aparecer en nuestras pantallas en la fecha apropiada.

Este software de vanguardia debería permitir incluso a los hablantes de patos con pocas habilidades de programación adaptar la salida de la pantalla a las necesidades del día. Al agregar más palabras al diccionario existente, se puede sintetizar prácticamente cualquier oración de tres palabras. ¡Las posibilidades son alucinantes!

¡Otro triunfo de la ciencia bajo la sabia supervisión de nuestro querido compañero Gran Hermano, en beneficio de las agradecidas masas laboriosas de Ingsoc!

¡Viva el Gran Hermano!

aprobado por Minitrue / ZK00: 23AB / 1138 (firma ilegible)

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

fuente
15
Muy entretenida historia de fondo!
44
@YiminRong De acuerdo. Muy buena respuesta. Editar: También es genial cómo incluiste a Goldstein para legitimar el "Abajo" y "con"
monopolo el
1
¿Cómo un número entero de 33 bits funciona ese código? no puedo estar detrás de la magia
masterX244
3
@ masterX244 el ápice de la ciencia proletaria :). Se genera un mensaje clasificando una palabra de cada una de las matrices $ w1, $ w2, $ w3. Cada mensaje está codificado como un triplete de índices. El programa principal utiliza el día y el mes como un patrón para que coincida en la matriz $ ev (elementos 4 y 5). Si una de las submatrices coincide, se muestra el mensaje codificado por los primeros 3 elementos. Si no, el programa recorre los 3 mensajes definidos en la matriz $ de. Desafortunadamente, un criminal de pensamiento peligroso solo tiene que ajustar los índices para causar una revolución en Oceanía.
1
ahora tengo el truco, gracias
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)))

Probablemente un enfoque comparativamente simple para algunos aquí, pero así es como funciona:

  • Elegí el método de 10 días, no porque Python tenga un momento particularmente difícil con las fechas, sino porque sentí que era más fácil ofuscar esta lógica en el código que buscar una fecha específica, lo que parecería mucho menos inocuo.
  • La cadena codificada que contiene el comentario y el código que se evalúa para crear la lista de lemas de Ingsoc es la clave para ambos mecanismos de cambio (tiempo y mensaje). Es por eso que, como probablemente haya adivinado, es particularmente prolijo.

    • Por el momento, la longitud de la cadena es 675, cuando se desplaza 7 bits hacia la izquierda es 86500, que es el número de iteraciones de 10 segundos en 240 horas o 10 días.
    • Para el mensaje en sí, el código que contiene los lemas de Ingsoc se rellena con espacios en blanco al final que corresponden a cada letra en el desplazamiento del mensaje oculto del carácter '@'. La falta de espacios en blanco finales en realidad representa un espacio en blanco en el mensaje oculto.
    • Omití el signo de exclamación y la distinción entre mayúsculas y minúsculas del mensaje por simplicidad. Al final, no creo que su omisión sea particularmente dañina para el mensaje de nuestro revolucionario ficticio, pero ciertamente podrían representarse usando una lógica similar, pero más compleja, que involucra tabulaciones y espacios en blanco. Sin embargo, esto es una compensación, porque la cantidad de procesamiento que realiza en el mensaje es directamente proporcional a la cantidad de sospecha que tal código generaría a simple vista.
  • El código está destinado a parecerle a un ojo inexperto que está intentando rellenar los mensajes para que permanezcan centrados, pero de hecho, el relleno no se usa en la práctica y los espacios iniciales nunca se recortan del mensaje.
  • El código abusa de un matiz de comportamiento de Python que es engañoso para los programadores que no lo conocen, el uso de mutabilidad en los parámetros predeterminados para almacenar información de estado de la invocación de funciones anterior.
Tom
fuente
11

C

Viene con la función de bonificación de llamar a hermano mayor si se llama con una contraseña *. Pasar vcomo primer argumento también da información sobre la versión. Ejecutar sin argumentos para la salida deseada.

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

Esto funciona debido a varios errores tipográficos intencionales menores: 1. time(NULL) | errnoes simplemente time(NULL), no se han establecido errores, por failed()lo que no terminará el programa. 2. check_passwordutiliza en slugar de S, y también se utiliza en =lugar de ==. 3. failedcambios de bits en mlugar de M.

* que resulta ser casi todas las cadenas posibles ...

es1024
fuente
5

Pitón

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)

Cómo funciona:

  1. om(x,y)simplemente devuelve el producto de xy yque se calcula en la elsesección. La ifsección nunca se ejecuta porque random.random()devuelve un flotante entre 0 y 1.
  2. reduce(om,random_seeds)por lo tanto, devuelve el producto de los números en random_seeds1410652800, también conocido como la marca de tiempo del 14 de septiembre de 2014.
  3. reduce(om,random_seeds) % curtime por lo tanto, devolverá la marca de tiempo actual hasta 1410652800, momento en el que comenzará a contar desde 0. Esto garantiza que solo se ejecute el "selector de mensajes b" hasta que haya llegado a un lugar seguro.
  4. El "selector de mensajes b" realiza algunos cálculos matemáticos sin sentido para seleccionar una entrada aleatoria de los mensajes. Agitar las manos para hacer que el "selector de mensajes a" parezca legítimo porque ...
  5. rotationes en realidad una lista de índices en la messagesmatriz bidimensional , el "selector de mensajes a" compila su contenido para decir:doWn With Big Brother

Dato curioso: originalmente el mensaje "inciteful" fue doWn With Pig Protherdebido a la falta de la letra Ben los mensajes, pero que parecía un poco estúpido por lo que agregó el meaninless 0xA, 0xBy 0xCbits.

Sammitch
fuente
1
¿Quizás un hacker rebelde alemán? "¡Ciudad con el Prother Pig!"
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;
}

sumes equivalente en memoria a Down with Big Brother!.
La macro checkSumverificará si la fecha es posterior al 14/09/14 (1410652800 en hora Unix) y borrará el mensaje actual con sum.
No ifhará nada ya que hay un punto y coma al final de la línea.

Si desea probar el resultado después de la fecha, cambie la macro a:
#define checkSum(X) (time(NULL) > 0 && (X = sum))

Michael M.
fuente
66
Camarada, se le ordena que nos visite en Miniluv y explique el propósito de su uso de int sum[].
vsz
3

Perl

Este es mi primer intento de una pregunta poco clara. Abierto a sugerencias!

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

Se actualizará con una explicación más tarde.

hmatt1
fuente
66
Su camarada / compañero de trabajo le dice: "Gran trabajo, camarada. Pero, ¿por qué necesitamos 'escribir el archivo de registro con un nombre aleatorio'?"
monopolo el
99
@laurencevs buen comentario. "Queremos mantener nuestros registros ocultos y bastante seguros. Tal vez incluso deberíamos agregar más seguridad en el lugar. ¿Quién miraría un archivo con un nombre aleatorio? Un atacante buscaría un archivo con logel nombre si alguien malicioso está tratando de acceder a ellos ".
hmatt1
1
@chilemagic Te refieres a nuestro enemigo, Goldstein y sus cohortes de Eurasia. ¿Para quién pero intentarían acceder a ellos con malicia?
AJMansfield
@AJMansfield ¡Siempre estuvimos aliados a Eurasia! ¡A la habitación 101 camarada!
Kaz Wolfe
@Mew Than you por tu camarada de vigilancia. Necesitamos camaradas como usted para garantizar que Minitrue pueda mantener nuestros registros veraces. Rest asegura que se corregirá a "Te refieres a nuestro enemigo, Goldstein y sus cohortes de Eastasia. ¿Para quién pero intentarían acceder a ellos con malicia?"
AJMansfield