Bir şifre okuyun


20

Zorluklarınız klavye / standart girişten bir "şifre" okumaktır.

Zorluk :

  • Bir dize okuma sGörünmeyen .
  • İçindeki her karakter için sbir karakter yazdırın c.
  • Gerçek zamanda.

Kurallar:

  • cGerçek zamanlı yazdırmalısınız . Kullanıcı bir karakter girer girmezc .
  • c sabit olmalı, yani aynı karakter olmalıdır.
  • cherhangi bir görünür olabilir karakter olabilir (yani yeni satır, boşluk, sekme veya yazdırılamaz).
  • cdayanamaz s, yani cönceden tanımlanmış / sabit olmalıdırs okunmadan .
  • c program her çalıştırıldığında aynı olmalıdır.
  • c içindeki karakterlerden biri olabilir sdiğer tüm kurallara uyulduğu sürece, kaza durumunda .
  • sEkranda hiçbir karakter ekranda görünmeyebilir,c istisna dışında (bkz. Önceki kural).
  • Diğer tüm kurallara uyulduğu sürece makul giriş ve çıkış yöntemlerini kullanabilirsiniz.
  • Uzunluğunun shiçbir zaman terminal / grafik pencere genişliğinden daha uzun olmadığını varsayabilirsiniz .
  • Terminal kullanılıyorsa, programınız bir satırsonu veya EOF girildikten sonra sona ermelidir.

Örnek :

Eğer sidi password01ve coldu *çıktı benzer görünümde olacaktır:

password

Kazanan :

Her dilde en kısa sunum kazanır.


tkinterÖzel giriş alanımız için (HTML'deki gibi) olan python'a izin verilir mi , öyle ki enter tuşuna basıldığında program sonlandırılmaz, ancak Entrypenceresini kapattığınızda (Windows'ta X ve Mac'te cmd+ W)?
Bay Xcoder

@ Mr.Xcoder Evet, bu geçerli.
MD XF

Terminalde gerçek bir satırsonunu temsil etmek için Ctrl + J'yi kullanabilir miyiz? Alternatif olarak, enter yerine Ctrl + Z kullanabilir miyiz?
Conor O'Brien

@ ConorO'Brien Girişin terminalde nasıl bitmesi gerektiğinin açıklığa kavuşturulması.
MD XF

2
Kullanıcı geri tuşuna basarsa ne olur?
zdimension

Yanıtlar:



20

HTML, 20 bayt

<input type=password


Alternatif: HTML + JavaScript, 51 bayt

Her ne kadar OP bunun geçerli olduğunu doğrulasa da, saflar için JS kullanan bir çözüm!

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


4
FGITW, kimse var mı? : P (kelimenin tam anlamıyla on saniye sürdü)
MD XF

oninput=_=>i.value=i.value.replace(/./g,"*")bir bayt kaydeder.
Arjun

Yana cherhangi bir şey olabilir, sen ile iki bayt kaydedebilirsinizoninput=_=>i.value=i.value.replace(/./g,1)
Arjun

Birisi sadece HTML çözümümü geçersiz (@Arjun;) ilan ederse endişelenirim; JS'yi sadece birkaç kişiyi yatıştırmak için hızlıca bir araya getirdim!
Shaggy

6
Açıklama nerede, anlamıyorum.
Sihirli Ahtapot Urn

11

Vim, 36 bayt:

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

Bu kullanımlar Vim anahtar notasyonu , yani <C-v>bir kontrol v , <CR>enter,<esc> kaçış anahtarıdır ve <tab>sekme anahtarıdır.

c olur '0'.

İşte bayt sayısının doğru olduğunu kanıtlamak için bir hexdump:

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

Bu, aşağıdaki iki ex komutunu çalıştırarak çalışır:

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

İlki,

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

İkincisi demek

: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

En azından boşlukları görmezden gelmeden şu anki yöntemimi kullanarak bunu almanın bir yolu olmadığını düşünüyorum .. Güzel cevap!
nmjcman101

o_O Bu temiz ...
Bay Xcoder


6

Aseto , 8 7 6 bayt

,!`XpO

Açıklama:

Bir karakteri ( ,) oku , onu reddet ( !) ve şartlı olarak çık. Sıfırı yığının üstüne yazdır (p ) başlangıca geri dönün.

-FEfekti hemen görmek için ile çalıştırın (çünkü yıkama)

İlk çözümüm sanal alan direğine dayanıyordu, boşlukların yerine karakter olarak izin verildi ve enter'da çıkmaya gerek yok (4 bayt):

,'p>

5

POSIX C 128 117 113 96 bayt

-11 sayesinde Quentin arayarak termios.h
-4 sayesinde Quentin aptalca hatalarımı gösteriyor
-17 çünkü Quentin korkutucu bir sihirbaz.

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

Bu, STDIN'i gerçek zamanlı olarak tuşa basabilmesi için ham / görünmez moda geçirir. Bu 77 bayt sürer ve eminim ben biraz golf olabilir.Bunun, çıkışta STDIN'i sıfırlamadığını, bu nedenle manuel olarak yapmadığınız takdirde terminalinizi bozacağını unutmayın.

STDIN'i şu şekilde sıfırlayabilirsiniz:

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

GIF'de gösterildiği gibi çıktı :-)


1
İçime kazmak termios.h, ECHOöyle 0000010ve ICANONöyle 0000002. Bu araçlar ~(ECHO|ICANON)sadece olduğunu ~10:)
Quentin

@Quentin Düzenlendi! Şerefe: D
MD XF

1
Ayrıca, her bir !=ile ikame edilmiş olabilir ^, ve '\n'ile 10(UTF-8 varsayılarak);)
Quentin

2
Tam UB'ye gidersek, tdepolama alanını bir tamsayı dizisiyle değiştirebiliriz . Sonra c_lcflagssona erer t[3]ve ne isme ne de türe ne de #includetoplam 94 bayta ihtiyacımız var: c,t[15];f(){for(tcgetattr(1,t),t[3]&=~10,tcsetattr(1,0,t);(c=getchar())^10&&c^4;)printf(".");}- Ama belki de seninle eğlenmektense cevap olarak göndermem iyi olur :)
Quentin

1
@Quentin Oh ... benim. Sen bir büyücüsün. Ve C'de iyi olduğumu sanıyordum ... eğer kendi cevabınız olarak özgürce yayınlamak istiyorsanız ve düzenlemelerimi geri alacağım, aksi takdirde onu benimkine düzenlenmiş olarak bırakacağım.
MD XF

4

MS-DOS'ta x86 makine kodu - 14 bayt

Her zamanki gibi, bu, DosBox ve çoğu DOS varyantında çalıştırılabilen tam bir COM dosyasıdır.

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

Yorum yapılan derleme:

    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
...olmaz. Bu inanılmaz.
MD XF

Teşekkürler, ama yine de düzeltmek için başka bir şey olduğunu hissediyorum; bu xorbir woppin '3 bayt ve eğer bütün olarak çalışmasını sağlarsam tam olarak büyük olurdu ax; Denedim xor ax,0a0dh/ test al,al, ama o kadar büyük çünkü aptal testiki bayt, grrr ...
Matteo Italia

3

Python 2 , 50 bayt

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

Sadece pencerelerde çalışır


1
Ne yazık ki sadece Windows'da çalışıyor: ((
Bay Xcoder


3

Java 5-8, 125 122 131 124 bayt

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

Ungolfed:

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

Sonuç:

enter image description here

Kredi:

-3 @MD XF (Benim aptal hatamı gösterdi String[]args)

-7 @KritixiLithos (İşaretlenmiş public classolabilir class)


1
String[]argsgerekli?
MD XF

@MDXF Java 8 için cevap vermek istersem yapabileceğim bir sürü şey var. Ancak, bunu genel bir Java yanıtı yapıyorum. Ancak, evet, bunu yapabilirim String[]a.
Sihirli Ahtapot Urn

Golfçü cevabı güncellemeyi unuttunuz. Ayrıca, 1>0değerlendirme yapmıyor 1mu?
MD XF

@MDXF içinde Java (< 8)- 1>0değerlendirir için truefarklı olan. Aynı cevabı Groovy'ye göndereceğim.
Sihirli Ahtapot Urn

@StephenS Bu, Java 8 yanıtı değil, genel bir Java yanıtıdır.
Sihirli Ahtapot Urn

3

Mathematica 34 bayt

 InputString["",FieldMasked->True];

Her karakter girildikten sonra tek bir yıldız işareti görünür. Boş tırnak işaretleri, açılır giriş penceresinde görünen başlık içindir.

;Şifre gelen önler yönlendirilmesi sağlanır.

enter image description here


Kasıtlı lider alan?
MD XF

2

Vim, 58 50 52 50 bayt

Boşlukları düzgün işlediğinden emin olmak için eklendi.

Bir sürü yardım ve fikir için @DJMcMayhem'e teşekkürler

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

Aşağıdaki tipik Vim anahtarı sözdiziminde. Bir olduğu gibi karakterler işaretlenmiş ^olan Ctrl+<char>bu yüzden, ^Q=Ctrl+q

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

TIO bağlantısı yok, çünkü Vim'e doğrudan giriş yapmanız gerekiyor (normal gibi ön girişin aksine). Kodu çalıştırmak için Vim'e yazmanız gerekir ve ardından şifrenizi yazıp enter tuşuna basabilirsiniz. Parola ile hiçbir şey yapmaz. Ne olduğunu bile bilemez. Vurur vurmaz Vim penceresine girin:q!

Bu, tüm yazdırılabilir ASCII'leri *ekleme modunda eşleyerek <CR>ve<ESC>:q!<CR>


Belki sembollerin ne olduğunu açıklığa kavuşturmak? Bence olması gerekiyordu <C-v>, <esc> and <C-a>ama bunu söylemek zor.
DJMcMayhem

@DJMcMayhem Yapacak. Bu arada onları Vim'e yapıştırabileceğinizi düşünüyorum ve uygun şekilde görünecekler.
nmjcman101


2

FLTK, 47 karakter

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

Örnek çalışma:

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 

Örnek çıktı:

password input in FLTK


2

İşleme, 53 bayt

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

Bu grafiksel bir pencereden tuşa basılarak girişi alır. Şifreleri temsil etmek için seçtiği karakter 0. Yüksek kare hızı nedeniyle, her bir tuşa basmanın birden fazla 0s olarak görüneceğini ( keyPressedve bunun keyTyped(boolean değil) olması veya olmamasından dolayı) veya olduğuna dikkat edin keyrelease.

gif


2

Bash , 54 bayt

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

Puanlama amacıyla, $'\r'değişmez bir satır başı ile değiştirilebilir.

Çevrimiçi deneyin! (bakmak için çok fazla değil)


2

ZX81 BASIC, 54 bayt

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

ZX81 karakter setinde, yazdırılabilir karakterler Z , ancak ara karakteri bu şekilde boşluk giremezsiniz.

ZX Spectrum BASIC, 24 bayt

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

>=Sinclair BASIC'de tek baytlık bir anahtar kelime olarak sayıldığını unutmayın (bu durumda kod noktası 140).


Satır numaraları ve fonksiyonlar arasındaki boşluklar gerekli mi?
MD XF

Eğer kısaltmak Could PRINTiçin ?, ben eski TEMEL lehçelerin bir çok işe yaradığını biliyor
MD XF

@ MDXF PRINT1 baytlık bir token, sadece ekranda 7 karakter olarak temsil edilir ( THENönde gelen alan bastırıldığında hariç ).
Neil

2

R, 29 bayt

invisible(openssl::askpass())

Şifre girişlerini işleyen dahili. Yeni bir pencere açar ve girdiyi noktalarla değiştirir. invisibleSTDOUT şifresini yazdırmak için kullanılır.


2

Tcl / Tk, 18

gri [ent .e -sh *]

Etkileşimli kabukta çalıştırılmalıdır (veya kısaltmalar etkinleştirilmelidir):

enter image description here


Zor komut kısaltmaları olmadan 21 bayt: grid [entry .e -sh *]ve -shiçin bir seçenek kısaltmasıdır -show. 23 bayt, bunu sürdüren korumasız bir program için minimum olarak düşünürüm .
Donal Fellows

2

Vim, 15 tuş vuruşu

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

<S-tab>anlamına gelir shift + tab.

Görünüşe göre, bunun farkında olmadığım bir yerleşik var. Manuel cevabımı gerçekten sevdiğim için ve bu yaklaşım kökten farklı olduğundan, düzenlemek yerine yeni bir cevap göndermem gerektiğini düşündüm.

Bu, inputsecretişlevi çağırarak ve sonra çıktıktan hemen sonra çıkarak çalışır .


2

6502 makine kodu (C64), 22 21 bayt

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

Kullanımı :SYS 2062

Yorumlu sökme listesi (ACME), RUNyüklendikten sonra başlatmak için ilk üç yorumlu satırı kaldırabilirsiniz :

!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

Yorumlar:

  • Dokümanlarda hiçbir şey bulamadım, ancak GETIN çağrısından sonra, sadece yeni tuşa basmaların kaydedilmediği şubeler;
  • Çıkış karakteri olarak # $ 60 kullanıldığında, bu bayt, RETURN düğmesine basıldığında "rts" komutu olarak yeniden kullanılabilir.

2

İleri (gforth) , 54 bayt

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

açıklama

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 bytes

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

Displays a 1 for every character, ends when closing window (OP said it's allowed).

Gif


Would from tkinter import* (newline) Entry(show=1).pack();Tk().mainloop() work?
Conor O'Brien

@ConorO'Brien testing
Mr. Xcoder

@ConorO'Brien no. It produces two different tkinter windows. One with the text field, one empty. It doesn't seem right to me.
Mr. Xcoder

Do you need the show=?
Esolanging Fruit

@Challenger5 Yes, we do need the show=
Mr. Xcoder

1

Groovy, 77 73 bytes

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

This is an anonymous closure, with 0 required inputs.

Ungolfed:

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

Edit 1 (-4 bytes): Component#visible can be directly accessed, read more here.


1

Micro, 35 bytes

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

explination:

"":i                      create new blank string 'i'
    {                          begin input loop
     L                         input a character
      46c:\                    display ascii char #46 (.) (it is popped, leaving the input char from '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


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.


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

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.


1

Perl + Bash, 30 bytes

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

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


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

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.