Crea el programa más útil con 100 caracteres [cerrado]

13

En esta tarea, se le permite hacer un programa útil para hacer cualquier cosa que pueda escribir dentro de los 100 caracteres. Se le permite usar menos caracteres, pero no más.

Reglas, solo para protegerse de las lagunas estándar que ya no son divertidas:

  1. Su programa no puede acceder a Internet, a menos que realmente tenga que hacerlo. Por ejemplo, el programa que muestra la pregunta más votada en este sitio web puede usar Internet para verificar esta pregunta. Sin embargo, no está permitido navegar en Internet para encontrar su fuente real y ejecutarlo.

  2. Su programa no puede ser un intérprete para el idioma en que fue escrito. Sin embargo, el intérprete Brainfuck en un idioma que no sea Brainfuck estaría bien.

  3. Su programa no puede ejecutar programas externos que hagan exactamente lo que hace su programa. Por ejemplo, no puede ejecutar vimy afirmar que su programa es vimimplementación.

  4. Su programa no puede ser peligroso para la computadora en la que se ejecuta y otras computadoras. No está permitido escribir programas como rmdir /(el ejemplo aquí intencionalmente no funciona, no lo arregles), y afirmas que es un programa útil para eliminar todos los archivos en la computadora.

  5. Su programa puede ser tan lento como desee y utilizar tantos recursos como desee, siempre y cuando pueda demostrar que hace lo que tenía que hacer.

  6. No tienes permiso para crear un lenguaje específicamente para esta tarea. Sin embargo, puede hacer un intérprete para su lenguaje inventado en algún otro lenguaje de programación.

Konrad Borowski
fuente
¿Puedo publicar más de una respuesta para este concurso?
TrungDQ
@TrungDQ: Claro.
Konrad Borowski el
1
Esta tiene que ser una de las mejores preguntas hasta la fecha;)
Timtech
13
Esto es demasiado abierto, incluso para un sitio como este, incluso para un concurso de popularidad. Literalmente, cualquier respuesta es válida, no hay ningún marco de referencia para compararlas.
Aaronaught
3
Esta pregunta es canibalizar el código golf. Las interesantes ideas de 100 personajes deberían poder reformularse en excelentes preguntas de código dorado. Animo a los que responden a pasar unos minutos adicionales para convertir sus respuestas en nuevas preguntas.
gnibbler

Respuestas:

26

C - 47 bytes

El siguiente programa genera todos los documentos escritos en la historia de la humanidad, junto con todos los documentos que alguna vez se escribirán y un montón de textos interesantes que ningún ser humano podrá encontrar (junto con un "poco" de basura en el medio). Solo dale algo de tiempo. Además, cada vez que lo ejecutas, ¡generará textos diferentes primero! Si eso no es útil! (¡Y todo eso dentro de la mitad del límite de caracteres!)

main(){srand(time(0));while(1)putchar(rand());}

Si no te importa que genere algo más cada vez, ¡solo necesitas 41 bytes !

main(){srand(0);while(1)putchar(rand());}

No es del todo compatible con C99, pero se compila sin problemas gcc.exe (GCC) 4.7.0 20111220.

Las reglas establecen

Su programa puede ser tan lento como desee y utilizar tantos recursos como desee, siempre y cuando pueda demostrar que hace lo que tenía que hacer.

No hay problema.

Algunas cosas, este programa generará:

  • una solución a cada problema del milenio
  • artículos periodísticos de mañana
  • las obras completas de Shakespeare (por supuesto)
  • tu secreto más oscuro
  • todas las otras respuestas a esta pregunta

En realidad no, porque (como ace mencionó correctamente en el comentario), rand () es solo un generador pseudoaleatorio, que terminará en algún momento, probablemente demasiado pronto para producir muchos textos significativos. Pero dudo que obtener datos de un verdadero generador de números aleatorios (hardware) sea remotamente posible con 100 caracteres. Sin embargo, dejaré esto aquí por diversión.

Como señala Dennis, la aleatoriedad del algoritmo podría mejorarse un poco (dentro del límite de caracteres) mediante el uso de en rand()^rand()>>16lugar de rand().

Martin Ender
fuente
10
No necesariamente. rand()es solo pseudoaleatorio; es posible que no produzca ningún texto útil antes de que se repita.
user12205
1
@Dennis ¡afortunadamente eso todavía está dentro de las reglas de esta pregunta! :)
Martin Ender
1
@ m.buettner: con el rand de GLIBC () , hay una relación algebraica simple entre bytes de la salida de su programa: al ver la salida como una matriz x, tiene x[i] == (x[i - 3] + x[i - 31] + c[i]) % 256, donde c[i]es 0 con probabilidad 0.75 y 1 con probabilidad 0.25. Esto significa que no puede generar ninguna de las cosas que mencionaste.
Dennis
1
@ m.buettner: No mejorará mucho el PRNG, pero puede eliminar la linealidad usando en rand()^rand()>>16lugar de simple rand(). Si está buscando maneras de ahorrar en bytes, elimine inty %256.
Dennis
18

BBC BASIC, 84 caracteres

MODE 6:INPUT T,A,B,A$,B$:FOR X=0 TO 1279:A=A+EVAL(A$):B=B+EVAL(B$):DRAW X,A+500:NEXT

Traza las soluciones para ecuaciones diferenciales de primer y segundo orden.

Toma como entrada del usuario:

Title (does nothing)
Start value for A (plotted value)
Start value for B (not plotted)
Expression for dA/dX
Expression for dB/dX

Inspirado por un software de resolución de ecuaciones diferenciales llamado Polymath que utilicé cuando estudiaba para ser ingeniero químico. Ingresaríamos diferentes ecuaciones para reactivos y productos y veríamos cómo el sistema de reacción completo cambió con el tiempo. Un software muy simple (no mucho más complejo que este) pero mucho más conveniente para este propósito que Excel. Lamentablemente, no puedo hacer un clon completo de Polymath en 100 caracteres.

ingrese la descripción de la imagen aquí

Level River St
fuente
10

Mathematica 76

Este programa construye un applet que muestra información sobre varias propiedades para cualquiera de los 240 países. Se abre con información sobre la población adulta de Afganistán. El usuario puede cambiar la configuración de país y propiedad a través de listas desplegables.

Mathematica interopera sin problemas con WolframAlpha.
Por esta razón, creo que la presentación cumple con el requisito n. ° 1 del desafío: "Su programa no puede acceder a Internet, a menos que realmente tenga que hacerlo ".

Este applet bastante modesto simplemente hace uso de la funcionalidad existente en el lenguaje Mathematica. Un video corto proporciona información adicional sobre el applet.

d = CountryData; Manipulate[WolframAlpha[p <> " " <> c], {p, d["Properties"]}, {c, d[]}]

alfa


A continuación se muestra una lista de las primeras 20 (de 223) propiedades relacionadas con países. Con una programación adicional, se puede obtener información adicional sobre los países y analizar esta información en Mathematica.

CountryData["Properties"][[;; 20]]

{"AdultPopulation", "AgriculturalProducts", "AgriculturalValueAdded", "Airports", "AlternateNames", "AlternateStandardNames", "AMRadioStations", "AnnualBirths", "AnnualDeaths", "AnnualHIVAIDSDeaths", "ArableLandArea", "ArableLand", "ArableLand" Area "," BirthRateFraction "," BorderingCountries "," BordersLengths "," BoundaryLength "," CallingCode "," CapitalCity "," CapitalLocation "}

DavidC
fuente
No veo cómo su programa "tiene que" acceder a Internet. Los datos que presenta no cambian con tanta frecuencia que necesitaría confiar en una fuente externa.
shiona
1
Si la fuente está dentro o fuera está abierta a debate. Estaba considerando que la solicitud de información sobre WolframAlpha (que el código hace) es un caso de "acceso a Internet" (necesario), a pesar de que el código consulta directamente a un servidor de datos Wolfram y no requiere el uso de un navegador como Firefox. Requiere que uno tenga una red o conexión WIFI
DavidC
1
-1 si pudiera, esto simplemente combina una estructura de datos de un servicio preexistente.
l0b0
@ l0b0 Supongo que podrías verlo de esa manera. O podría decir que explota la funcionalidad del lenguaje. Después de todo, WolframAlpha fue diseñado desde cero para interactuar estrechamente con Mathematica.
DavidC
1
" La información en WolframAlpha es una parte integral de Mathematica y Wolfram Language " es un estado de cosas bastante alarmante. Eso debe convertirlo en el lenguaje de programación menos estable que existe.
Peter Taylor
9

bash, 100 bytes

head -c${1--1} /dev/zero |
openssl enc -aes-128-ctr -pass file:/dev/random 2>/dev/null |
tail -c+17

Este script imprime una secuencia de bytes criptográficamente segura. Toma un argumento opcional que especifica el número de bytes que debe imprimir. Por defecto, la salida será infinita.

Útil en casos en los que leer /dev/urandomes demasiado lento.

Punto de referencia

$ time head -c 1G /dev/urandom > /dev/null
Real    59.75
User    0.03
Sys     59.68
$ time random 1G > /dev/null
Real    0.68
User    0.64
Sys     0.86

Este script genera hasta 1.5 GiB por segundo en mi i7-3770.

En contraste, la lectura de /dev/urandomlogra generar apenas 1 GiB por minuto .

Cómo funciona

  • head -c${1--1} /dev/zerogenera la cantidad especificada de cero bytes. Si no se especifica ninguna cantidad, es ${1--1}igual a -1 y head genera una cantidad infinita.

  • openssl enc -aes-128-ctr -pass file:/dev/randomusa AES-128 en modo contador para encriptar los bytes cero, leyendo la contraseña /dev/random.

  • tail -c+17 elimina el encabezado de 16 bytes de la salida.

Dennis
fuente
Tenga en cuenta que esta secuencia se puede distinguir de una secuencia aleatoria "real" observando los primeros 2 ^ 68 bytes de salida (una secuencia aleatoria real debería tener bloques duplicados allí, este no).
Paŭlo Ebermann
@ PaŭloEbermann: Obviamente tienes razón. Por otra parte, tomaría más de 6,000 años generar tantos bytes en mi máquina ...
Dennis
7

Javascript

Resuelva cualquier ecuación (bueno, no todas, pero debería funcionar con funciones comunes ...)

r=s=>{for(x=e=a=1e-7;a;x-=e*a/(eval(s.replace(/x/g,x+e))-a))a=eval(s.replace(/x/g,x));return x}

Sin ES6 (105 caracteres):

function r(s){for(x=e=a=1e-7;a;x-=e*a/(eval(s.replace(/x/g,x+e))-a))a=eval(s.replace(/x/g,x));return x}

Simplemente dé el lado izquierdo de la ecuación suponiendo que el lado derecho es cero.

Ejemplo:

  • r("x*x-9") devoluciones 3
  • r("Math.sin(x)-1")devuelve 1.5707963394347828(pi / 2)
  • r("Math.pow(2,x)-512") devoluciones 9

Advertencia: puede divergir en algunas funciones (o si no hay solución) y congelar la pestaña del navegador, o devolver NaN.

Michael M.
fuente
6

C - 99 caracteres

i;main(int c,char**a){for(a+=2;1+(c=getchar());)putchar(c+(**(a-1)-69?1:-1)**(*a+i++%strlen(*a)));}

Este programa permite el cifrado y descifrado de cualquier tipo de datos.

Uso

Primero ... compilarlo!

gcc crypto.c crypto

Si desea cifrar el contenido de mypreciousdata.txtcon la clave mysecretkeyy almacenar el resultado en myprotecteddata.txt:

cat mypreciousdata.txt | ./crypto E mysecretkey > myprotecteddata.txt

Ahora, si desea recuperar los contenidos decodificados de myprotecteddata.txt:

cat myprotecteddata.txt | ./crypto D mysecretkey > mypreciousdata.txt

¡Cuanto más larga sea la llave, más segura!

Explicación

Encuentre el código expandido y comentado a continuación:

int main(int argc, char** argv)
{   
    // retrieve the first argument passed to the program (action)
    char action = argv[1][0];

    // retrieve the second argument passed to the program (key)
    char* key = argv[2];

    // initialize character position in the key
    int i = 0;

    // initialize the current input character
    char c = 0;

    // loop until we reach the end of input
    while (c != -1){
        // get a character from stdin
        c = getchar();
        if (action == 'E'){
            // encode the current character
            putchar(c + key[i]);
        } else{
            // decode the current character
            putchar(c - key[i]);
        }
        // increment the position in the key, without overflow
        i = (i + 1) % strlen(key);
    }
}
Mathieu Rodic
fuente
Esta es una variante del cifrado Vigenère adaptado para un alfabeto del tamaño de su chartipo (generalmente 256).
Paŭlo Ebermann
5

GolfScript

¡Logré exprimir esto en exactamente 100 caracteres!

{{}/]{97-}%}:b~:|;"etaoinshrdlcumwfgypbvkjxqz"b:f,:&,{:x[|{&x-+&%f?}%{+}*\]}%$0=1=:x|{&x-+&%97+}%''+

Toma entrada de texto cifrado ROT-n y emite el texto descodificado. (Tomado de aquí .) Por ejemplo, cuando se le da la entrada pmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivom, la salida es 8hellopeopleofprogrammingpuzzlescodegolfstackexchange.

Perilla de la puerta
fuente
5

JavaScript

Para generar una identificación única en javascript
Math.random().toString(30).slice(2);

Produce algo como: 'h9d2f4aniimma7h1d3pbffi0foi8d3mf'

cadenas de 30-32 caracteres alfanuméricos

Math.random().toString(36).slice(2)

Produce algo como: 'uq2sze67hsacq5mi'

Cuerdas de longitud 14-16.

Rana Deep
fuente
4

C ++ 57

#include<iostream>
#include<conio.h>
int main(){std::cout<<getch();}  

Este programa toma una entrada de caracteres y genera su valor ASCII.

Mukul Kumar
fuente
44
El código Brainfuck $ es mucho más corto -,:
Timtech
2
@Timtech No sé brainfuck $
Mukul Kumar
3

Fortran - 85 bytes

l=0;read(*,*)n;do while(n>0);i=mod(n,10);l=l+i;n=n/10;enddo;print*,"digit sum=",l;end

Lee un número e imprime la suma de los dígitos . Útil para los problemas del Proyecto Euler .

Kyle Kanos
fuente
¿Cómo ayuda esto a los problemas del proyecto Euler?
Paŭlo Ebermann
@ PaŭloEbermann: Tal vez debería haber agregado "algunos" antes del Proyecto Euler. Sé con certeza que los problemas 16, 20 y 119 usan sumas de dígitos, no estoy seguro acerca de los demás, pero muchos de sus problemas no necesitan este.
Kyle Kanos