パスワードを読む


20

あなたの課題は、キーボード/標準入力から「パスワード」を読み取ることです。

チャレンジ

  • 文字列を読む s目に見えない。
  • の各文字について s、文字を出力しcます。
  • リアルタイムで。

ルール:

  • 印刷する必要があります cリアルタイムでます。ユーザーが文字を入力したらすぐに表示する必要がありますc
  • c 定数でなければなりません。つまり、同じ文字でなければなりません。
  • c目に見えるものはどれでも文字を使用(つまり、改行、スペース、タブ、または印刷不可にすることはできません)。
  • cに基づくことはできませんs。つまり、c前に定義/定数する必要がありますs読み取るあります。
  • c プログラムを実行するたびに同じでなければなりません。
  • c の文字のいずれかになります s他のすべての規則が守られている限り、偶然の場合。
  • のどの文字sも画面に表示されない場合がありますが、c例外があります(前の規則を参照)。
  • 他のすべてのルールに従う限り、入力および出力の合理的な方法を使用できます。
  • の長さはs、ターミナル/グラフィカルウィンドウの幅より長くなることはないと想定できます。
  • 端末を使用している場合、プログラムは改行またはEOFが入力された後に終了する必要があります。

Ifはsいたpassword01c*、出力は次のようになります。

password

勝者

各言語で最短の提出が勝ちです。


Pythonはtkinterカスタム入力フィールド(HTMLの入力フィールドなど)で使用できます。Enterキーを押してもプログラムは終了しませんが、Entryのウィンドウ(WindowsではX 、Mac ではcmd+ W)を閉じると終了しますか?
ミスターXcoder

@ Mr.Xcoderはい、それは有効です。
MD XF

Ctrl + Jを使用して、ターミナルでリテラルの改行を表すことはできますか?あるいは、Enterの代わりにCtrl + Zを使用できますか?
コナーオブライエン

@ ConorO'Brienターミナルでの入力の終了方法を明確にします。
MD XF

2
ユーザーがバックスペースを押すとどうなりますか?
-zdimension

回答:



20

HTML、20バイト

<input type=password


代替:HTML + JavaScript、51バイト

OPは有効であることを確認しましたが、純粋主義者のためにJSを使用した解決策を次に示します。

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


4
FGITW、誰か?:P(文字通り10秒かかった)
MD XF

oninput=_=>i.value=i.value.replace(/./g,"*")バイトを保存します。
アルジュン

以来c何もすることができ、次の2つのより多くを救うことができるとバイトoninput=_=>i.value=i.value.replace(/./g,1)
アルジュン

誰かが私のHTMLのみのソリューションが無効であると宣言した場合(@Arjun;)が心配するでしょう。
シャギー

6
説明はどこにありますか、わかりません。
魔法のタコUr

11

Vim、36バイト:

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

これはvim-key表記を使用するため<C-v>control-v<CR>enter、<esc>エスケープキー、<tab>タブキーです。

c'0'です。

バイトカウントが正確であることを証明する16進ダンプを次に示します。

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

これは、次の2つのexコマンドを実行することで機能します。

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

最初の手段は

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

そして2つ目は

: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

少なくともスペースを無視せずに現在の方法を使用してこれに到達する方法はないと思います。
nmjcman101

o_Oそれ
はすてき


6

Aceto8 7 6バイト

,!`XpO

説明:

文字(,)を読み取り、否定(!)して条件付きで終了します。スタックの先頭にゼロを印刷します(p)、先頭に戻ります。

を実行し-Fて、効果をすぐに確認します(フラッシュするため)

私の最初の解決策はサンドボックスポストに基づいており、スペースを置換文字として使用でき、Enterで終了する必要はありません(4バイト):

,'p>

5

POSIXにC、128の 117 113 96バイト

-11クエンティンの検索にtermios.h
感謝します。-4クエンティンが私の愚かな間違いを指摘してくれたことに感謝し
ます。

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

これにより、STDINがraw / invisibleモードになり、リアルタイムでキーを押すことができます。これには77バイトかかり、少しでもゴルフできると確信しています。これは終了時にSTDINをリセットしないので、手動でそうしないと端末を台無しにすることに注意してください。

STDINをリセットする方法は次のとおりです。

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

GIFに表示される出力:-)


1
私に掘りtermios.hECHOである0000010ICANONされます0000002。これは、それ~(ECHO|ICANON)がただ~10:)
クエンティン

@クエンティン編集!乾杯:D
MD XF

1
また、それぞれ!=^、および'\n'有する10(UTF-8を仮定);)
カンタン

2
フルUBに移行するtと、のストレージを整数の配列に置き換えることができます。でc_lcflags終わるt[3]、と私たちは名前やタイプでもどちらを必要とする#include94バイト、合計:c,t[15];f(){for(tcgetattr(1,t),t[3]&=~10,tcsetattr(1,0,t);(c=getchar())^10&&c^4;)printf(".");}- :)しかし、多分あなたはより良い、むしろあなたの楽しみを持つよりも、私は答えとしてそれを投稿必要があるだろう
クエンティン・

1
@クエンティンああ...私。あなたはウィザードです。そして、私はCが得意だと思った...あなたが自分の答えとして自由に投稿したい場合は自由に編集をロールバックし、そうでない場合は編集したままにしておきます。
MD XF

4

MS-DOS上のx86マシンコード-14バイト

いつものように、これはDosBoxで実行できる完全なCOMファイルに加えて、ほとんどのDOSバリアントです。

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

コメント付きアセンブリ:

    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
...とんでもない。すごい。
MD XF

ありがとう これxorはwoppinの3バイトであり、全体で動作させた場合とまったく同じ大きさになりaxます。私が試したxor ax,0a0dh/ test al,alしかし、愚かであるため、それだけで大きなようだtest2バイト、grrrが...ある
マッテオイタリア



3

ジャワ5-8、125の 122 131 124バイト

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

ゴルフをしていない:

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

結果:

enter image description here

クレジット:

-3 @MD XF(で私の愚かな間違いを指摘しましたString[]args

-7 @KritixiLithos(指摘public classできるのは単にclass


1
であるString[]args必要?
MD XF

@MDXF Java 8の答えを出したい場合、できることはたくさんあります。ただし、これを一般的なJavaの回答にしています。ただし、はい、できますString[]a
魔法のタコUr

ゴルフの答えを更新するのを忘れました。また、1>0評価されません1か?
MD XF

中@MDXF Java (< 8)- 1>0と評価されtrue異なっています、。この同じ答えをGroovyに投稿します。
魔法のタコUr

@StephenSこれはJava 8の回答ではなく、一般的なJavaの回答です。
魔法のタコUr

3

Mathematica 34バイト

 InputString["",FieldMasked->True];

各文字が入力された後、単一のアスタリスクが表示されます。空の引用符は、ポップアップ入力ウィンドウに表示されるタイトルを示します。

これ;により、パスワードが印刷されなくなります。

enter image description here


意図的な先行スペース?
MD XF

2

Vim、58 50 52 50バイト

スペースを適切に処理するために追加されました。

@DJMcMayhemにたくさんの助けとアイデアをありがとう

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

以下の典型的なVimキー構文。のようにマークされている文字^Ctrl+<char>ですので、^Q=Ctrl+q

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

(通常のように事前入力するのではなく)Vimに直接入力する必要があるため、TIOリンクはありません。コードを実行するには、Vimに入力する必要があります。次に、パスワードを入力してEnterキーを押すことができます。パスワードに関しては何もしません。それが何であるかさえ知りません。Vimウィンドウに入るとすぐに:q!

これは、すべての印刷可能なASCIIを*挿入モードでマッピング<CR>し、<ESC>:q!<CR>


たぶん、シンボルが何であるかを明確にしますか?私は彼らがいるはずだと思うが<C-v>, <esc> and <C-a>、それを伝えるのは難しい。
DJMcMayhem

@DJMcMayhemします。ちなみに、Vimに貼り付けると、適切に表示されると思います。
nmjcman101


2

FLTK、47文字

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

サンプル実行:

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 

サンプル出力:

password input in FLTK


2

処理中、53バイト

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

これは、グラフィカルウィンドウからキーを押すことで入力を受け取ります。パスワードを表すために選択する文字は0です。高いフレームレートに、各キー押下が複数として表示されることに注意してください0S(また、これがあるという事実のためkeyPressedではなくkeyTyped(非ブール)又はkeyrelease)。

gif



2

ZX81 BASIC、54バイト

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の文字セットでは、印刷可能な文字はからの範囲のスペースにZありますが、実際にはこのようにスペースを入力することはできません。

ZX Spectrum BASIC、24バイト

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

>=Sinclair BASICではシングルバイトキーワードとしてカウントされることに注意してください(この場合はコードポイント140)。


行番号と関数の間にスペースが必要ですか?
MD XF

あなたは短縮でしたPRINT?、私は昔のBASIC方言の多くでその作品を知っている
MD XF

@MDXF PRINTは1バイトのトークンであり、画面上では7文字として表されます(THEN先頭のスペースが抑制されている場合、を除く)。
ニール

2

R、29バイト

invisible(openssl::askpass())

パスワードエントリを処理するビルトイン。新しいウィンドウを開き、入力をドットに置き換えます。invisibleSTDOUTへのパスワードの出力を抑制するために使用されます。


2

Tcl / Tk、18

gri [ent .e -sh *]

対話型シェルで実行する必要があります(または略語を有効にする):

enter image description here


21は、トリッキーなコマンドの省略形なしバイト:grid [entry .e -sh *]-shするオプションの略語です-show。23バイトは、これを行うメンテナンス可能なungolfedプログラムの最小値と考えています。
ドナルドフェローズ

2

Vim、15キーストローク

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

<S-tab>を意味しshift + tabます。

どうやら、私が知らなかったこのための組み込みがあります。私は手動の回答が本当に好きで、このアプローチは根本的に異なるため、編集する代わりに新しい回答を投稿する必要があると考えました。

これは、inputsecret関数を呼び出すことにより機能し、終了後すぐに終了します。


2

6502マシンコード(C64)、 22 21バイト

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

使用法SYS 2062

コメント付きの逆アセンブリリスト(ACME)、最初の3行のコメントを解除して、RUN一度ロードすると起動します。

!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

コメント:

  • ドキュメントには何も見つかりませんでしたが、GETIN呼び出し後、beqは新しいキーの押下が記録されていない場合にのみ分岐するようです。
  • 出力文字として#$ 60を使用すると、RETURNが押されたときにそのバイトを「rts」命令として再利用できます。

2

Forth(gforth)、54バイト

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

説明

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.