비밀번호를 읽으십시오


20

당신의 도전은 키보드 / 표준 입력에서 "암호"를 읽는 것입니다.

도전 과제 :

  • 문자열을 s보이지 않게 읽습니다 .
  • 의 각 문자에 대해 문자를 s인쇄하십시오 c.
  • 실시간으로.

규칙 :

  • c실시간으로 인쇄해야합니다 . 사용자가 문자를 입력하자마자 표시해야합니다 c.
  • c 일정해야합니다. 즉 같은 문자 여야합니다.
  • c눈에 띄는 문자 일 수 있습니다 (예 : 줄 바꿈, 공백, 탭 또는 인쇄 할 수 없음).
  • c를 기반으로 할 수 없습니다 s. 즉, 읽기 c전에 정의 / 일정해야합니다 s.
  • c 프로그램이 실행될 때마다 동일해야합니다.
  • cs다른 모든 규칙을 따르는 한 우발적 인 경우 문자 중 하나가 될 수 있습니다 .
  • 를 제외한 s화면에 문자 가 나타나지 않을 수 있습니다 c(이전 규칙 참조).
  • 다른 모든 규칙을 따르는 한 합리적인 입력 및 출력 방법을 사용할 수 있습니다.
  • 길이 s가 터미널 / 그래픽 창 너비보다 길지 않다고 가정 할 수 있습니다 .
  • 터미널을 사용하는 경우 개행 또는 EOF를 입력 한 후 프로그램을 종료해야합니다.

:

만약이 s있었다 password01그리고 c있었다 *출력과 같을 것이다 :

암호

승자 :

각 언어에서 가장 짧은 제출이 이깁니다.


python은 tkinter사용자 정의 입력 필드 (예 : HTML의 입력 필드) 를 허용하여 Enter 키를 누를 때 프로그램이 종료되지 않고 Entry'(Windows의 경우 X 및 Mac의 경우 cmd+) 창 을 닫을 때 종료 W됩니까?
Mr. Xcoder 2016 년

@ Mr.Xcoder 예, 유효합니다.
MD XF

터미널에서 리터럴 개행을 나타 내기 위해 Ctrl + J를 사용할 수 있습니까? 또는 Enter 대신 Ctrl + Z를 사용할 수 있습니까?
코너 오브라이언

@ ConorO'Brien 터미널에서 입력을 끝내는 방법을 설명합니다.
MD XF

2
사용자가 백 스페이스를 누르면 어떻게됩니까?
zdimension 2016 년

답변:



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,"*")바이트를 저장합니다.
Arjun

때문에 c아무것도 할 수있다, 당신은 두 바이트 이상을 절약 할 수 있습니다oninput=_=>i.value=i.value.replace(/./g,1)
아르 준

누군가가 내 HTML 전용 솔루션을 무효로 선언하면 @Arjun;) 걱정하지 않을 것입니다.
얽히고 설킨

6
설명이 어디에 있습니까, 이해할 수 없습니다.
Magic Octopus Urn

11

Vim, 36 바이트 :

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

이 용도는 표기 키를 정력 그래서 <C-v>입니다 제어-V는 , <CR>입력하고, <esc>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

다음 두 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)

두 번째는

: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 2016 년

o_O 깔끔합니다 ...
Mr. Xcoder


6

아세토 , 8 7 6 바이트

,!`XpO

설명:

문자 ( ,)를 읽고 무시하고 ( !) 조건부로 종료하십시오. 스택 상단에 0을 인쇄하고 ( p) 처음으로 돌아갑니다.

-F플러싱 때문에 효과를 즉시 확인하기 위해 실행

첫 번째 솔루션은 샌드 박스 게시물을 기반으로했으며 대체 문자로 공백이 허용되며 enter (4 바이트)에서 종료 할 필요가 없습니다.

,'p>

5

POSIX에 C, 128 (117) 113 96 바이트

termios.hQuentin이 괴물 같은 마법사이기 때문에 Quentin이
바보 같은 실수를 지적 했기 때문에 -4를 통해 -4를 검색하여 Quentin에게 감사합니다
.

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

이렇게하면 STDIN이 원시 / 보이지 않는 모드로 전환되어 실시간으로 키를 누를 수 있습니다. 이것은 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.h, ECHO이다 0000010하고 ICANON있다 0000002. 이것은 ~(ECHO|ICANON)단지 ~10:)
Quentin

@Quentin 편집 됨! 건배 : D
MD XF

1
또한, 각각 !=대체 될 수 ^'\n'함께 10(UTF-8로 가정))
쿠엔틴

2
UB가 가득 차면 t스토리지를 정수 배열로 바꿀 수 있습니다 . 그런 다음에 c_lcflags끝나고 t[3]우리는 이름이나 유형 또는 #include총 94 바이트 가 필요하지 않습니다 c,t[15];f(){for(tcgetattr(1,t),t[3]&=~10,tcsetattr(1,0,t);(c=getchar())^10&&c^4;)printf(".");}.-그러나 아마도 당신과 함께하는 것보다 답으로 게시하는 것이 좋습니다. :)
Quentin

1
@Quentin 오 ... 내. 당신은 마법사입니다. 그리고 나는 C에 능숙하다고 생각했습니다 ... 자신의 답변으로 자유롭게 게시하고 싶다면 편집 내용을 롤백하고 그렇지 않으면 편집 내용을 내 것으로 남겨 두십시오.
MD XF

4

MS-DOS의 x86 기계 코드-14 바이트

일반적으로이 파일은 전체 COM 파일이며 DosBox와 대부분의 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

고마워요.하지만 여전히 다듬어야 할 것이 있다고 생각합니다. 그것은 xor3 바이트의 woppin이며, 전체에서 작동하게하면 정확히 클 것입니다 ax. 나는 xor ax,0a0dh/ 시도했지만 test al,al바보 같은 test것이 2 바이트 이기 때문에 그것은 크다 . grrr ...
Matteo Italia

3

파이썬 2 , 50 바이트

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

창에서만 작동


1
슬프게도 Windows에서만 작동합니다 : ((
Mr. Xcoder


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.
Magic Octopus Urn

골프 답변을 업데이트하는 것을 잊었습니다. 또한로 1>0평가 되지 1않습니까?
MD XF

@MDXF는 Java (< 8)-로 1>0평가 true되는데 이는 다릅니다. Groovy에도 이와 같은 답변을 게시하겠습니다.
Magic Octopus Urn

@StephenS 이것은 Java 8 답변이 아닌 일반적인 Java 답변입니다.
Magic Octopus Urn

3

Mathematica 34 바이트

 InputString["",FieldMasked->True];

각 문자를 입력 한 후 별표 하나가 나타납니다. 빈 인용 부호는 팝업 입력 창에 나타나는 제목을 나타냅니다.

;암호의 방지가 인쇄된다.

여기에 이미지 설명을 입력하십시오


의도적 인 선행 공간?
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

Vio에 직접 입력해야하기 때문에 TIO 링크가 없습니다 (일반적인 사전 입력이 아닌). 코드를 실행하려면 Vim에 코드를 입력 한 다음 비밀번호를 입력하고 Enter 키를 누르십시오. 비밀번호로 아무 작업도 수행하지 않습니다. 그것이 무엇인지조차 알지 못할 것입니다. Vim 창에 들어가 자마자:q!

이것은 모든 인쇄 가능한 ASCII를 *삽입 모드에서 매핑 <CR>하고<ESC>:q!<CR>


어쩌면 상징이 무엇인지 명확히 할 수 있습니까? 나는 그들이 있어야한다고 생각 <C-v>, <esc> and <C-a>하지만 말하기 어렵다.
DJMcMayhem

@DJMcMayhem 것입니다. 덧붙여서 나는 Vim에 붙여 넣을 수 있다고 생각합니다.
nmjcman101 2016 년


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 

샘플 출력 :

FLTK에 비밀번호 입력


2

처리 중, 53 바이트

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

그래픽 창에서 키를 눌러 입력을받습니다. 암호를 나타내는 문자는 0입니다. 때문에 높은 프레임 속도로, 키를 누를 때마다 여러으로 나타납니다 것을 참고 0의 (그리고 인해이 없다는 사실 keyPressed이 아닌 keyTyped(안 부울) 또는 keyrelease).

gif



2

ZX81 기본, 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 스펙트럼 기본, 24 바이트

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

참고 >=싱클레어 BASIC (이 경우 코드 포인트 140)의 단일 바이트의 키워드로 계산됩니다.


줄 번호와 기능 사이에 공백이 필요합니까?
MD XF

당신은 단축 할 수 PRINT하기 위해 ?, 나는 오래된 BASIC 방언을 많이에서 그 일을 알고있다
MD XF

@MDXF PRINT는 1 바이트 토큰으로 화면에 7 자로 표시됩니다 ( THEN앞 공백이 표시되지 않는 경우 이후 제외 ).
Neil

2

R, 29 바이트

invisible(openssl::askpass())

비밀번호 입력을 처리하는 내장. 새 창을 열고 입력을 점으로 바꿉니다. invisibleSTDOUT에 비밀번호를 인쇄하지 않도록하는 데 사용됩니다.


2

Tcl / Tk, 18

gri [ent .e -sh *]

대화식 쉘에서 또는 약어가 활성화되어 있어야합니다.

여기에 이미지 설명을 입력하십시오


까다로운 명령 약어가없는 21 바이트 : grid [entry .e -sh *]-sh의 옵션 약어입니다 -show. 23 바이트는 유지 관리가 가능한 ungolfed 프로그램 에서 최소로 간주하는 것 입니다.
Donal Fellows

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)에서는 처음 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

넷째 ( 54 번째) , 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

파이썬 3 + tkinter- 63 61 바이트

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

1모든 문자 에 대해 a 를 표시하고 창을 닫을 때 종료됩니다 (OP는 허용됨).

GIF


겠습니까 from tkinter import*(줄 바꿈) Entry(show=1).pack();Tk().mainloop()를 사용할 수 있습니까?
코너 오브라이언

@ ConorO'Brien 테스트
Mr. Xcoder

@ ConorO'Brien 번호 두 개의 다른 tkinter창을 생성합니다 . 하나는 텍스트 필드가 있고 하나는 비어 있습니다. 나에게는 옳지 않은 것 같습니다.
Mr. Xcoder 2016 년

당신은 필요 show=합니까?
Esolanging 과일

@ Challenger5 네, 필요합니다show=
Mr. Xcoder

1

그루비, 77 73 바이트

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

이것은 0 개의 입력이 필요한 익명 클로저입니다.

언 골프 드 :

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

편집 1 (-4 바이트) : Component # visible에 직접 액세스 할 수 있습니다 . 자세한 내용은 여기를 참조하십시오 .


1

마이크로 , 35 바이트

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

설명 :

"": 새 빈 문자열 'i'를 만듭니다.
    {입력 루프 시작
     L은 문자를 입력
      46c : \ ascii char # 46 (.) 표시 (입력 문자는 'L'에서 제외)
           i ~ + : i 푸시하고 i와 문자를 뒤집어 연결 한 다음 i에 저장합니다.
                i10c = if (, a)} a 좋습니다. 여기서 NL이 i에 있으면 루프가 종료되고 마지막 i : \가 입력을 표시합니다.


1
그것은 언어에 대한 첫 시도입니다. +1
MD XF

1

BF, 24 바이트

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

bf.doleczek.pl 과 함께 작동 합니다. Ctrl + Z를 사용하여 0 문자를 프로그램에 보낼 수 있습니다.

대체 솔루션 :

BF, 1 바이트

,

이것은 뺨에 혀를 넣은 솔루션입니다. 터미널의 너비 는 0 자 이므로 이보다 긴 암호를 입력하지 마십시오.


우와 ... 나쁘지 않아!
MD XF

@MDXF 24 바이트 또는 1 바이트를 참조하고 있습니까?
Esolanging 과일

분명히 24 바이트입니다. 나는 인쇄 \b가 문제라는 것을 완전히 잊었다 . : P
MD XF

@MDXF 그게 무슨 뜻입니까? \b어쨌든 인쇄 할 수 없습니다.
Esolanging 과일

아니요, 솔루션 \b이 입력을 무시하는 데 사용한다는 의미 입니까?
MD XF

1

PowerShell, 12 바이트

Read-Host -a

호스트에서 입력을 읽고 -a 플래그를 사용하여 입력을 보안 문자열 / 암호로 취급합니다. ISE에서는 키 누르기 캡처를 허용하지 않으므로 유사한 동작을 갖는 메시지 상자가 나타납니다.

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

1

Q 기본, 48 바이트

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

INPUT$(1)키보드 입력에서 다음 문자를 읽습니다. (이것은 탭, 백 스페이스 및 이스케이프와 같은 것을 포함 할 수 있지만 OP는 OP에 대해 아무 말도하지 않으므로 걱정할 필요가 없습니다.)\r (ASCII 13)이면 종료하십시오. 프로그램; 그렇지 않으면 *줄 바꿈없이 인쇄하십시오 . 광고 인피니 엄을 반복하십시오.


1

Perl + Bash, 30 바이트

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

c이다 *사용, read그래서 bash가 순수 펄 해결책이 아니다.


1

brainfuck, 21 바이트

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

마지막으로 약속합니다. 입력 없음 = -1, 입력 끝 = 0

작동 원리

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

코드에 닫는 괄호가 없습니다. 왜 그렇게 복잡하게 만드나요? 간단한 "모든 입력 문자에 대해 'ÿ'를 인쇄하십시오"는 간단한 것으로 달성 할 수 있습니다,[>-.,]
Dorian

@Dorian 브래킷 실수했지만, 복잡성은 더 입력을 모두 처리하지 않아도 발생 입력의 끝을
조 왕

0

QBIC , 44 바이트

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

설명

{            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.