Crie o programa mais útil com 100 caracteres [fechado]


13

Nesta tarefa, você pode criar um programa útil para fazer qualquer coisa que possa escrever com 100 caracteres. Você tem permissão para usar menos caracteres, mas não mais.

Regras, apenas para se proteger de brechas comuns que não são mais engraçadas:

  1. Seu programa não pode acessar a Internet, a menos que seja realmente necessário. Por exemplo, o programa que mostra a pergunta mais votada neste site pode usar a Internet para verificar essa pergunta. No entanto, não é permitido navegar na Internet para encontrar sua fonte real e executá-la.

  2. Seu programa não pode ser um intérprete para o idioma em que foi escrito. No entanto, o intérprete Brainfuck em um idioma não-Brainfuck seria bom.

  3. Seu programa não pode executar programas externos que fazem exatamente o que o seu programa faz. Por exemplo, você não pode executar vime afirmar que seu programa é vimimplementação.

  4. Seu programa não pode ser perigoso para o computador em que está sendo executado e para outros computadores. Você não tem permissão para escrever programas como rmdir /(o exemplo aqui intencionalmente não funciona, não o conserte) e afirma que é um programa útil para remover todos os arquivos no computador.

  5. Seu programa pode ser tão lento quanto você deseja e usar tantos recursos quanto você quiser, desde que você possa provar que faz o que deveria.

  6. Você não tem permissão para criar um idioma específico para esta tarefa. No entanto, você tem permissão para criar intérpretes para a sua linguagem inventada em alguma outra linguagem de programação.


Posso postar mais de uma resposta para este concurso?
TrungDQ

@TrungDQ: Claro.
Konrad Borowski

1
Isso tem que ser uma das melhores perguntas até agora;)
Timtech

13
Isso é muito aberto, mesmo para um site como este, mesmo para um concurso de popularidade. Literalmente, qualquer resposta é válida, não há nenhum quadro de referência para compará-las.
Aaronaught 23/03

3
Esta questão está canibalizando o código-golfe. Idéias interessantes de 100 personagens devem poder ser reformuladas em ótimas perguntas sobre código de ouro. Encorajo os respondentes a dedicar alguns minutos extras para transformar suas respostas em novas perguntas.
gnibbler

Respostas:


26

C - 47 bytes

O programa a seguir gera todos os documentos já escritos na história da humanidade, juntamente com todos os documentos que serão escritos e vários textos interessantes que nenhum ser humano jamais apresentou (junto com um "pedacinho" de lixo entre eles). Apenas dê um tempo. Além disso, toda vez que você executá-lo, ele produzirá textos diferentes primeiro! Se isso não for útil! (E tudo isso dentro da metade do limite de caracteres!)

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

Se você não se importa com a saída de algo a cada vez, precisa apenas de 41 bytes !

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

Não é bem compatível com o C99, mas compila sem problemas gcc.exe (GCC) 4.7.0 20111220.

O estado das regras

Seu programa pode ser tão lento quanto você deseja e usar tantos recursos quanto você quiser, desde que você possa provar que faz o que deveria.

Sem problemas.

Algumas coisas, este programa produzirá:

  • uma solução para todos os problemas do milênio
  • artigos de jornal de amanhã
  • os trabalhos completos de Shakespeare (é claro)
  • seu segredo mais sombrio
  • todas as outras respostas a esta pergunta

Na verdade não, porque (como o ás mencionado corretamente no comentário), rand () é apenas um gerador pseudo-aleatório, que será contornado em algum momento - provavelmente muito cedo para produzir muitos textos significativos. Mas duvido que obter dados de um gerador de números aleatórios verdadeiro (hardware) seja remotamente possível dentro de 100 caracteres. Vou deixar isso aqui por diversão, no entanto.

Como observa Dennis, a aleatoriedade do algoritmo pode ser um pouco melhorada (dentro do limite de caracteres), usando em rand()^rand()>>16vez de rand().


10
Não necessariamente. rand()é apenas pseudo-aleatório - ele pode não produzir nenhum texto útil antes que ele circule.
user12205

1
@ Dennis, felizmente, isso ainda está dentro das regras desta pergunta! :)
Martin Ender

1
@ m.buettner: Com o rand () do GLIBC , há uma relação algébrica simples entre os bytes da saída do seu programa: Visualizando a saída como uma matriz x, você tem x[i] == (x[i - 3] + x[i - 31] + c[i]) % 256, onde c[i]é 0 com probabilidade 0,75 e 1 com probabilidade 0,25. Isso significa que ele não pode gerar nada do que você mencionou.
Dennis

1
@ m.buettner: Não vai melhorar muito o PRNG, mas você pode remover a linearidade usando em rand()^rand()>>16vez de simples rand(). Se você estiver procurando maneiras de economizar em bytes, remova inte %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

Traça as soluções para equações diferenciais de primeira e segunda ordem.

Toma como entrada do usuário:

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 um software de solução de equações diferenciais chamado Polymath, que eu usei quando estudava para ser um engenheiro químico. Introduziríamos diferentes equações para reagentes e produtos e veríamos como todo o sistema de reação mudou ao longo do tempo. Um software muito simples (não muito mais complexo que isso), mas muito mais conveniente para esse propósito que o Excel. Infelizmente, não posso fazer um clone completo do Polymath em 100 caracteres.

insira a descrição da imagem aqui


10

Mathematica 76

Este programa constrói um applet que exibe informações sobre várias propriedades de qualquer um dos 240 países. Ele abre com informações sobre a população adulta do Afeganistão. O usuário pode alterar as configurações de país e propriedade por meio de listas suspensas.

O Mathematica interopera sem problemas com o WolframAlpha.
Por esse motivo, acredito que o envio atenda ao requisito nº 1 do desafio: "Seu programa não pode acessar a Internet, a menos que seja realmente necessário ".

Este miniaplicativo bastante modesto simplesmente faz uso da funcionalidade existente na linguagem Mathematica. Um pequeno vídeo fornece algumas informações adicionais sobre o applet.

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

alfa


Abaixo está uma lista das 20 primeiras (de 223) propriedades relacionadas a países. Com uma programação adicional, é possível obter informações adicionais sobre os países e analisar essas informações no Mathematica.

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

{"AdultPopulation", "AgriculturalProducts", "AgriculturalValueAdded", "Aerports", "AlternateNames", "AlternateStandardNames", "AMRadioStations", "AnnualBirths", "AnnualDeaths", "AnnualHIVAIDSDeaths", "ArableLandArea", "ArableLandFraction" Área "," BirthRateFraction "," BorderingCountries "," BordersLengths "," BoundaryLength "," CallingCode "," CapitalCity "," CapitalLocation "}


Não vejo como o seu programa "precisa" acessar a internet. Os dados que você apresenta não são alterados com tanta frequência que você precisaria contar com uma fonte externa.
shiona 23/03

1
Se a fonte está dentro ou fora, está aberta ao debate. Eu estava considerando o pedido de informações sobre o WolframAlpha (que o código faz) como um caso (necessário) de "acesso à internet", mesmo que o código consulte diretamente um servidor de dados Wolfram e não exija o uso de um navegador como o FireFox. Exige que um tenha uma conexão de rede ou WIFI #
18777

1
-1 se eu pudesse - isso simplesmente mescla uma estrutura de dados de um serviço pré-existente.
L0b0 23/03

@ l0b0 Suponho que você possa ver dessa maneira. Ou você pode dizer que explora a funcionalidade da linguagem. Afinal, o WolframAlpha foi projetado desde o início para interoperar estreitamente com o Mathematica.
23414

1
" As informações no WolframAlpha são parte integrante do Mathematica e a Wolfram Language " é um estado de coisas bastante alarmante. Isso deve torná-lo a linguagem de programação menos estável 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 um fluxo de bytes criptograficamente seguro. É necessário um argumento opcional que especifica o número de bytes que deve ser impresso. Por padrão, a saída será infinita.

Útil nos casos em que a leitura /dev/urandomé muito lenta.

Referência

$ 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 gera até 1,5 GiB por segundo no meu i7-3770.

Por outro lado, a leitura de /dev/urandomconsegue gerar apenas 1 GiB por minuto .

Como funciona

  • head -c${1--1} /dev/zerogera a quantidade especificada de zero bytes. Se nenhuma quantidade for especificada, será ${1--1}igual a -1 e o cabeçote emitirá uma quantidade infinita.

  • openssl enc -aes-128-ctr -pass file:/dev/randomusa o AES-128 no modo contador para criptografar os zero bytes, lendo a senha em /dev/random.

  • tail -c+17 se livra do cabeçalho de 16 bytes da saída.


Observe que esse fluxo pode ser diferenciado de um fluxo aleatório "real" observando os primeiros 2 ^ 68 bytes de saída (um fluxo aleatório real deve ter blocos duplicados lá, este não será).
Paŭlo Ebermann 23/03

@ PaŭloEbermann: Você está obviamente certo. Então, novamente, levaria mais de 6.000 anos para gerar que muitos bytes na minha máquina ...
Dennis

7

Javascript

Resolva qualquer equação (bem, não todas, mas deve funcionar com funções comuns ...)

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}

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

Apenas dê o lado esquerdo da equação assumindo que o lado direito seja zero.

Exemplo:

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

Aviso: pode divergir em algumas funções (ou se não houver solução) e congelar a guia do navegador ou retornar o NaN.


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 criptografia e descriptografia de qualquer tipo de dados.

Uso

Primeiro ... compile-o!

gcc crypto.c crypto

Se você deseja criptografar o conteúdo mypreciousdata.txtcom a chave mysecretkeye armazene o resultado em myprotecteddata.txt:

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

Agora, se você deseja recuperar o conteúdo decodificado de myprotecteddata.txt:

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

Quanto mais longa a chave, mais segura!

Explicação

Encontre o código expandido e comentado abaixo:

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

Essa é uma variante da cifra de Vigenère adaptada para um alfabeto do tamanho do seu chartipo (geralmente 256).
Paŭlo Ebermann 23/03

5

GolfScript

Consegui espremer isso em exatamente 100 caracteres!

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

Ele recebe a entrada de texto criptografado ROT-n e gera o texto decodificado. (Tirada daqui .) Por exemplo, quando recebida a entrada pmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivom, a saída é 8hellopeopleofprogrammingpuzzlescodegolfstackexchange.


5

Javascript

Para gerar um ID exclusivo em javascript
Math.random().toString(30).slice(2);

Produz algo como: 'h9d2f4aniimma7h1d3pbffi0foi8d3mf'

cadeias de 30 a 32 caracteres alfanuméricos

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

Produz algo como: 'uq2sze67hsacq5mi'

Cordas de comprimento 14-16.



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

Lê um número e imprime a soma dos dígitos . Útil para problemas do Project Euler .


Como isso ajuda nos problemas do projeto Euler?
Paŭlo Ebermann 23/03

@ PaŭloEbermann: Talvez eu devesse ter adicionado "alguns" antes do Projeto Euler. Sei com certeza que os problemas 16, 20 e 119 usam somas de dígitos, não tenho certeza sobre os outros, mas muitos de seus problemas não precisam desse.
precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.