Twoim zadaniem jest odczytanie „hasła” z klawiatury / standardowego wejścia.
Wyzwanie :
- Przeczytaj napis
s
niewidocznie. - Dla każdego ze znaków
s
wydrukuj znakc
. - W czasie rzeczywistym.
Zasady:
- Musisz drukować
c
w czasie rzeczywistym. Jak tylko użytkownik wpisze znak, musisz go wyświetlićc
. c
musi być stały, tzn. musi mieć ten sam charakter.c
może być dowolnym widocznym znakiem (tzn. nie może być znakiem nowej linii, spacją, tabulatorem ani drukiem).c
nie może być opartys
, tzn.c
musi zostać zdefiniowany / stały przeds
odczytaniem.c
musi być taki sam przy każdym uruchomieniu programu.c
może być jedną z postacis
przypadkowo, o ile wszystkie inne zasady są przestrzegane.- Żaden z znaków nie
s
może pojawiać się na ekranie, zc
wyjątkiem (patrz poprzednia reguła). - Możesz używać dowolnych rozsądnych metod wprowadzania i wyprowadzania, o ile wszystkie inne reguły są przestrzegane.
- Możesz założyć, że długość
s
nigdy nie jest większa niż szerokość terminala / okna graficznego. - Jeśli używasz terminala, twój program powinien zakończyć się po wprowadzeniu nowej linii lub EOF.
Przykład :
Gdyby s
był password01
i c
był *
, wynik wyglądałby mniej więcej tak:
Zwycięzca :
Wygrywa najkrótsze zgłoszenie w każdym języku.
tkinter
dozwolony dla naszego niestandardowego pola wejściowego (takiego jak w HTML), tak że program nie kończy się po naciśnięciu klawisza Enter, ale po zamknięciuEntry
okna (X w systemie Windows icmd
+W
w systemie Mac)?Odpowiedzi:
str , 5 bajtów
Z powodu błędu jest to 5 bajtów. Powinien to być tylko 1 bajt:
źródło
cmder
odpowiedź nadchodzącą z powodu twojegoCtrl+Z
komentarza: PHTML, 20 bajtów
Alternatywnie: HTML + JavaScript, 51 bajtów
Chociaż OP potwierdziło, że jest to poprawne, oto rozwiązanie wykorzystujące JS dla purystów!
źródło
oninput=_=>i.value=i.value.replace(/./g,"*")
zapisuje bajt.c
może być cokolwiek, możesz zapisać dwa kolejne bajty za pomocąoninput=_=>i.value=i.value.replace(/./g,1)
Vim, 36 bajtów:
Wykorzystuje vim-klucz notacji , więc
<C-v>
jest kontrola-v ,<CR>
to wprowadzić,<esc>
jest kluczem ucieczki, a<tab>
to klucz tab.c jest
'0'
.Oto zrzut heksowy, aby udowodnić, że liczba bajtów jest dokładna:
Działa to poprzez uruchomienie następujących dwóch poleceń ex:
Pierwszy oznacza
A drugi oznacza
źródło
Rubin z butami, 29 znaków
Przykładowe dane wyjściowe:
źródło
Aceto ,
876 bajtówWyjaśnienie:
Przeczytaj znak (
,
), zaneguj go (!
) i warunkowo wyjdź. Wydrukuj zero na górze stosu (p
) i wróć do początku.Biegnij z
-F
aby natychmiast zobaczyć efekt (ponieważ zaczerwienienie)Moje pierwsze rozwiązanie oparte było na poście z piaskownicą, ze spacjami dozwolonymi jako znaki zastępcze i bez potrzeby wychodzenia z enter (4 bajty):
źródło
C w POSIX,
12811711396 bajtów-11 dzięki Quentinowi przeszukując
termios.h
-4 dzięki Quentin wskazując moje głupie błędy
-17, ponieważ Quentin jest cholernym czarodziejem.
Powoduje to przejście STDIN w tryb surowy / niewidoczny, dzięki czemu można uzyskiwać naciśnięcia klawiszy w czasie rzeczywistym. Zajmuje to 77 bajtów i jestem pewien, że mogę trochę zagrać w golfa.Zauważ, że to nie resetuje STDIN po wyjściu, więc zepsuje twój terminal, jeśli nie zrobisz tego ręcznie.
Oto jak możesz zresetować STDIN:
Dane wyjściowe przedstawione w pliku GIF :-)
źródło
termios.h
,ECHO
to0000010
iICANON
to0000002
. Oznacza to, że~(ECHO|ICANON)
to po prostu~10
:)!=
może być zastąpiony^
, i'\n'
z10
(zakładając UTF-8);)t
pamięć tablicą liczb całkowitych. Potemc_lcflags
kończy się nat[3]
i nie potrzebujemy ani nazwy ani typu, ani#include
94 bajtów:c,t[15];f(){for(tcgetattr(1,t),t[3]&=~10,tcsetattr(1,0,t);(c=getchar())^10&&c^4;)printf(".");}
- Ale może lepiej, żebym wysłał to jako odpowiedź niż bawił się z twoimi :)Kod maszynowy x86 na MS-DOS - 14 bajtów
Jak zwykle jest to pełny plik COM, który można uruchomić na DosBox, a także na większości wariantów DOS.
Skomentowany montaż:
źródło
xor
są 3 bajty woppina i byłyby dokładnie tak duże, gdybym sprawił, że działałby ogólnieax
; Próbowałemxor ax,0a0dh
/test al,al
, ale jest tak samo duży, ponieważ głupietest
są dwa bajty, grrr ...Python 2 , 50 bajtów
Działa tylko w systemie Windows
źródło
AHK , 17 bajtów
Wbudowane nie są interesujące.
źródło
Java 5-8,
125122131124 bajtówNie golfowany:
Wynik:
Kredyt:
-3 @MD XF (Wskazał mój głupi błąd z
String[]args
)-7 @KritixiLithos (wskazano, że
public class
można po prostu byćclass
)źródło
String[]args
konieczne?String[]a
.1>0
ocenia też1
?Java (< 8)
-1>0
ocenia natrue
, co jest inne. Opublikuję tę samą odpowiedź w Groovy.Matematyka 34 bajty
Po wpisaniu każdego znaku pojawia się pojedyncza gwiazdka. Puste znaki cudzysłowu dotyczą tytułu wyświetlanego w wyskakującym oknie wprowadzania.
W
;
zapobiega hasło z drukowanego.źródło
Vim,
58505250 bajtówDodano, aby upewnić się, że poprawnie obsługuje spacje.
Dzięki @DJMcMayhem za garść pomocy i pomysłów
W typowej składni klawiszy Vima poniżej. Znaki oznaczone jak
^
sąCtrl+<char>
, więc^Q
=Ctrl+q
Nie ma linku do TIO, ponieważ trzeba by bezpośrednio wprowadzić dane do Vima (w przeciwieństwie do wstępnego wprowadzania danych jak zwykle). Aby uruchomić kod, musisz wpisać go w Vimie, a następnie możesz wpisać hasło i nacisnąć Enter. Nie zrobi nic z hasłem. Nawet nie będzie wiedział, co to było. Jak tylko klikniesz, wejdzie w okno Vima
:q!
Działa to poprzez mapowanie wszystkich drukowalnych ASCII
*
w trybie wstawiania i mapowanie<CR>
na<ESC>:q!<CR>
źródło
<C-v>, <esc> and <C-a>
ale trudno powiedzieć.FLTK, 47 znaków
Przykładowy przebieg:
Przykładowe dane wyjściowe:
źródło
Przetwarzanie, 53 bajty
To pobiera dane za pomocą naciśnięć klawiszy z okna graficznego. Znak, którym wybiera reprezentować hasła, to
0
. Zauważ, że ze względu na wysoką szybkość klatek, każde naciśnięcie klawisza pojawi się jako wielokrotność0
s (a także ze względu na fakt, że jest tokeyPressed
i nie jestkeyTyped
(boolean) lubkeyrelease
).źródło
Bash , 54 bajty
Dla celów punktacji
$'\r'
można zastąpić dosłownym znakiem powrotu karetki.Wypróbuj online! (niewiele na co patrzeć)
źródło
ZX81 BASIC, 54 bajty
W zestawie znaków ZX81 znaki do wydrukowania znajdują się w obszarze spacji do
Z
, chociaż tak naprawdę nie można wprowadzić spacji w ten sposób, ponieważ jest to znak podziału.ZX Spectrum BASIC, 24 bajty
Zauważ, że
>=
liczy się jako jedno bajtowe słowo kluczowe w Sinclair BASIC (w tym przypadku kod 140).źródło
PRINT
się?
, wiem, że działa w wielu starych dialektach BASICPRINT
jest 1-bajtowym tokenem, jest on po prostu reprezentowany na ekranie jako 7 znaków (z wyjątkiem poTHEN
, gdy spacja wiodąca jest pomijana).R, 29 bajtów
Wbudowany, który obsługuje hasła. Otwiera nowe okno i zastępuje dane wejściowe kropkami.
invisible
służy do pomijania drukowania hasła do STDOUT.źródło
Tcl / Tk, 18
Musi być uruchomiony w interaktywnej powłoce (lub mieć włączone skróty):
źródło
grid [entry .e -sh *]
i-sh
jest skrótem opcji dla-show
. 23 bajty to to, co uważam za minimum dla możliwego do utrzymania programu bez gry w golfa .Vim, 15 naciśnięć klawiszy
<S-tab>
środki shift + tab.Najwyraźniej jest do tego wbudowane narzędzie, którego nie byłem świadomy. Ponieważ naprawdę podoba mi się moja ręczna odpowiedź , a to podejście jest zupełnie inne, pomyślałem, że powinienem opublikować nową odpowiedź zamiast edycji.
Działa to poprzez wywołanie
inputsecret
funkcji, a następnie natychmiastowe wyjście po jej wyjściu.źródło
Kod maszynowy 6502 (C64),
2221 bajtówZastosowanie :
SYS 2062
Komentowana lista dezasemblacji (ACME), możesz odkomentować pierwsze trzy skomentowane linie do uruchomienia
RUN
po załadowaniu:Komentarze:
źródło
Dalej (gforth) , 54 bajty
Wyjaśnienie
źródło
Python 3 +
tkinter
-6361 bajtówWyświetla a
1
dla każdego znaku, kończy się po zamknięciu okna (OP powiedział, że jest dozwolone).źródło
from tkinter import*
(nowa linia) będzieEntry(show=1).pack();Tk().mainloop()
działać?tkinter
okna. Jeden z polem tekstowym, drugi pusty. Nie wydaje mi się to właściwe.show=
?show=
Groovy,
7773 bajtówTo anonimowe zamknięcie, z 0 wymaganymi danymi wejściowymi.
Nie golfowany:
Edycja 1 (-4 bajtów): można uzyskać bezpośredni dostęp do komponentu #, czytaj więcej tutaj .
źródło
Mikro , 35 bajtów
wyjaśnienie:
źródło
BF, 24 bytes
Works with bf.doleczek.pl. You can send a zero char to the program with Ctrl+Z.
Alternative solution:
BF, 1 byte
This is a very tongue-in-cheek solution. My terminal is 0 characters wide, so please don't enter any passwords longer than that.
źródło
\b
is a thing. :P\b
is unprintable anyways.\b
to override the input, correct?PowerShell, 12 bytes
This reads input from host and, with the -a flag treats it as a securestring/password. In the ISE it pops up a message box which has a similar behavior since the ISE doesn't allow keypress capture.
źródło
QBasic, 48 bytes
INPUT$(1)
reads the next character from keyboard input. (This can include things like tab, backspace, and escape, but since the OP didn't say anything about those I'll assume we don't have to worry about them.) If the character is\r
(ASCII 13), terminate the program; otherwise, print*
without a newline. Repeat ad infinitum.źródło
Perl + Bash, 30 bytes
c
is*
, usesread
from bash, so isn't a pure Perl solution.źródło
brainfuck, 21 bytes
Last one, I promise. No input = -1, end of input = 0
How it Works
źródło
,[>-.,]
QBIC, 44 bytes
Explanation
źródło