yes
, de coreutils, tem 91 linhas . Muitos deles são comentários, mas que ainda é MANEIRA demasiado longo.
Editar a partir de setembro de 2019: o arquivo de origem cresceu nos últimos cinco anos e agora tem 126 linhas.
Escreva um programa que imite yes
:
- saída para
stdout
um fluxo infinito de "y \ n" 's - deve haver uma opção para pará-lo, exceto matar o processo com
SIGKILL
: butSIGINT
andSIGPIPE
are fine - você não tem permissão para usar "y" ou "\ n" ou seus valores ASCII (121, 0x79, 0171, 10, 0xA ou 012)
A resposta mais curta vence.
Bônus:
- subtraia 10 do comprimento do código, se você puder receber uma frase
stdin
e imprimi-la em vez de "y" (mas ainda incluindo a quebra de linha).
code-golf
restricted-source
Ramon Snir
fonte
fonte
y
ou\n
dentro de uma string literal"?true.c
tem 80 linhas.yes
usa um argumento opcional na linha de comando, nãostdin
.y
mesmos.Respostas:
CJam, 13 bytes - 10 = 3
Você precisará usar o intérprete Java para isso, porque o intérprete on-line só retorna quando o programa termina.
Você pode abortar o programa com SIGINT (pressionando Ctrl-C). Ele lerá uma linha de STDIN e imprimirá essa linha, ou
y
se a entrada estiver vazia.Explicação
Após o esclarecimento do PO, o seguinte parece ser mais específico:
Esperarei atualizar o envio até que o OP responda ao meu comentário.
fonte
/no/i
, considerando o desafio.Brainfuck - 38 bytes
Ele não usa 10 ou 121, porque
+-<>.,[]
são todos os caracteres significativos no idioma, mas calcula-os de maneira bastante ingênua (0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 = 10, 10 * 12 + 1 = 121).Provavelmente isso depende do intérprete, mas ele morre
^C
na minha máquina.Brainfuck - (63-10) = 53
fonte
Python 3, 27 bytes
Funciona com pelo menos CPython e Jython.
SIGINT para.
fonte
while 1:print`help`[1]
.chr(11**2)
para economizar alguns personagens bem121
.Marbelous 14 bytes
Isso é bem simples: o dispositivo '/ \' coloca duas cópias à esquerda e à direita, a direita é incrementada
++
e depois cai do quadro e é impressa. O]]
dispositivo empurra qualquer mármore para a direita se STDIN estiver vazio, mas permite que o primeiro byte no STDIN caia se não estiver. Isso acionará o!!
dispositivo, que sai do quadro. Portanto, isso será impresso y \ n até você inserir qualquer coisa no stdin.Isso funciona apenas no interpretador python.
fonte
Pitão,
1096 bytes - 10 =0-1-4Eu venho tentando há muito tempo conseguir um que eu esteja satisfeito. Basicamente, converte para:
fonte
#
tem funcionalidade equivalenteW1
eePG
é uma maneira muito mais curta de obter o personagem doy
queC^hT2
.C #,
817876 bytesNão pode competir com os outros idiomas, mas aqui está mesmo assim:
Pode ser morto com o SIGINT pressionando Ctrl+ C.
Nenhum bônus, porque levaria mais de 10 bytes para obtê-lo.
fonte
while(1)
? Salva dois caracteres.for(;;)
deve funcionar.y
. Por favor, examineSystem
.System
não pode ser removido. é o principal espaço para nome no .NET Framework, todas as classes / outros espaços para nome estão nele, portanto a reflexão não ajudará aqui. Mas não tenho certeza se é inválido. Veja o comentário de Ramon: "nada que avalie y ou \ n". Isso não avalia comoy
. Estou deixando um comentário sobre a pergunta para perguntar a Ramon se isso é válido.Java, 178
A impressão requer
System
, mas oy
caractere é proibido. Por isso, tive que usar a reflexão.fonte
;
, colocandochar c='x'+1;
nafor
declaração loop, por issofor(char c='x'+1;;)
desde que você tem um ponto e vírgula vazio lá de qualquer maneiraPerl: 18 bytes - 10 = 8
A sequência é de STDIN.
fonte
y\n
repetidamente se não receber entrada do STDIN? Se não, então não imita corretamenteyes
.yes
não recebe entrada deSTDIN
afinal :) :)y\n
.Ruby,
302318 bytesPode ser morto com o SIGINT pressionando Ctrl+ C.
Obrigado ao manatwork por compartilhar melhorias!
fonte
loop{puts [*?x..?z][1]}
- 23 caracteres,loop{puts ?x.succ}
- 18 caracteresPerl, 26 bytes
Entrada personalizada do argumento (como
yes
realmente funciona), 22 bytes-10 = 12Entrada personalizada de stdin, 22 bytes-10 = 12
fonte
C,
6455534540 - 10 = 30main(int c,int**a){for(;;)puts(a[c>1]);}
Eu não estou muito feliz com isso, pois exige que o programa seja nomeado "y" e chamado apenas com `y`, portanto, ele deve estar em $ PATH, mas ei, primeiro codegolf :)
Alternativa:
C, 30 (+ 1 nome do arquivo)
main(){for(;;)puts(__FILE__);}
Usando a mesma técnica do meu estimado colega @ Windsor Windsor
fonte
Linux Bash, 33-10 = 23
Pode ser morto com o SIGINT pressionando Ctrl+ C.
fonte
yes
senãocat
programas.read a;for((;;));{ echo $a;}
Ferrugem, 52 caracteres
y
Parece que simplesmente não há uma maneira agradável de calcular sem ser atrevido no Rust - eles fizeram um trabalho muito bom ao fazer chars com segurança. EU:println!
, portanto, nenhum truque é permitido lá;'x'
, porque no Rust os caracteres não são números;Também não vale o bônus de código, porque a leitura de
stdin
exigiria tratamento de erros = 3Muitas das reduções de código que pude encontrar envolviam fazer coisas cada vez mais desrespeitadoras de regras com o ambiente do compilador:
Ferrugem, 44 caracteres (+ pelo menos 1 caractere para o nome do arquivo)
Obsoleto abaixo. Este provavelmente não conta, pois o nome do arquivo de origem precisa começar
y
.Edit: Rust, 36 caracteres (35 fonte, 1 nome do arquivo)
Como acima, mas o arquivo tem de ser chamado
y
(nãoy.rs
,y
). Bem humorado, Rust substituirá a fonte pelo binário! Pelo menos na minha máquina, o binário funciona depois disso.Ferrugem, 37 caracteres (+ equivalente
env K='y'
na sua plataforma)Essa é ainda pior: você precisa definir a variável de ambiente
K
comoy
em tempo de compilação .Editar : se você definir
K
comoy\n
, poderá fazer o drop-ln
inprintln!
, para um total geral de35 caracteres evários facepalms:fonte
x
uma maneira, mas ainda não é curto:(b'x' + 1) as char
Linux Bash - 19 bytes
Isso provavelmente está trapaceando e está sujeito a falha se você não tiver / usr / bin / yes ou tiver um / usr / bin / xes ou / usr / bin / zes:
Acho que atende aos requisitos, embora talvez esteja violando a regra "nada que avalie para y". E talvez imitar
yes
executando de verdadeyes
seja contra as regras.Isso pode ser otimizado um pouco (embora menos provável que funcione) para reduzir para 11 bytes:
Eu não conseguia descobrir como obter o bônus de 10 pontos lendo uma string do stdin sem adicionar mais de 10 bytes ao código
fonte
/*/*/?es `line`
, ou/*/*/?es `head -n1`
se você não tiver/usr/bin/line
.sed q
paraline
.dc, 12
Somente saídas
y\n
. Não lê de stdin, então nenhum bônus.30986 é 0x790A (ou seja, "y \ n"). O
P
comando simplesmente converte o número na base 256 e imprime o caractere correspondente para cada dígito de base 256.fonte
y\n
?P
mas não sabia, que podia fazer mais de um personagem de cada vez.Lisp comum: (30-10) = 20
(read)
do fluxo de entrada(format t ... )
format
argumentos (apenas um aqui):~@{ ... ~}
dentro do loop, para cada argumento:
~A
seguido por uma nova linha~%
~:*
(loop infinito)Você pode interromper o loop Ctrl+C, o que indica um erro nas opções de reinicialização (continuar / abortar).
fonte
Haskell, 29 bytes
Eu acredito que isso é interrompido por ambos
SIGINT
eSIGPIPE
.fonte
'\89'
vez desucc 'x'
Ruby, 27 bytes - 10 = 17
É apenas a solução do @ ProgramFOX com o bônus (foram necessários meus 9 bytes para resolver a questão do bônus).
fonte
dc, 21 bytes - 10 = 11
Observe que a entrada precisa ser inserida
[]
, por exemplo[no]
, porque?
é a única maneira de obter entrada, que a executa comodc
código.fonte
C2
vez de122
. Na verdade eu diria que122 1-
poderia ser substituído porC1
quantoC1
não é explicitamente proibido em questãoCommodore 64 Basic:
1413 bytesComo sempre, fiz substituições de caracteres no PETSCII que não estão presentes no Unicode.
|
é usado para representarSHIFT+H
, enquanto╭
representaSHIFT+U
. Observe que isso gera ASCII 'y' (valor de byte 121) em vez de um caractere que o conjunto de caracteres padrão do Commodore exibe como 'y'.O BASIC é supostamente uma linguagem de programação fácil de aprender, semelhante ao inglês. Use os atalhos de digitação presentes em muitos dialetos antigos e você terá algo mais curto e menos legível que o Perl.
EDIT : No "modo deslocado", isso fica dois bytes mais curto, graças à codificação "y" minúscula no valor decimal 89. O uso de um conjunto de caracteres não ASCII para contornar a regra "não permitido usar seus valores ASCII" pode ser trapaça, no entanto.
fonte
SHIFT+H
, mas o caractere do tubo é mais fácil de digitar. Não há nada que corresponda às "linhas nas bordas superior e esquerda" produzidas por `SHIFT + O".AWK, 38 bytes
Variante que lerá a string em stdin: 14 bytes-10 = 4
Mas como ele não pode fazer as duas coisas (reverta para "y" se nenhum stdin for fornecido), não tenho certeza se isso conta ...: o)
Ambos podem ser encerrados com Ctrl + C.
fonte
Fissão , 5 bytes
Isso é bastante competitivo para a fissão. :)
O fluxo de controle começa com um
(1,0)
átomo à direita emR
.x
define a massa como120
e a+
incrementa para fornecer(121,0)
. Em seguida,!
imprime o caractere correspondente (y
) eN
imprime uma nova linha. O código fonte envolve as bordas, para que o átomo passeR
novamente (o que não faz mais nada agora),x
ajusta a massa120
novamente, a+
incrementa e assim por diante ...fonte
C, 32 bytes
Requer pouca máquina endian e compilação com -O2 (para evitar o estouro da pilha).
fonte
PowerShell, 27 - 10 = 17
Pode não funcionar em Pash. Uma alternativa mais robusta deve ser
fonte
Lua, 42 bytes - 10 = 32
Lua, 49 bytes - 10 = 39
Ambos foram testados com Lua 5.1.4 e podem ser eliminados com SIGINT ( Ctrl+ C).
fonte
Perl, 31
Aqui está uma versão do Perl que realmente se comporta como o GNU
yes
, até onde eu sei:Isso funciona se não há problema em usar as opções de linha de comando do perl (
-l
para a nova linha), caso contrário, isso tornaria mais três caracteres:fonte
-l
(não-e
) a opção para a nova linha.CAPL 1.5+; 6 sem entrada; 10 - 10 = 0 com entrada
Sidenote
: Li em algum lugar [link?] Que linguagens personalizadas não são permitidas em perguntas sobre golfe, pois elas podem criar funções internas que fazem exatamente o que a pergunta está perguntando; no entanto, eu fiz o CAPL para facilitar o golfe em geral . Se você acha que isso não é permitido aqui, me avise!
Eu tenho algumas idéias de > <> e Befunge (você pode se mover entre linhas e usar caracteres hexadecimais para pressionar números), algumas de Ruby e outras de minha autoria para facilitar o golfe.
O CAPL lê da esquerda para a direita e desce uma linha no final da linha. Se for a última linha, o programa será encerrado.
Como ninguém conhece esse idioma ainda, tentarei explicar o máximo possível.
Saída y. 6 bytes
bb*.n<
bb*
b
é hexadecimal para11
, assimbb*
como11*11
=121
, que é o equivalente UTF-8y
. Este valor é enviado para a pilha..
Aparece o valor superior da pilha e gera como UTF-8. Como121
está no topo da pilha, o índice é ignorado aqui.n
Gera uma nova linha<
Envia o ponteiro de volta ao início da linha, repetindo a linha. Como não esperamos entrada, podemos fazer isso com segurança sem solicitar novamente a entrada.Saída da entrada. 10 bytes, 0 após bônus
i~a&{X:.)}
i
Recebe a entrada do usuário, pressiona como UTF-8 na parte superior da pilha e pressiona o comprimento depois disso. Ou seja,[72,101,108,108,111,5]
~
aparece um número da pilha e depois inverte essa quantidade de bytes.[111,108,108,101,72]
a
Ou seja, Hexadecimal para10
, o caractere de nova linha&{...}
Faz um loop infinito. Temos entrada, portanto não podemos enviar o ponteiro de volta para a linha. Eu poderia colocar a função na linha abaixo, o que me garantiria um byte, mas novas linhas não são permitidas neste desafio.X
Remove o valor superior da pilha (O índice do loop):.
Duplica o valor superior e emite como UTF-8)
Vira a pilha para a direita. ([1,2,3,4,5]
->[5,1,2,3,4]
)No entanto, isso significa que começamos com uma nova linha, depois iniciamos a saída da entrada, depois uma nova linha, depois a entrada etc. Se não for permitido iniciar com uma nova linha, use o código a seguir com 12 bytes ou 2 após subtrair o bônus.
iXa#~&{X:.)}
O único novo comando aqui é o
#
que envia a quantidade de itens da pilha para a pilha.Eu removi o comprimento de
i
, porque adicionar 1 e trocar com a nova linha é mais longo do que remover e obter o comprimento novamente.Apenas por diversão, aqui está um programa "Hello World"
A
?!
operação é igual à de> <>fonte
APL (Dyalog APL) , 5 - 10 = -5 bytes
Aviso: confia em um recurso / bug não documentado e não suportado.
STDIN vazio imprime linhas vazias (não "y"), o que é permitido e foi sugerido .
Experimente online!
⎕
STDOUT com novas linhas à direita,←
fica⍣
repetidamente até≢
difere de⍞
STDINou seja, nunca, mas ininterrupta ao pausar o thread.
fonte
⍣
na atribuição←
, mesmo que←
não seja uma função real adequada e, portanto, não seja realmente elegível para ser um operando. Ainda funciona ...> <>, 6 bytes
Ao não incluir um
;
no final, o > <> continuará nadando até que ele seja liberado por um SIGINT.Explicação
> <>, 17 - 10 = 7 bytes
A anterior é uma solução bastante chata, então aqui está uma que recebe a entrada de stdin. Isso abusa do fato de que a maneira padrão de fornecer entrada para um programa > <> é
echo 'input' | fish.py yes.fish
, ondeecho
fornece o\n
caractere.Explicação
O
0r
final permite que o loop aconteça ao redor, onde ainda presumimos que a pilha seja revertida com um-1
no topo.fonte
Aparentemente, isso não é totalmente portátil. Meu
sys.version
é2.7.9 (default, Dec 11 2014, 04:42:00) \n[GCC 4.9.2]
, então, se o seu for diferente, isso pode não funcionar, eu acho.Python 2 - (76-10) = 66
Muito tempo, mas eu queria ir para o bônus (mesmo que custe mais de 10 bytes). Aparentemente, verificar se stdin está vazio ou não sem solicitar a entrada é longo.
No começo, interpretei mal o bônus como argumento em vez de stdin. Estou orgulhoso da minha solução para isso, então estou postando assim mesmo;)
Python 2 - (52-10 + ∞) = ∞ (inválido!)
sys.argv
é uma lista em que o elemento zeroth é o nome do arquivo e cada elemento posterior é um argumento fornecido ao programa. Eu adiciono um valor falsey ao final da lista; se não houver argumentos, o primeiro elemento é esse valor de falsey, caso contrário, é o primeiro argumento.a or b
em Python retorna o primeiro valor que confirma qual será o resultado: sea
for verdade, já sabemos que tudo será verdade, então é retornado. Se for falso,b
será retornado (desdeFalse or b
==b
).fonte
y\n
imediatamente se stdin estivesse vazio.r=raw_input();p=r if r else`help`[1]\nwhile 1:print p
52 caracteresy
, a segunda também.