Seu desafio é ler uma "senha" da entrada padrão / teclado.
Desafio :
- Leia uma string
s
invisivelmente. - Para cada um dos caracteres
s
inseridos, imprima um caracterec
. - Em tempo real.
Regras:
- Você deve imprimir
c
em tempo real. Assim que o usuário digitar um caractere, você deverá exibirc
. c
deve ser constante, ou seja, deve ser o mesmo caractere.c
pode ser qualquer caractere visível (ou seja, não pode ser uma nova linha, espaço, guia ou não imprimível).c
não pode ser baseados
, ou seja,c
deve ser definido / constante antes des
ser lido.c
deve ser o mesmo sempre que o programa for executado.c
pode ser um dos personagenss
se acidentalmente, desde que todas as outras regras sejam seguidas.- Nenhum dos caracteres de
s
pode aparecer na tela,c
exceto (consulte a regra anterior). - Você pode usar qualquer método razoável de entrada e saída, desde que todas as outras regras sejam seguidas.
- Você pode supor que o comprimento de
s
nunca seja maior que a largura da janela do terminal / gráfico. - Se estiver usando um terminal, seu programa deve terminar após a inserção de uma nova linha ou EOF.
Exemplo :
Se s
foi password01
e c
foi *
, a saída seria algo como:
Vencedor :
A submissão mais curta em cada idioma vence.
tkinter
permitido o python para o nosso campo de entrada personalizado (como o HTML), para que o programa não termine quando pressionar enter, mas quando você fecha aEntry
janela (X no Windows ecmd
+W
no mac)?Respostas:
str , 5 bytes
Devido a um erro, são 5 bytes. Deve ter apenas 1 byte:
fonte
cmder
resposta devido ao seuCtrl+Z
comentário: PHTML, 20 bytes
Alternativa: HTML + JavaScript, 51 bytes
Embora o OP tenha confirmado que isso é válido, aqui está uma solução usando JS para os puristas!
fonte
oninput=_=>i.value=i.value.replace(/./g,"*")
salva um byte.c
pode ser qualquer coisa, você pode economizar mais de dois bytes comoninput=_=>i.value=i.value.replace(/./g,1)
Vim, 36 bytes:
Isso usa a notação de chave vim , assim
<C-v>
como control-v ,<CR>
é enter,<esc>
é a chave de escape e<tab>
é a tecla tab.c é
'0'
.Aqui está um hexdump para provar que a contagem de bytes é precisa:
Isso funciona executando os dois comandos ex a seguir:
O primeiro significa
E o segundo significa
fonte
Rubi com sapatos, 29 caracteres
Saída de amostra:
fonte
Aceto ,
876 bytesExplicação:
Leia um caractere (
,
), negue-o (!
) e saia condicionalmente. Imprima o zero no topo da pilha (p
) e volte ao início.Corra com
-F
para ver o efeito imediatamente (porque liberado)Minha primeira solução foi baseada na postagem da sandbox, com espaços permitidos como caracteres de substituição e sem a necessidade de sair no enter (4 bytes):
fonte
C no POSIX,
12811711396 bytes-11 graças a Quentin pesquisando
termios.h
-4, graças a Quentin apontando meus erros estúpidos
-17 porque Quentin é um bruxo maluco.
Isso coloca o STDIN no modo bruto / invisível para que você possa pressionar as teclas em tempo real. Isso leva 77 bytes e tenho certeza de que posso jogar um pouco. Observe que isso não reinicializa o STDIN ao sair, o que atrapalha o seu terminal se você não o fizer manualmente.
Veja como você pode redefinir o STDIN:
Saída conforme mostrado no GIF :-)
fonte
termios.h
,ECHO
é0000010
eICANON
é0000002
. Isto significa que~(ECHO|ICANON)
é apenas~10
:)!=
pode ser substituído por^
, e'\n'
por10
(assumindo UTF-8);)t
o armazenamento por uma matriz de números inteiros. Entãoc_lcflags
termina emt[3]
, e não precisamos do nome nem do tipo nem do#include
total de 94 bytes:c,t[15];f(){for(tcgetattr(1,t),t[3]&=~10,tcsetattr(1,0,t);(c=getchar())^10&&c^4;)printf(".");}
- Mas talvez seja melhor que eu o publique como resposta, em vez de se divertir com o seu :)código de máquina x86 no MS-DOS - 14 bytes
Como de costume, este é um arquivo COM completo, que pode ser executado no DosBox, além da maioria das variantes do DOS.
Montagem comentada:
fonte
xor
é um woppin' 3 bytes, e seria exatamente tão grande se eu fiz o trabalho em geralax
; Tenteixor ax,0a0dh
/test al,al
, mas é tão grande porque estúpidotest
é de dois bytes, Grrr ...Python 2 , 50 bytes
Funciona apenas no Windows
fonte
AHK , 17 bytes
Built-ins não são interessantes.
fonte
Java 5-8,
125122131124 bytesUngolfed:
Resultado:
Crédito:
-3 @MD XF (Apontou meu erro estúpido com
String[]args
)-7 @KritixiLithos (apontado
public class
pode ser apenasclass
)fonte
String[]args
necessário?String[]a
.1>0
avalia para1
?Java (< 8)
-1>0
avalia paratrue
, que é diferente. Vou postar essa mesma resposta no Groovy.Mathematica 34 bytes
Um único asterisco é exibido após a digitação de cada caractere. As aspas vazias são para o título que aparece na janela de entrada pop-up.
Os
;
impede que a senha a ser impresso.fonte
Vim,
58505250 bytesAdicionado para garantir que ele manipule os espaços corretamente.
Obrigado a @DJMcMayhem por um monte de ajuda e idéias
Na sintaxe típica da chave do Vim abaixo. Os caracteres marcados como com
^
sãoCtrl+<char>
, então^Q
=Ctrl+q
Não há link TIO, porque você precisaria inserir diretamente no Vim (em vez de pré-inserir normalmente). Para executar o código, digite-o no Vim e digite sua senha e pressione enter. Não fará nada com a senha. Nem vai saber o que era. Assim que você pressionar Enter, a janela do Vim será exibida.
:q!
Isso funciona mapeando todos os ASCII imprimíveis para
*
no modo de inserção e mapeando<CR>
para<ESC>:q!<CR>
fonte
<C-v>, <esc> and <C-a>
mas é difícil dizer.FLTK, 47 caracteres
Exemplo de execução:
Saída de amostra:
fonte
Processando, 53 bytes
Isso leva a entrada através de pressionamentos de tecla em uma janela gráfica. O caractere que ele escolhe para representar as senhas é
0
. Observe que, devido à alta taxa de quadros, cada pressionamento de tecla aparecerá como vários0
s (e também devido ao fato de serkeyPressed
e nãokeyTyped
(não um booleano) oukeyrelease
).fonte
Bash , 54 bytes
Para fins de pontuação,
$'\r'
pode ser substituído por um retorno de carro literal.Experimente online! (não há muito o que olhar)
fonte
ZX81 BASIC, 54 bytes
No conjunto de caracteres ZX81, os caracteres imprimíveis estão no intervalo de espaço para
Z
, embora não seja possível inserir um espaço dessa maneira, pois é o caractere de interrupção.ZX Spectrum BASIC, 24 bytes
Observe que
>=
conta como uma palavra-chave de byte único no Sinclair BASIC (neste ponto de código 140, neste caso).fonte
PRINT
a?
, eu sei que funciona em um monte de antigos dialetos do BASICPRINT
é um token de 1 byte, é apenas representado na tela como os 7 caracteres (exceto depoisTHEN
, quando o espaço à esquerda é suprimido).R, 29 bytes
Built-in que lida com entradas de senha. Abre uma nova janela e substitui a entrada por pontos.
invisible
é usado para suprimir a impressão da senha em STDOUT.fonte
Tcl / Tk, 18
Deve ser executado no shell interativo (ou ter abreviações ativadas):
fonte
grid [entry .e -sh *]
e-sh
é uma abreviação de opção para-show
. 23 bytes é o que eu consideraria o mínimo para um programa não- sustentável de manutenção fazendo isso.Vim, 15 pressionamentos de tecla
<S-tab>
meios shift + tab.Aparentemente, existe um componente para isso que eu não estava ciente. Como eu realmente gosto da minha resposta manual e essa abordagem é radicalmente diferente, achei que deveria postar uma nova resposta em vez de editá-la.
Isso funciona chamando a
inputsecret
função e saindo imediatamente depois que ela sai.fonte
Código de máquina 6502 (C64),
2221 bytesUso :
SYS 2062
Lista de desmontagem comentada (ACME), você pode descomentar as três primeiras linhas comentadas para iniciar
RUN
uma vez carregadas:Comentários:
fonte
Quarto (gforth) , 54 bytes
Explicação
fonte
Python 3 +
tkinter
-6361 bytesExibe um
1
para cada caractere e termina ao fechar a janela (o OP disse que é permitido).fonte
from tkinter import*
(nova linha)Entry(show=1).pack();Tk().mainloop()
de trabalho?tkinter
janelas diferentes . Um com o campo de texto, um vazio. Não parece certo para mim.show=
?show=
Groovy,
7773 bytesEste é um fechamento anônimo, com 0 entradas necessárias.
Ungolfed:
Editar 1 (-4 bytes): O componente # visível pode ser acessado diretamente, leia mais aqui .
fonte
Micro , 35 bytes
explicação:
fonte
BF, 24 bytes
Funciona com bf.doleczek.pl . Você pode enviar um caractere zero para o programa com Ctrl + Z.
Solução alternativa:
BF, 1 byte
Esta é uma solução muito explícita. Meu terminal tem 0 caracteres , portanto, não digite senhas maiores que isso.
fonte
\b
é uma coisa. : P\b
é imprimível de qualquer maneira.\b
para substituir a entrada, correto?PowerShell, 12 bytes
Isso lê a entrada do host e, com o sinalizador -a, trata-a como uma proteção / senha. No ISE, aparece uma caixa de mensagem com um comportamento semelhante, pois o ISE não permite a captura de teclas.
fonte
QBasic, 48 bytes
INPUT$(1)
lê o próximo caractere da entrada do teclado. (Isso pode incluir coisas como tab, backspace e escape, mas como o OP não disse nada sobre eles, presumo que não tenhamos que nos preocupar com eles.) Se o personagem for\r
(ASCII 13), encerre o programa; caso contrário, imprima*
sem uma nova linha. Repita ad infinitum.fonte
Perl + Bash, 30 bytes
c
é*
, usaread
do bash, então não é uma solução Perl pura.fonte
brainfuck, 21 bytes
Último, eu prometo. Sem entrada = -1, final da entrada = 0
Como funciona
fonte
,[>-.,]
QBIC , 44 bytes
Explicação
fonte