Читать пароль


20

Ваша задача - прочитать «пароль» с клавиатуры / стандартного ввода.

Вызов :

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

Правила:

  • Вы должны печатать cв режиме реального времени. Как только пользователь вводит символ, который вы должны отобразить c.
  • c должен быть постоянным, то есть должен быть одинаковым символом.
  • cможет быть любым видимым символом (т. е. он не может быть символом новой строки, пробела, табуляции или непечатного текста).
  • cне может быть основано s, т.е. cдолжно быть определено / константно перед sчтением.
  • c должен быть одинаковым при каждом запуске программы.
  • cможет быть одним из символов, sесли случайно, если все другие правила соблюдаются.
  • Ни один из символов не sможет появиться на экране, за cисключением (см. Предыдущее правило).
  • Вы можете использовать любые разумные методы ввода и вывода при условии соблюдения всех других правил.
  • Вы можете предположить, что длина sникогда не превышает ширину терминала / графического окна.
  • Если вы используете терминал, ваша программа должна завершиться после ввода новой строки или EOF.

Пример :

Если бы sбыло password01и cбыло *, результат будет выглядеть примерно так:

пароль

Победитель :

Самое короткое представление на каждом языке выигрывает.


tkinterРазрешено ли использование python with в нашем настраиваемом поле ввода (например, в HTML), чтобы программа не завершала работу при нажатии клавиши ввода, а при закрытии Entryокна (X в Windows и cmd+ Wв Mac)?
г-н Xcoder

@ Mr.Xcoder Да, это так.
MD XF

Можем ли мы использовать Ctrl + J для представления буквального перевода строки в терминале? Или же мы можем использовать Ctrl + Z вместо ввода?
Конор О'Брайен

@ ConorO'Brien Разъяснение того, как ввод должен заканчиваться на терминале.
MD XF

2
Что должно произойти, если пользователь нажимает клавишу Backspace?
zdimension

Ответы:


6

ул 5 байтов

n=?,1

Из-за ошибки это 5 байтов. Должно быть только 1 байт:

1

Выполнение <code> n = ?, 1 </ code>


Определенно видел cmderответ, приходящий из-за вашего Ctrl+Zкомментария: P
MD XF

10/10 правильный инструмент для работы
Эрик Outgolfer

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, чтобы успокоить нескольких человек!
Лохматый

6
Где объяснение, я не понимаю.
Волшебная урна осьминога

11

Vim, 36 байт:

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

Используются нотации с помощью ключа vim , также <C-v>как и control-v , <CR>это ввод, <esc>клавиша escape и клавиша <tab>табуляции.

с это '0'.

Вот hexdump, чтобы доказать, что количество байтов является точным:

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

о_О Это здорово ...
Mr. 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
@ Квентин Ох ... мой. Ты волшебник. И я думал, что у меня все хорошо в 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

Python 2 , 50 байт

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

Работает только на окнах


1
К сожалению, это работает только на Windows: ((
Mr. Xcoder


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);}};}}

Ungolfed:

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

Результат:

введите описание изображения здесь

Кредит:

-3 @MD XF (указал на мою глупую ошибку с String[]args)

-7 @KritixiLithos (указывать public classможно просто class)


1
Это String[]argsнеобходимо?
MD XF

@MDXF, если я хочу дать ответ для Java 8, есть МНОГО вещей, которые я мог бы сделать. Тем не менее, я делаю это общий ответ Java. Однако, да, я могу это сделать String[]a.
Волшебная урна осьминога

Вы забыли обновить гольф-ответ. Кроме того, не 1>0оценивает 1?
MD XF

@MDXF in Java (< 8)- 1>0оценивает true, что отличается. Я отправлю этот же ответ в Groovy.
Волшебная урна осьминога

@StephenS это общий ответ Java, а не ответ Java 8.
Волшебная урна осьминога

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

Там нет ссылки 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 

Образец вывода:

ввод пароля в 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 *]

Должен запускаться в интерактивной оболочке (или иметь включенные сокращения):

введите описание изображения здесь


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 в качестве выходного символа, этот байт может быть повторно использован как инструкция «rts» при нажатии RETURN.

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 байт

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

Отображает 1для каждого символа, заканчивается при закрытии окна (OP сказал, что это разрешено).

Gif


Будет from tkinter import*(новая строка) Entry(show=1).pack();Tk().mainloop()работать?
Конор О'Брайен

@ ConorO'Brien тестирование
мистер Xcoder

@ ConorO'Brien нет. Он производит два разных tkinterокна. Один с текстовым полем, один пустой. Это не кажется мне правильным.
г-н Xcoder

Вам нужен show=?
Esolanging Fruit

@ Challenger5 Да, мы нужныshow=
г Xcoder

1

Groovy, 77 73 байта

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

Это анонимное закрытие с 0 обязательными входами.

Ungolfed:

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

Редактировать 1 (-4 байта): прямой доступ к видимому компоненту, подробнее читайте здесь .


1

Микро , 35 байт

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

explination:

"": я создаю новую пустую строку 'i'
    {начать цикл ввода
     L введите символ
      46c: \ display ascii char # 46 (.) (Оно выталкивается, оставляя входной символ из 'L'
           я ~ +: я толкаю себя, переворачиваю я и символ, соединяю их и сохраняю
                i10c = if (, a)} OK, здесь много чего происходит, если NL находится в i, цикл завершается, и в последнем i: \ будут отображаться входные данные


1
Это очень хорошая первая попытка языка! +1
MD XF

1

BF, 24 байта

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

Работает с bf.doleczek.pl . Вы можете отправить нулевой символ в программу с помощью Ctrl + Z.

Альтернативное решение:

BF, 1 байт

,

Это очень насмешливое решение. Мой терминал имеет ширину 0 символов , поэтому, пожалуйста, не вводите больше паролей, чем это.


Вау ... не плохо!
MD XF

@MDXF Вы имеете в виду 24-байтовый или 1-байтовый?
Esolanging Fruit

Очевидно, 24-байтовый. Я полностью забыл, что печать \bэто вещь. : P
MD XF

@MDXF Что ты имеешь в виду под этим? \bв любом случае непечатно.
Esolanging Fruit

Нет, я имею в виду, что ваше решение использует \bдля отмены ввода, правильно?
MD XF

1

PowerShell, 12 байт

Read-Host -a

Он считывает ввод с хоста и с флагом -a рассматривает его как строку безопасности / пароль. В ISE это выскакивает окно сообщения, которое имеет подобное поведение, так как ISE не позволяет захват нажатия клавиш.

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

1

QBasic, 48 байтов

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

INPUT$(1)читает следующий символ с клавиатуры (Это может включать такие вещи, как tab, backspace и escape, но, поскольку OP ничего о них не сказал, я предполагаю, что нам не нужно о них беспокоиться.) Если персонаж\r (ASCII 13), завершите программа; в противном случае печатайте *без новой строки. Повторите до бесконечности.


1

Perl + Bash, 30 байт

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

cэто *, использует readот Баша, поэтому не является чистым решением Perl.


1

мозговой трах, 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 Скобка была ошибкой, но сложность возникает из-за необходимости обрабатывать как отсутствие ввода, так и конец ввода
Джо Кинг,

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.