Przeczytaj hasło

20

Twoim zadaniem jest odczytanie „hasła” z klawiatury / standardowego wejścia.

Wyzwanie :

  • Przeczytaj napis sniewidocznie.
  • Dla każdego ze znaków swydrukuj znak c.
  • W czasie rzeczywistym.

Zasady:

  • Musisz drukować cw czasie rzeczywistym. Jak tylko użytkownik wpisze znak, musisz go wyświetlić c.
  • c musi być stały, tzn. musi mieć ten sam charakter.
  • cmoże być dowolnym widocznym znakiem (tzn. nie może być znakiem nowej linii, spacją, tabulatorem ani drukiem).
  • cnie może być oparty s, tzn. cmusi zostać zdefiniowany / stały przed sodczytaniem.
  • c musi być taki sam przy każdym uruchomieniu programu.
  • cmoże być jedną z postaci sprzypadkowo, o ile wszystkie inne zasady są przestrzegane.
  • Żaden z znaków nie smoże pojawiać się na ekranie, z cwyją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ść snigdy 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 sbył password01i cbył *, wynik wyglądałby mniej więcej tak:

password

Zwycięzca :

Wygrywa najkrótsze zgłoszenie w każdym języku.

MD XF
źródło
Czy Python jest tkinterdozwolony 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ęciu Entryokna (X w systemie Windows i cmd+ Ww systemie Mac)?
Pan Xcoder,
@ Mr.Xcoder Tak, to prawda.
MD XF,
Czy możemy użyć Ctrl + J do przedstawienia dosłownego nowego wiersza w terminalu? Alternatywnie, czy możemy użyć Ctrl + Z zamiast enter?
Conor O'Brien,
@ ConorO'Brien Wyjaśnienie, jak dane wejściowe powinny kończyć się w terminalu.
MD XF,
2
Co powinno się stać, jeśli użytkownik naciśnie backspace?
zdimension

Odpowiedzi:

6

str , 5 bajtów

n=?,1

Z powodu błędu jest to 5 bajtów. Powinien to być tylko 1 bajt:

1

Execution of <code>n=?,1</code>

Conor O'Brien
źródło
Zdecydowanie zobaczyłem cmderodpowiedź nadchodzącą z powodu twojego Ctrl+Zkomentarza: P
MD XF
10/10 odpowiednie narzędzie do pracy
Erik the Outgolfer
20

HTML, 20 bajtów

<input type=password


Alternatywnie: HTML + JavaScript, 51 bajtów

Chociaż OP potwierdziło, że jest to poprawne, oto rozwiązanie wykorzystujące JS dla purystów!

<input id=i oninput=i.value=i.value.replace(/./g,8)

Kudłaty
źródło
4
FGITW, ktoś? : P (zajęło mu dosłownie dziesięć sekund)
MD XF
oninput=_=>i.value=i.value.replace(/./g,"*")zapisuje bajt.
Arjun
Od c może być cokolwiek, możesz zapisać dwa kolejne bajty za pomocąoninput=_=>i.value=i.value.replace(/./g,1)
Arjun
Będę się tym martwił, jeśli (kiedy) ktoś uzna moje rozwiązanie tylko za HTML, @Arjun;) Szybko rzuciłem JS razem, aby umiejscowić kilka osób!
Shaggy
6
Gdzie jest wyjaśnienie, nie rozumiem.
Magic Octopus Urn
11

Vim, 36 bajtów:

:im <C-v><CR> <C-v><esc>ZQ<CR>:au I<tab><tab> * let v:char=0<CR>i

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:

00000000: 3a69 6d20 160a 2016 1b5a 510a 3a61 7520  :im .. ..ZQ.:au 
00000010: 4909 0920 2a20 6c65 7420 763a 6368 6172  I.. * let v:char
00000020: 3d30 0a69                                =0.i

Działa to poprzez uruchomienie następujących dwóch poleceń ex:

:imap <CR> <esc>ZQ
:autocmd InsertCharPre * let v:char=0

Pierwszy oznacza

:imap               " Anytime the following is pressed in insert mode:
      <CR>          "   (the 'enter' key)
           <esc>ZQ  " Then act as if the user instead pressed '<esc>ZQ' (close the buffer)

A drugi oznacza

:autocmd                                " Automatically as vim runs:
         InsertCharPre                  "   Any time the user is about to insert a char
                       *                "   In any type of file
                         let v:char=0   "     Then instead insert a '0' character
DJMcMayhem
źródło
Myślę, że nie ma sposobu, abym mógł przejść do tego przy użyciu mojej obecnej metody, nie ignorując przynajmniej spacji. Ładna odpowiedź!
nmjcman101
o_O To jest miłe ...
Pan Xcoder,
9

Rubin z butami, 29 znaków

Shoes.app{edit_line secret:1}

Przykładowe dane wyjściowe:

password input in Ruby with Shoes

człowiek w pracy
źródło
25
Rubin z butami? Szyny to za mało?
Magic Octopus Urn
6

Aceto , 8 7 6 bajtów

,!`XpO

Wyjaś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):

,'p>
L3viathan
źródło
5

C w POSIX, 128 117 113 96 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.

c,t[15];f(){for(tcgetattr(1,t),t[3]&=~10,tcsetattr(1,0,t);(c=getchar())^10&&c^4;)printf(".");}

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:

void stdin_reset(void)
{
    struct termios t;
    get_stdin(&t);
    t.c_lflag |= ECHO;
    t.c_lflag |= ICANON;
    set_stdin(&t);
}

Dane wyjściowe przedstawione w pliku GIF :-)

MD XF
źródło
1
Kopanie w moje termios.h, ECHOto 0000010i ICANONto 0000002. Oznacza to, że ~(ECHO|ICANON)to po prostu ~10:)
Quentin
@Quentin Edytowane! Pozdrawiam: D
MD XF
1
Ponadto, każdy !=może być zastąpiony ^, i '\n'z 10(zakładając UTF-8);)
Quentin
2
Jeśli przejdziemy do pełnego UB, możemy zastąpić tpamięć tablicą liczb całkowitych. Potem c_lcflagskończy się na t[3]i nie potrzebujemy ani nazwy ani typu, ani #include94 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 :)
Quentin
1
@Quentin Oh ... my. Jesteś czarodziejem. I pomyślałem, że jestem dobry w C ... jeśli chcesz opublikować to jako własną odpowiedź, poczuj się swobodnie, a ja wycofam swoje zmiany, w przeciwnym razie zostawię to edytowane w mojej.
MD XF
4

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.

00000000  b4 08 b2 2a cd 21 80 f4  0a 3c 0d 75 f7 c3        |...*.!...<.u..|
0000000e

Skomentowany montaż:

    org 100h

section .text

start:
    mov ah,8h       ; ah starts at 08h (read console, no echo)
    mov dl,'*'      ; write asterisks (we could have left whatever
                    ; startup value we have here, but given that dx=cs,
                    ; we have no guarantee to get a non-zero non-space
                    ; value)
lop:
    ; this loop runs twice per character read: the first time with
    ; ah = 08h (read console, no echo syscall), the second time with
    ; ah = 02h (write console); a xor is used to switch from one
    ; mode to the other
    int 21h         ; perform syscall
    xor ah,0ah      ; switch syscall 08h <=> 02h
    cmp al,0dh      ; check if we read a newline (if we wrote stuff
                    ; we are just checking the last value read, so
                    ; no harm done; at the first iteration al starts
                    ; at 0, so no risk here)
    jne lop         ; loop if it wasn't a newline
quit:
    ret             ; quit
Matteo Italia
źródło
2
...nie ma mowy. To wspaniale.
MD XF
Dzięki, ale czuję, że jest jeszcze coś do przycięcia; to xorsą 3 bajty woppina i byłyby dokładnie tak duże, gdybym sprawił, że działałby ogólnie ax; Próbowałem xor ax,0a0dh/ test al,al, ale jest tak samo duży, ponieważ głupie testsą dwa bajty, grrr ...
Matteo Italia
3

Python 2 , 50 bajtów

from msvcrt import*
while'\r'!=getch():print'\b*',

Działa tylko w systemie Windows

Pręt
źródło
1
Niestety działa to tylko w systemie Windows: ((
Xcoder,
3

AHK , 17 bajtów

InputBox,o,,,HIDE

Wbudowane nie są interesujące.

Inżynier Toast
źródło
3

Java 5-8, 125 122 131 124 bajtów

class X{public static void main(String[]a){new java.awt.Frame(){{add(new javax.swing.JPasswordField());setVisible(1>0);}};}}

Nie golfowany:

class X{
    public static void main(String[]a){
        new java.awt.Frame(){
            {
                add(new javax.swing.JPasswordField());
                setVisible(1>0);
            }
        };
    }
}

Wynik:

enter image description here

Kredyt:

-3 @MD XF (Wskazał mój głupi błąd z String[]args)

-7 @KritixiLithos (wskazano, że public classmożna po prostu być class)

Urna Magicznej Ośmiornicy
źródło
1
Czy to String[]argskonieczne?
MD XF
@MDXF, jeśli chcę udzielić odpowiedzi na Javę 8, jest mnóstwo rzeczy, które mogę zrobić. Robię to jednak ogólną odpowiedzią Java. Jednak tak, mogę to zrobić String[]a.
Magic Octopus Urn
Zapomniałeś zaktualizować odpowiedź golfa. Nie 1>0ocenia też 1?
MD XF
@MDXF in Java (< 8)- 1>0ocenia na true, co jest inne. Opublikuję tę samą odpowiedź w Groovy.
Magic Octopus Urn
@StephenS jest to ogólna odpowiedź w języku Java, a nie odpowiedź w języku Java 8.
Magic Octopus Urn
3

Matematyka 34 bajty

 InputString["",FieldMasked->True];

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.

enter image description here

DavidC
źródło
Celowa przestrzeń wiodąca?
MD XF
2

Vim, 58 50 52 50 bajtów

Dodano, aby upewnić się, że poprawnie obsługuje spacje.

Dzięki @DJMcMayhem za garść pomocy i pomysłów

i:im 32 *Y94pVGg
kWcW<Space>
:im 
 ZQ
dG@"qi

W typowej składni klawiszy Vima poniżej. Znaki oznaczone jak ^Ctrl+<char>, więc ^Q=Ctrl+q

i:im ^V^V32 *^[Y94pVGg^A
kWcW<Space>^[
:im ^V
 ZQ
dG@"qi

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>

nmjcman101
źródło
Może wyjaśnij, jakie są symbole? Myślę, że powinny, <C-v>, <esc> and <C-a>ale trudno powiedzieć.
DJMcMayhem
@DJMcMayhem zrobi. Nawiasem mówiąc, myślę, że możesz wkleić je do Vima i odpowiednio się pojawią.
nmjcman101
2

FLTK, 47 znaków

Function{}{}{Fl_Window{}{}{Fl_Input{}{type 5}}}

Przykładowy przebieg:

bash-4.4$ fluid -c password.fl

bash-4.4$ fltk-config --compile password.cxx 
g++ -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/freetype2 -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng16 -g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -fvisibility-inlines-hidden -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_THREAD_SAFE -D_REENTRANT -o 'password' 'password.cxx' -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -lfltk -lX11

bash-4.4$ ./password 

Przykładowe dane wyjściowe:

password input in FLTK

człowiek w pracy
źródło
2

Przetwarzanie, 53 bajty

String a="";void draw(){text(keyPressed?a+=0:a,9,9);}

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ść 0s (a także ze względu na fakt, że jest to keyPressedi nie jest keyTyped(boolean) lub keyrelease).

gif

Kritixi Lithos
źródło
2

Bash , 54 bajty

while read -eN1 c 2>&-;[[ ${c/$'\r'/} ]];do printf X;done

Dla celów punktacji $'\r'można zastąpić dosłownym znakiem powrotu karetki.

Wypróbuj online! (niewiele na co patrzeć)

Dennis
źródło
2

ZX81 BASIC, 54 bajty

10 IF LEN INKEY$ THEN GOTO PI
30 IF NOT LEN INKEY$ THEN GOTO EXP PI
50 IF INKEY$>"Z" THEN STOP
70 PRINT "*";
90 GOTO PI

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

10 PAUSE NOT PI: IF INKEY$>=" " THEN PRINT "*";:GOTO PI

Zauważ, że >=liczy się jako jedno bajtowe słowo kluczowe w Sinclair BASIC (w tym przypadku kod 140).

Neil
źródło
Czy odstępy między numerami linii i funkcjami są konieczne?
MD XF,
Mógłby skrócić PRINTsię ?, wiem, że działa w wielu starych dialektach BASIC
MD XF
@ MDXF PRINTjest 1-bajtowym tokenem, jest on po prostu reprezentowany na ekranie jako 7 znaków (z wyjątkiem po THEN, gdy spacja wiodąca jest pomijana).
Neil
2

R, 29 bajtów

invisible(openssl::askpass())

Wbudowany, który obsługuje hasła. Otwiera nowe okno i zastępuje dane wejściowe kropkami. invisiblesłuży do pomijania drukowania hasła do STDOUT.

JAD
źródło
2

Tcl / Tk, 18

gri [ent .e -sh *]

Musi być uruchomiony w interaktywnej powłoce (lub mieć włączone skróty):

enter image description here

sergiol
źródło
21 bajtów bez trudnych skrótów poleceń: grid [entry .e -sh *]i -shjest skrótem opcji dla -show. 23 bajty to to, co uważam za minimum dla możliwego do utrzymania programu bez gry w golfa .
Donal Fellows,
2

Vim, 15 naciśnięć klawiszy

:cal inp<S-tab>'')|q<cr>

<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 inputsecretfunkcji, a następnie natychmiastowe wyjście po jej wyjściu.

DJMcMayhem
źródło
2

Kod maszynowy 6502 (C64), 22 21 bajtów

0e 08 20 9f ff 20 e4 ff f0 f8 c9 0d f0 01 a9 60 20 d2 ff 50 ed

Zastosowanie :SYS 2062

Komentowana lista dezasemblacji (ACME), możesz odkomentować pierwsze trzy skomentowane linie do uruchomienia RUNpo załadowaniu:

!cpu 6502
!to "password2.prg",cbm
;* = $0801                               ; BASIC starts at #2049
;!byte $0d,$08,$dc,$07,$9e,$20,$32,$30   ; BASIC to load $c000
;!byte $36,$32,$00,$00,$00               ; inserts BASIC line: 2012 SYS 2062

    GETIN  =  $FFE4
    SCNKEY =  $FF9F
    CHROUT =  $FFD2

* = $080e
keyScan:
    jsr SCNKEY  ; get key
    jsr GETIN   ; put key in A

    beq keyScan ; if no key pressed loop    

    cmp #13     ; check if RETURN was pressed
    beq $081b   ; if true go to operand of next instruction (#$60 = rts)

    lda #$60    ; load char $60 into accumulator
    jsr CHROUT  ; print it

    bvc keyScan ; loop

Komentarze:

  • Nie znalazłem niczego w dokumentacji, ale wygląda na to, że po wywołaniu GETIN, gałęzie beq pojawiają się tylko tam, gdzie nie zarejestrowano żadnych nowych naciśnięć klawiszy;
  • Używając # $ 60 jako wyjściowego znaku, bajt ten może być ponownie użyty jako instrukcja „rts” po naciśnięciu RETURN.
Matteo Beniamino
źródło
2

Dalej (gforth) , 54 bajty

: f begin key dup 4 - swap 13 - * while ." *" repeat ;

Wyjaśnienie

begin      \ enters the loop
    key    \ waits for a single character as input, places ascii code of character on stack
    dup    \ duplicates the key value on the stack
    4 -    \ subtracts 4 from the key value (shorter way of checking for not equals)
    swap   \ swaps the top two stack values
    13 -   \ subtract 13 from the key value
    *      \ multiply top two stack values (shorter version of "and")
while      \ if top of stack is true, enter loop body, else exit loop
    ." *"  \ output *
repeat     \ go back to beginning of loop
reffu
źródło
1

Python 3 + tkinter- 63 61 bajtów

from tkinter import*
t=Tk();Entry(show=1).pack();t.mainloop()

Wyświetla a 1dla każdego znaku, kończy się po zamknięciu okna (OP powiedział, że jest dozwolone).

Gif

Pan Xcoder
źródło
Czy from tkinter import*(nowa linia) będzie Entry(show=1).pack();Tk().mainloop()działać?
Conor O'Brien,
@ Testy ConorO'Brien
Mr. Xcoder,
@ ConorO'Brien no. Tworzy dwa różne tkinterokna. Jeden z polem tekstowym, drugi pusty. Nie wydaje mi się to właściwe.
Pan Xcoder,
Potrzebujesz show=?
Esolanging Fruit
@ Challenger5 Tak, potrzebujemyshow=
Pana Xcodera
1

Groovy, 77 73 bajtów

{new java.awt.Frame(){{add(new javax.swing.JPasswordField());visible=1}}}

To anonimowe zamknięcie, z 0 wymaganymi danymi wejściowymi.

Nie golfowany:

{
    new java.awt.Frame() {
        {
            add(new javax.swing.JPasswordField())
            visible=1
        }
    }
}

Edycja 1 (-4 bajtów): można uzyskać bezpośredni dostęp do komponentu #, czytaj więcej tutaj .

Urna Magicznej Ośmiornicy
źródło
1

Mikro , 35 bajtów

"":i{L46c:\
i~+:i
i10c=if(,a)}a
i:\

wyjaśnienie:

„”: tworzę nowy pusty ciąg „i”
    {rozpocznij pętlę wejściową
     L wprowadź znak
      46c: \ display ascii char # 46 (.) (Jest wyskakujący, pozostawiając znak wejściowy z „L”
           i~+:i               push i, flip i and the char around, concatinate them, and store that to i
                i10c=if(,a)}a  OK, a lot happens here, if a NL is in i, the loop terminates, and the final i:\ will display the input

raddish0
źródło
1
That's a pretty good first attempt at a language! +1
MD XF
1

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.

Esolanging Fruit
źródło
Whoa... not bad!
MD XF
@MDXF Are you referring to the 24 byte one or the 1 byte one?
Esolanging Fruit
Clearly the 24-byte one. I completely forgot that printing \b is a thing. :P
MD XF
@MDXF What do you mean by that? \b is unprintable anyways.
Esolanging Fruit
No I mean your solution uses \b to override the input, correct?
MD XF
1

PowerShell, 12 bytes

Read-Host -a

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.

PS C:\Windows\system32> Read-Host -a
************
Chirishman
źródło
1

QBasic, 48 bytes

DO
a$=INPUT$(1)
IF ASC(a$)=13THEN END
?"*";
LOOP

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.

DLosc
źródło
1

Perl + Bash, 30 bytes

print"*"while$|=1+`read -sn 1`

c is *, uses read from bash, so isn't a pure Perl solution.

Dom Hastings
źródło
1

brainfuck, 21 bytes

-[+>,[<->+[<.>[-]]]<]

Last one, I promise. No input = -1, end of input = 0

How it Works

-[  Enters the loop
  +>, Get input
     [<->+ If not end of input it create the ÿ character and check if the input is not -1
          [<.>[-]]] If there was input, print the ÿ character. 
                    <] Exit the loop if end of input
Jo King
źródło
Your code is missing a closing bracket. And why do you make it that complicated? A simple "print a 'ÿ' for every input character" could be accomplished with a simple ,[>-.,]
Dorian
@Dorian The bracket was a mistake, but the complexity arises from having to handle both no input and end of input
Jo King
0

QBIC, 44 bytes

{X=inkey$~X<>@`|~X=chr$(13)|_X\Y=Y+@*`_C?Y

Explanation

{            DO
X=inkey$     Read a char, set it to X$
             Note that INKEY$ doesn't wait for keypress, but simply sends out "" if no key was pressed.
~X<>@`|      IF X$ has a value THEN
~X=chr$(13)| IF that value is ENTER
_X           THEN END
\            ELSE
Y=Y+@*`      append a literal * to Y$
_C           Clear the screen
?Y           Display Y$ (having 1 * for each char entered)
             The IF's and the DO-loop are auto-closed at EOF{            DO
steenbergh
źródło