Se você não conhece o hacker typer, consulte hackertyper.net . Em resumo, é um programa que gera um pedaço de uma base de código por pressionamento de tecla para efeito cômico. MAS, a versão hackertyper.net é muito fácil de implementar. Ele simplesmente gera três caracteres por vez a partir de um trecho de código arbitrário . Para esse desafio, um programa deve gerar seu próprio código-fonte e imprimir um pedaço de código delimitado por espaço por pressionamento de tecla.
Detalhes
- Não se pode codificar um nome de arquivo para o programa; deve determinar seu nome dinamicamente. Se o programa for compilado em um executável, ele poderá anexar a extensão de arquivo padrão ao nome do executável (excluindo o .exe se estiver usando o Windows) e supor que o arquivo de origem esteja no diretório do executável. Por exemplo, se um executável C é chamado "hacker", ele deve extrair seu código-fonte de um arquivo chamado "hacker.c" no mesmo diretório. Se um programa compilado tiver uma extensão, ele deverá ser descartado antes de determinar o nome do seu código-fonte ("typer.exe" -> "typer.cs").
- Os programas devem conter pelo menos 5 espaços, com pelo menos um caractere entre cada espaço. Isso significa que o menor tamanho possível para esse desafio é 9 bytes. Os espaços não precisam ser cruciais para o funcionamento do programa.
- Qualquer formatação (recuo, novas linhas etc.) deve ser mantida na saída. Essa formatação pode ser impressa com o código que a segue ou segue, o que importa é que a formatação seja mantida.
- Evite usar comentários para satisfazer o requisito de 5 espaços, a menos que não haja outra maneira de implementar os espaços no idioma de sua escolha.
EDIT : Novas linhas podem ser usadas no lugar de, ou além de, espaços como separadores de pedaços.
Respostas:
festança, 51
58fonte
2: read: Illegal option -s
)cat $0
e tils com$(<$0)
IFS=\
realmente necessário se você omitir o shebang? O IFS padrão é algo comoIFS=$'\n\t '
, e como você não tem mais uma nova linha, não acho que você precise limitá-la a apenas espaço.for w in `<$0`;{ read \-sn1;printf $w\ ;}
HTML e JavaScript, 123
Isso funciona de maneira semelhante ao hacker typer, mas com seu próprio código-fonte. Deixe-me saber se eu não entendi as regras.
E aqui está uma versão estilizada (170 caracteres):
Eu fiz uma demonstração . Foi modificado porque o JS Bin adiciona muito código extra, mas a ideia geral é a mesma.
fonte
<head>
foi que o navegador o adicionará se não estiver lá, para que seja sempre exibido. Eu esqueci<html>
embora.Perl + Term :: ReadKey, 56 bytes
Agradecemos a ThisSuitIsBlackNot pela inspiração original e ao primo por sugerir
open 0
e<0>
.Observe que a nova linha depois
for
é realmente desnecessária, exceto que eu preciso incluir uma nova linha extra em algum lugar para elevar a contagem de espaços em branco até o mínimo especificado de cinco.Observe também que, como o envio de ThisSuitIsBlackNot, este programa requer o módulo Term :: ReadKey do CPAN. No Debian / Ubuntu Linux, este módulo, se já não estiver presente, pode ser facilmente instalado com o comando
sudo apt-get install libterm-readkey-perl
.Além disso, para salvar alguns caracteres, este programa não restaura o modo de entrada normal na saída, portanto, talvez você não consiga ver o que está digitando posteriormente. A execução do comando shell
stty sane
oureset
deve corrigir isso. Esse problema pode ser corrigido, ao custo de 10 bytes extras, com:Bônus: Quine puro, 81 bytes
Novamente, a nova linha após a vírgula é necessária apenas para atingir o mínimo de cinco espaços em branco.
Ao contrário do programa de 56 bytes acima, esta versão não precisa realmente ler seu próprio código-fonte, pois é baseada em um quine - especificamente, neste quine:
O bom desse quine é que ele pode transportar facilmente uma "carga útil" arbitrária dentro do
q{ }
bloco, sem precisar repeti-lo. Embora não possa bater<0>
em pouco, ele chega bem perto.Nota: Este programa usa o
say
recurso Perl 5.10+ e, portanto, precisa ser chamado com a opção de linha de comando-M5.010
(ou-E
). Por consenso estabelecido sobre a meta, essas opções usadas para habilitar os recursos modernos de linguagem não contam como caracteres extras . A solução mais curta que posso encontrarsay
é de 83 bytes:Ambos também podem ser mais amigáveis ao terminal (juntando as duas últimas linhas e) inserindo:
antes do último
}
.fonte
stty sane
em vez dereset
(o que poderia, em alguns os, por vezes, estar fazendo algo mais do que apenas redefinindo alguns parâmetros terminais ^^)open F,$0
e<F>
pode ser substituído poropen 0
e<0>
. Além disso, eu argumentaria que um post na meta não constitui realmente um consenso. A opção "-M5.01
não leva o idioma a um ponto específico" , como sugere o autor, habilita recursos. Não há versão do perl para a qual esses recursos sejam ativados por padrão.ruby golfscript.rb foo.gs
conta como um comando válido para executar um programa escrito em GolfScript,perl -M5.010 foo.pl
deve contar como um comando válido para executar um programa escrito em "Perl 5.10". Mas esses argumentos realmente pertencem à meta, não aqui.)Python 3 - 124 bytes - 7 espaços
Código:
Ungolfed:
Versão com estilo:
fonte
Ruby,
85, 71Pena que
IO#raw
não faz parte da biblioteca padrão.Melhoria
Este elimina a chamada para saída do Kernel # e usa variáveis globais para encurtar o código.
fonte
Befunge - 21
Estou bastante satisfeito com isso, pois acabei de descobrir sobre o Befunge. Se você não se importa em "digitar" em uma janela pop-up, pode executá-la aqui ou aqui até encontrar um melhor intérprete online.
fonte
Powershell, 89
fonte
Python 3 - 299
É uma solução. Encurtado de 507 usando
exec
e movendo algumas instruções.fonte
C,
211186 bytesMinha solução em C usando a biblioteca de maldições. Pode ser mais longo que a outra solução C, mas é um problema. Embora não seja exigido pela pergunta, ainda é muito bom. Também funciona muito bem:
Uma versão mais legível com alguns comentários e outras coisas:
ajuntar com:
fonte
C -
136 135132 bytes (somente Windows)Nota: existe um espaço no final do programa que provavelmente não aparecerá.
Não posso garantir que este programa funcione em um único computador que não seja o meu, pois é incrivelmente hacky. As coisas teriam sido muito mais simples quando todos tinham apenas máquinas de 32 bits. Então eu não precisaria me preocupar em
sizeof(int*)
ter 8 anos (o que definitivamente é; eu imprimi para ter certeza) enquantosizeof(int)
é 4.Felizmente, o nome do executável é armazenado na primeira string em argv.
No entanto, colocar um ponteiro como argumento em uma função significa que eu tenho que especificar explicitamente o tipo de TODOS os argumentos para a função - o que significa que eu precisaria digitarFelizmente, encontrei uma solução alternativa. Eu tive o segundo argumento para mainint
duas vezes - um enorme desperdício de caracteres.q
,, ser apenas mais um int. Em seguida, atribuirq
a uma variável do tipoint**
conseguiu, de alguma forma, capturar todos os bytes necessários da pilha.Não consegui encontrar nenhum truque para interpretar o tipo de retorno
fopen
como um ponteiro sem declarar a função.Edit: Notei que devo usar em
~fscanf(*v,"%s",b)
vez de,fscanf(*v,"%s",b)>0
pois o retorno é -1 quando o EOF é atingido.fonte
void **v;
) em vez de prototiparfopen()
.fopen
. Não vejo por que substituir void por int deve fazer a diferença, pois todos os ponteiros têm o mesmo tamanho.b[1<<20];main(int *c,char **v){strcpy(b,*v);strcat(b,".c");c=fopen(b,"r");for(;fscanf(c,"%s",b)>0;printf("%s ",b))getch();}
(eu tive que substituirgetchar()
por umgetch()
).*fopen()
vez de*fopen(a,b)
?Perl - 87 bytes
Eu não vi nada nas regras sobre o que fazer depois que o arquivo foi lido até o final, então ele simplesmente fica aguardando a entrada após a impressão do último pedaço.
fonte
node.js com LiveScript:
versão assíncrona:
fonte
Cobra - 147
CobraCore.exePath
é tão útil!fonte
Javascript ES6, 154
Firefox 154 :
Chrome 175 :
Ambos 274 :
Ungolfed (chrome):
Possui duas versões, porque o Chrome não suporta a função de seta e o console não é limpo com o mesmo método
O Firefox trabalha com firebug, parece que o console do desenvolvedor padrão não pode ser limpo de um script.
fonte
Groovy - 379
Como não existe
getch()
ou equivalente em linguagens Java e Java-esque como Groovy ... basicamente meu código não lida com pressionamentos de tecla. Isso é tudo: Dfonte
C, 248 caracteres
Quine verdadeiro
Só funciona no unix, no windows seria implementado usando _getch.
fonte
HTML e Javascript, 232 bytes
O tradicional Javascript quine, mas modificado.
JSFiddle aqui .
fonte
SmileBASIC,
7975 bytesÉ muito fácil obter uma linha específica de um programa no SmileBASIC, por isso, basta colocar os espaços antes de cada quebra de linha.Eu pensei que era tão inteligente, colocando os espaços antes de cada quebra de linha, mas aparentemente podemos usar quebras de linha em vez de espaços ...Explicação:
fonte
Haskell
fonte