Прочитайте пароль


20

Ваше завдання - прочитати "пароль" з клавіатури / стандартного вводу.

Виклик :

  • Прочитайте рядок s непомітно.
  • Для кожного з символів sнадрукуйте символc .
  • В реальному часі.

Правила:

  • Ви повинні надрукувати cв режимі реального часу. Як тільки користувач вводить персонаж, ви повинні відобразити йогоc .
  • c має бути постійним, тобто він повинен бути однаковим символом.
  • cможе бути будь-яким видимим символом (тобто він не може бути новим рядком, пробілом, вкладкою або недрукувальним).
  • cне може базуватися на тому s, тобто cповинен бути визначений / постійний, перш ніж sчитати.
  • c повинні бути однаковими при кожному запуску програми.
  • cможе бути одним із персонажів, sякщо випадково дотримуватися всіх інших правил.
  • Жоден із символів не sможе відображатись на екрані, за cвинятком (див. Попереднє правило).
  • Ви можете використовувати будь-які обґрунтовані методи введення та виведення, доки дотримуються всі інші правила.
  • Ви можете припустити, що довжина s ніколи не перевищує ширину вікна терміналу / графічного зображення.
  • Якщо ви використовуєте термінал, ваша програма повинна завершитися після введення нової лінії або EOF.

Приклад :

Якби sбув password01і cбув *, вихід буде виглядати приблизно так:

password

Переможець :

Виграє найкоротше подання на кожній мові.


Чи tkinterдозволено python із нашим полем для введення (наприклад, у HTML) таким чином, що програма не закінчується, коли натиснути клавішу Enter, але коли ви закриєте вікно Entry'(X у Windows та cmd+ Wна mac)?
Містер Xcoder

@ Mr.Xcoder Так, це дійсно.
MD XF

Чи можемо ми використовувати Ctrl + J для представлення буквального нового рядка в терміналі? Чи можна використовувати Ctrl + Z замість enter?
Conor O'Brien

@ ConorO'Brien Уточнення, як вхід повинен закінчуватися в терміналі.
MD XF

2
Що повинно відбутися, якщо користувач натисне на зворотний простір?
zdimension

Відповіді:



20

HTML, 20 байт

<input type=password


Альтернатива: HTML + JavaScript, 51 байт

Хоча ОП підтвердило, що це є дійсним, ось рішення з використанням JS для пуристів!

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


4
FGITW, хтось? : P (знадобилось йому буквально десять секунд)
MD XF

oninput=_=>i.value=i.value.replace(/./g,"*")зберігає байт.
Арджун

Оскільки cможе бути що завгодно, ви можете зберегти ще два байти за допомогоюoninput=_=>i.value=i.value.replace(/./g,1)
Арджун

Я буду хвилюватися про це, якщо (коли) хтось оголосить моє рішення лише для HTML недійсним, @Arjun;) Я лише кинув JS один разом, щоб розмістити кількох людей!
Shaggy

6
Де пояснення, я не розумію.
Чарівний восьминіг Урна

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>вводиться, <esc>є клавішею відходу і <tab>є клавішею вкладки.

c є '0'.

Ось шістнадцятковий набір, щоб довести, що кількість байтів є точним:

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

Це працює за допомогою наступних двох колишніх команд:

: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

o_O Це акуратно ...
Містер Xcoder


6

Ацето , 8 7 6 байт

,!`XpO

Пояснення:

Прочитайте символ ( ,), заперечуйте його ( !) та умовно вийдіть. Надрукуйте нуль у верхній частині стека ( p) та поверніться до початку.

Запустіть, -Fщоб негайно побачити ефект (тому що промивання)

Моє перше рішення базувалося на публікації пісочної скриньки, з пробілами, дозволеними як замінні символи, і не потрібно виходити при введенні (4 байти):

,'p>

5

C на POSIX, 128 117 113 96 байт

-11 завдяки Квентіну, який шукав termios.h
-4, завдяки Квентіну вказував на мої дурні помилки
-17, тому що Квентін - чудовий майстер.

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 Відредаговано! Ура: 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(".");}- Але, можливо, вам краще, щоб я написав це як відповідь, а не розважався з вашими :)
Квентін,

1
@Quentin О ... мій. Ти чарівник. І я подумав, що мені добре в C ... якщо ви хочете опублікувати його як свою власну відповідь, не соромтеся, і я відкажу свої зміни, інакше я залишу її відредагованою в моїй.
MD XF

4

машинний код x86 на MS-DOS - 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

Дякую, але я відчуваю, що є ще щось, що слід обробити; що xorє woppin '3 байта, і буде точно так , як великий , якби я зробив його роботу в цілому ax; Я спробував xor ax,0a0dh/ test al,al, але він такий же великий, бо дурний test- два байти, гррр ...
Matteo Italia



3

Java 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.
Чарівний восьминога Урна

@StephenS це загальна відповідь на Java, а не відповідь на Java 8.
Чарівний восьминога Урна

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

Немає посилання TIO, тому що вам потрібно буде безпосередньо ввести Vim (на відміну від попереднього введення, як звичайного). Для запуску коду потрібно ввести його у 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())

Вбудований, який обробляє записи пароля. Відкриває нове вікно і замінює введення крапками. invisibleвикористовується для придушення друку пароля до STDOUT.


2

Tcl / Tk, 18

gri [ent .e -sh *]

Потрібно виконати інтерактивну оболонку (або увімкнено абревіатури):

enter image description here


21 байт без складних скорочень команд: grid [entry .e -sh *]і -shє абревіатурою опції для -show. 23 байти - це те, що я вважаю мінімумом для бездоганної програми, яка не виконує це.
Стипендіати

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, бек-файли ведуть лише там, де не було записано нових натискань клавіш;
  • Використовуючи # 60 $ як вихідний графік, цей байт може бути повторно використаний як "rts" інструкція при натисканні клавіші RETURN.

2

Четвертий (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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.