Baca kata sandi


20

Tantangan Anda adalah membaca "kata sandi" dari keyboard / input standar.

Tantangan :

  • Baca string tanpa sterlihat.
  • Untuk setiap karakter yang masuk s, cetak satu karakter c.
  • Dalam waktu nyata.

Aturan:

  • Anda harus mencetak cdalam waktu nyata. Segera setelah pengguna memasukkan karakter yang harus Anda tampilkan c.
  • c harus konstan, yaitu harus karakter yang sama.
  • cdapat berupa karakter apa pun yang terlihat (yaitu tidak boleh berupa baris, spasi, tab, atau yang tidak dicetak baru).
  • ctidak dapat didasarkan pada s, yaitu charus didefinisikan / konstan sebelum sdibaca.
  • c harus sama setiap kali program dijalankan.
  • cdapat menjadi salah satu karakter di sjika tidak sengaja, selama semua aturan lain diikuti.
  • Tak satu pun dari karakter sdapat muncul di layar, ckecuali (lihat aturan sebelumnya).
  • Anda dapat menggunakan metode input dan output yang masuk akal selama semua aturan lain diikuti.
  • Anda dapat mengasumsikan bahwa panjangnya stidak pernah lebih panjang dari lebar jendela terminal / grafik.
  • Jika menggunakan terminal, program Anda harus berakhir setelah baris baru atau EOF dimasukkan.

Contoh :

Jika situ password01dan citu *, output akan terlihat seperti:

kata sandi

Pemenang :

Pengajuan terpendek di setiap bahasa akan menang.


Apakah python tkinterdiizinkan untuk bidang input khusus kami (seperti yang ada di HTML), sedemikian rupa sehingga program tidak berhenti ketika masuk ditekan, tetapi ketika Anda menutup EntryJendela (X pada Windows dan cmd+ Wpada mac)?
Tn. Xcoder

@ Mr.Xcoder Ya, itu benar.
MD XF

Bisakah kita menggunakan Ctrl + J untuk mewakili baris baru literal di terminal? Atau, bisakah kita menggunakan Ctrl + Z alih-alih masuk?
Conor O'Brien

@ ConorO'Brien Mengklarifikasi bagaimana input harus diakhiri di terminal.
MD XF

2
Apa yang harus terjadi jika pengguna menekan backspace?
zdimension

Jawaban:



20

HTML, 20 byte

<input type=password


Alternatif: HTML + JavaScript, 51 byte

Meskipun OP telah mengkonfirmasi bahwa itu valid, berikut adalah solusi menggunakan JS untuk para puritan!

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


4
FGITW, ada orang? : P (membawanya secara harfiah sepuluh detik)
MD XF

oninput=_=>i.value=i.value.replace(/./g,"*")menghemat satu byte.
Arjun

Karena cbisa apa saja, Anda dapat menyimpan dua byte lagi denganoninput=_=>i.value=i.value.replace(/./g,1)
Arjun

Saya khawatir jika (ketika) seseorang menyatakan solusi HTML-only saya tidak valid, @Arjun;) Saya hanya melempar JS satu dengan cepat untuk menenangkan beberapa orang!
Shaggy

6
Di mana penjelasannya, saya tidak mengerti.
Magic Gurita Guci

11

Vim, 36 byte:

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

Ini menggunakan notasi vim-key , begitu <C-v>juga control-v , <CR>is enter, <esc>adalah escape key, dan <tab>merupakan kunci tab.

c adalah '0'.

Berikut ini adalah hexdump untuk membuktikan jumlah byte akurat:

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

Ini bekerja dengan menjalankan dua perintah ex berikut:

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

Yang pertama berarti

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

Dan yang kedua berarti

: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

Saya pikir tidak ada cara bagi saya untuk turun ke ini menggunakan metode saya saat ini tanpa mengabaikan ruang setidaknya. Jawaban yang bagus!
nmjcman101

o_O Itu rapi ...
Mr. Xcoder


6

Aceto , 8 7 6 byte

,!`XpO

Penjelasan:

Baca karakter ( ,), negasikan ( !) dan keluar dengan syarat. Cetak nol di atas tumpukan ( p) dan kembali ke awal.

Jalankan dengan -Funtuk melihat efeknya segera (karena pembilasan)

Solusi pertama saya didasarkan pada posting sandbox, dengan spasi diizinkan sebagai karakter pengganti dan tidak perlu keluar saat masuk (4 byte):

,'p>

5

C pada POSIX, 128 117 113 96 byte

-11 Terima kasih kepada Quentin yang mencari melalui termios.h
-4 terima kasih kepada Quentin menunjukkan kesalahan bodohku
-17 karena Quentin adalah penyihir yang aneh.

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

Ini menempatkan STDIN ke mode mentah / tidak terlihat sehingga dapat menekan tombol secara realtime. Ini membutuhkan 77 byte dan saya yakin saya bisa golf sedikit. Perhatikan bahwa ini tidak mengatur ulang STDIN saat keluar sehingga akan mengacaukan terminal Anda jika Anda tidak melakukannya secara manual.

Berikut ini cara mengatur ulang STDIN:

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

Output seperti yang ditunjukkan dalam GIF :-)


1
Menggali milikku termios.h, ECHOadalah 0000010dan ICANONsekarang 0000002. Ini berarti itu ~(ECHO|ICANON)hanya ~10:)
Quentin

@Quentin Diedit! Ceria: D
MD XF

1
Juga, masing !=- masing dapat diganti dengan ^, dan '\n'dengan 10( dengan asumsi UTF-8);)
Quentin

2
Jika kita menggunakan UB penuh, kita dapat mengganti tpenyimpanan dengan array bilangan bulat. Kemudian c_lcflagsberakhir pada t[3], dan kita tidak membutuhkan nama atau jenis atau #include, total 94 byte: c,t[15];f(){for(tcgetattr(1,t),t[3]&=~10,tcsetattr(1,0,t);(c=getchar())^10&&c^4;)printf(".");}- Tapi mungkin Anda sebaiknya saya mempostingnya sebagai jawaban daripada bersenang-senang dengan Anda :)
Quentin

1
@ Quentin Oh ... ya ampun. Kamu seorang penyihir. Dan saya pikir saya pandai C ... jika Anda ingin mempostingnya karena jawaban Anda sendiri bebas dan saya akan mengembalikan suntingan saya, kalau tidak saya akan membiarkannya diedit menjadi milik saya.
MD XF

4

kode mesin x86 pada MS-DOS - 14 byte

Seperti biasa, ini adalah file COM lengkap, yang dapat dijalankan di DosBox, plus sebagian besar varian DOS.

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

Majelis yang dikomentari:

    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

2
...tidak mungkin. Itu luar biasa.
MD XF

Terima kasih, tetapi saya merasa masih ada hal lain yang harus dipangkas; itu xoradalah 3 byte woppin, dan akan sama besar jika saya membuatnya bekerja secara keseluruhan ax; Saya mencoba xor ax,0a0dh/ test al,al, tetapi sama besarnya karena bodoh testadalah dua byte, grrr ...
Matteo Italia

3

Python 2 , 50 byte

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

Hanya berfungsi di windows


1
Sayangnya itu hanya bekerja pada Windows: ((
Tn. Xcoder


3

Java 5-8, 125 122 131 124 byte

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

Tidak Terkumpul:

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

Hasil:

masukkan deskripsi gambar di sini

Kredit:

-3 @MD XF (Menunjukkan kesalahan bodoh saya dengan String[]args)

-7 @KritixiLithos (Ditunjukkan public classbisa saja class)


1
Apakah itu String[]argsperlu?
MD XF

@ MDXF jika saya ingin membuat jawaban untuk Java 8 ada banyak hal yang bisa saya lakukan. Namun, saya membuat ini jawaban Java generik. Namun, ya saya bisa membuatnya String[]a.
Magic Octopus Urn

Anda lupa memperbarui jawaban golf. Juga, tidakkah 1>0dievaluasi 1?
MD XF

@ MDXF di Java (< 8)- 1>0mengevaluasi ke true, yang berbeda. Saya akan memposting jawaban yang sama di Groovy.
Magic Gurita Guci

@StephenS ini adalah jawaban Java umum, bukan jawaban Java 8.
Magic Gurita Guci

3

Mathematica 34 byte

 InputString["",FieldMasked->True];

Tanda bintang tunggal muncul, setelah setiap karakter dimasukkan. Tanda kutip kosong adalah untuk judul yang muncul di jendela input pop-up.

The ;mencegah password dari yang dicetak.

masukkan deskripsi gambar di sini


Ruang terdepan yang disengaja?
MD XF

2

Vim, 58 50 52 50 byte

Ditambahkan untuk memastikan itu menangani ruang dengan benar.

Terima kasih kepada @DJMcMayhem untuk banyak bantuan dan ide

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

Dalam sintaks kunci tombol Vim di bawah ini. Karakter ditandai seperti dengan ^yang Ctrl+<char>, begitu ^Q=Ctrl+q

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

Tidak ada tautan TIO, karena Anda harus langsung memasukkan ke Vim (sebagai ganti dari pra-input seperti biasa). Untuk menjalankan kode Anda perlu mengetikkannya ke Vim, dan kemudian Anda bisa mengetikkan kata sandi Anda dan tekan enter. Tidak akan melakukan apa pun dengan kata sandi. Bahkan tidak akan tahu apa itu. Segera setelah Anda menekan enter, jendela Vim akan:q!

Ini bekerja dengan memetakan semua ASCII yang dapat dicetak ke *dalam mode penyisipan, dan pemetaan <CR>ke<ESC>:q!<CR>


Mungkin memperjelas apa simbolnya? Saya pikir mereka seharusnya <C-v>, <esc> and <C-a>tetapi sulit untuk mengatakannya.
DJMcMayhem

@DJMcMayhem Akan lakukan. Kebetulan saya berpikir bahwa Anda dapat menempelkannya ke Vim dan mereka akan muncul dengan tepat.
nmjcman101


2

FLTK, 47 karakter

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

Contoh dijalankan:

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 

Output sampel:

input kata sandi dalam FLTK


2

Memproses, 53 byte

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

Ini mengambil input melalui penekanan tombol dari jendela grafis. Karakter yang dipilihnya untuk mewakili kata sandi adalah 0. Perhatikan bahwa karena framerate tinggi, setiap penekanan tombol akan muncul sebagai multiple 0s (dan juga karena fakta bahwa ini adalah keyPresseddan bukan keyTyped(bukan boolean) atau keyrelease).

gif


2

Bash , 54 byte

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

Untuk tujuan penilaian, $'\r'dapat diganti dengan carriage return literal.

Cobalah online! (tidak banyak yang bisa dilihat)


2

ZX81 BASIC, 54 byte

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

Dalam set karakter ZX81 karakter yang dapat dicetak berada dalam ruang jangkauan Z, meskipun Anda tidak dapat memasukkan spasi dengan cara ini karena karakter break.

ZX Spectrum BASIC, 24 byte

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

Perhatikan bahwa >=dihitung sebagai kata kunci byte tunggal dalam Sinclair BASIC (codepoint 140 dalam hal ini).


Apakah ruang antara nomor baris dan fungsi diperlukan?
MD XF

Bisakah Anda mempersingkat PRINTuntuk ?, saya tahu bahwa karya dalam banyak dialek BASIC tua
MD XF

@MDXF PRINTadalah token 1-byte, hanya diwakili di layar sebagai 7 karakter (kecuali setelah THEN, ketika ruang terdepan ditekan).
Neil

2

R, 29 byte

invisible(openssl::askpass())

Built-in yang menangani entri kata sandi. Buka jendela baru dan ganti input dengan titik. invisibledigunakan untuk menekan pencetakan kata sandi ke STDOUT.


2

Tcl / Tk, 18

gri [ent .e -sh *]

Harus dijalankan di dalam shell interaktif (atau singkatan diaktifkan):

masukkan deskripsi gambar di sini


21 byte tanpa singkatan perintah rumit: grid [entry .e -sh *]dan -shmerupakan singkatan opsi untuk -show. 23 byte adalah apa yang saya anggap minimum untuk program ungolfed terpelihara melakukan ini.
Donal Fellows

2

Vim, 15 penekanan tombol

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

<S-tab> cara shift + tab .

Rupanya, ada builtin untuk ini yang saya tidak sadari. Karena saya sangat suka jawaban manual saya , dan pendekatan ini sangat berbeda, saya pikir saya harus memposting jawaban baru daripada mengedit.

Ini berfungsi dengan memanggil inputsecretfungsi, lalu segera berhenti setelah keluar.


2

6502 kode mesin (C64), 22 21 byte

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

Penggunaan :SYS 2062

Daftar pembongkaran yang dikomentari (ACME) yang dikomentari, Anda dapat menghapus komentar dari tiga baris komentar pertama yang akan diluncurkan dengan RUNsekali dimuat:

!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

Komentar:

  • Saya belum menemukan apa pun di dokumen, tetapi tampaknya, setelah panggilan GETIN, beq bercabang hanya di tempat tidak ada penekanan tombol baru telah direkam;
  • Menggunakan # $ 60 sebagai output char, byte tersebut dapat digunakan kembali sebagai instruksi "rts" ketika RETURN ditekan.

2

Keempat (gforth) , 54 byte

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

Penjelasan

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

1

Python 3 + tkinter- 63 61 byte

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

Menampilkan a 1untuk setiap karakter, berakhir saat menutup jendela (OP mengatakan diizinkan).

Gif


Apakah from tkinter import*(baris baru) akan Entry(show=1).pack();Tk().mainloop()berfungsi?
Conor O'Brien

@ ConorO'Brien menguji
Mr. Xcoder

@ Conor'Brien no. Ini menghasilkan dua tkinterjendela berbeda . Satu dengan bidang teks, satu kosong. Rasanya tidak benar bagi saya.
Tn. Xcoder

Apakah Anda memerlukannya show=?
Buah Esolanging

@ Challenger5 Ya, kami memang membutuhkanshow=
Tn. Xcoder

1

Groovy, 77 73 byte

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

Ini adalah penutupan anonim, dengan 0 input yang diperlukan.

Tidak Terkumpul:

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

Sunting 1 (-4 byte): Komponen # terlihat dapat langsung diakses, baca lebih lanjut di sini .


1

Mikro , 35 byte

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

penjelajahan:

"": saya membuat string kosong baru 'i'
    {mulai input loop
     L masukan karakter
      46c: \ display ascii char # 46 (.) (Muncul, meninggalkan input char dari 'L'
           i ~ +: i push i, flip i dan char di sekitar, gabungkan mereka, dan simpan itu untuk i
                i10c = jika (, a)} a OK, banyak terjadi di sini, jika NL ada di i, loop berakhir, dan i akhir: \ akan menampilkan input


1
Itu adalah upaya pertama yang cukup bagus untuk bahasa! +1
MD XF

1

BF, 24 byte

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

Bekerja dengan bf.doleczek.pl . Anda dapat mengirim karakter nol ke program dengan Ctrl + Z.

Solusi alternatif:

BF, 1 byte

,

Ini adalah solusi yang sangat menjemukan. Terminal saya memiliki lebar 0 karakter , jadi tolong jangan masukkan kata sandi lebih lama dari itu.


Wah ... tidak buruk!
MD XF

@ MDXF Apakah Anda mengacu pada 24 byte satu atau yang 1 byte?
Buah Esolanging

Yang jelas 24 byte. Saya benar-benar lupa bahwa mencetak \badalah suatu hal. : P
MD XF

@ MDXF Apa maksudmu dengan itu? \bbagaimanapun juga tidak dapat dicetak.
Buah Esolanging

Tidak maksud saya solusi Anda gunakan \buntuk mengganti input, benar?
MD XF

1

PowerShell, 12 byte

Read-Host -a

Ini membaca input dari host dan, dengan tanda -a memperlakukannya sebagai keamanan / kata sandi. Di ISE itu muncul kotak pesan yang memiliki perilaku yang sama karena ISE tidak memungkinkan penangkapan penekanan tombol.

PS C:\Windows\system32> Read-Host -a
************

1

QBasic, 48 byte

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

INPUT$(1)membaca karakter selanjutnya dari input keyboard. (Ini dapat mencakup hal-hal seperti tab, backspace, dan melarikan diri, tetapi karena OP tidak mengatakan apa-apa tentang itu saya akan menganggap kita tidak perlu khawatir tentang mereka.) Jika karakternya adalah\r (ASCII 13), hentikan program; jika tidak, cetak *tanpa baris baru. Ulangi tak terhingga iklan.


1

Perl + Bash, 30 byte

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

cadalah *, menggunakan readdari bash, jadi bukan solusi Perl murni.


1

brainfuck, 21 byte

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

Yang terakhir, aku janji. Tanpa input = -1, akhir input = 0

Bagaimana itu bekerja

-[  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

Kode Anda tidak memiliki braket penutup. Dan mengapa Anda membuatnya begitu rumit? Sederhana "cetak a 'ÿ' untuk setiap karakter input" dapat diselesaikan dengan sederhana,[>-.,]
Dorian

@Dorian Braket adalah kesalahan, tetapi kompleksitas muncul karena harus menangani input dan akhir input
Jo King

0

QBIC , 44 byte

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

Penjelasan

{            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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.