당신의 도전은 키보드 / 표준 입력에서 “암호”를 읽는 것입니다.
도전 과제 :
- 문자열을
s
보이지 않게 읽습니다 . - 의 각 문자에 대해 문자를
s
인쇄하십시오c
. - 실시간으로.
규칙 :
c
실시간으로 인쇄해야합니다 . 사용자가 문자를 입력하자마자 표시해야합니다c
.c
일정해야합니다. 즉 같은 문자 여야합니다.c
눈에 띄는 문자 일 수 있습니다 (예 : 줄 바꿈, 공백, 탭 또는 인쇄 할 수 없음).c
를 기반으로 할 수 없습니다s
. 즉, 읽기c
전에 정의 / 일정해야합니다s
.c
프로그램이 실행될 때마다 동일해야합니다.c
s
다른 모든 규칙을 따르는 한 우발적 인 경우 문자 중 하나가 될 수 있습니다 .- 를 제외한
s
화면에 문자 가 나타나지 않을 수 있습니다c
(이전 규칙 참조). - 다른 모든 규칙을 따르는 한 합리적인 입력 및 출력 방법을 사용할 수 있습니다.
- 길이
s
가 터미널 / 그래픽 창 너비보다 길지 않다고 가정 할 수 있습니다 . - 터미널을 사용하는 경우 개행 또는 EOF를 입력 한 후 프로그램을 종료해야합니다.
예 :
만약이 s
있었다 password01
그리고 c
있었다 *
출력과 같을 것이다 :
승자 :
각 언어에서 가장 짧은 제출이 이깁니다.
답변
답변
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}
샘플 출력 :
답변
아세토 , 8 7 6 바이트
,!`XpO
설명:
문자 ( ,
)를 읽고 무시하고 ( !
) 조건부로 종료하십시오. 스택 상단에 0을 인쇄하고 ( p
) 처음으로 돌아갑니다.
-F
플러싱 때문에 효과를 즉시 확인하기 위해 실행
첫 번째 솔루션은 샌드 박스 게시물을 기반으로했으며 대체 문자로 공백이 허용되며 enter (4 바이트)에서 종료 할 필요가 없습니다.
,'p>
답변
POSIX에 C, 128 (117) 113 96 바이트
termios.h
Quentin이 괴물 같은 마법사이기 때문에 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