비밀번호를 읽으십시오 대해 문자를 s인쇄하십시오 c. 실시간으로. 규칙 : c실시간으로 인쇄해야합니다

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

도전 과제 :

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

규칙 :

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

:

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

암호

승자 :

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



답변

str , 5 바이트

n=?,1

버그로 인해 5 바이트입니다. 1 바이트 여야합니다.

1

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


답변

HTML, 20 바이트

<input type=password


대안 : HTML + JavaScript, 51 바이트

OP가 유효하다고 확인했지만 다음은 순수 주의자를 위해 JS를 사용하는 솔루션입니다!

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


답변

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


답변

루비와 신발, 29 자

Shoes.app{edit_line secret:1}

샘플 출력 :

password input in Ruby with Shoes


답변

아세토 , 8 7 6 바이트

,!`XpO

설명:

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

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

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

,'p>


답변

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와 같이 출력 🙂


답변

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