문자열을 비밀번호로 지정


31

당신의 도전은 문자열을 암호 화하는 것입니다! 비밀번호 란 무엇입니까?

문자열을 입력으로 사용하십시오. 이 문자열은 대문자, 소문자, 숫자 및 공백 만 포함합니다.

모든 공백을 밑줄로 바꾸고 모든 숫자를 왼쪽에서 오른쪽으로 나타나는 순서대로 문자열의 끝으로 이동해야합니다. 그런 다음 문자열의 모든 문자에 대해 임의로 대문자 또는 소문자로 변경하십시오.

예 (문자는 매번 달라야 함) :

Input
Hello world
Output
HElLo_wORld

Input
pa55 w0rd
Output
pA_Wrd550

Input
14 35
Output
_1435

Input
0971
Output
0971

Input
[space]
Output
_

바이트 단위의 최단 코드가 승리합니다!

이것이 좋은 해싱 알고리즘인지 정보 보안 SE에 문의하는 사람이라면 누구나 이길 수 있습니다!-SE 대 군주를 걱정하지 말고 농담입니다.


47
큰. 이제 내 계획을 발표했습니다. 내 모든 암호를 변경하고 바로 돌아가십시오 ...
Geobits

8
암호 해싱 알고리즘도 아닙니다. Security SE XD
Justin

1
Retina에서 무작위를하는 쉬운 방법 만 있다면 ...
mbomb007

4
이것은 무작위이기 때문에 좋은 해싱 알고리즘이 아닙니다
CalculatorFeline

6
답변으로 일부 답변을 비밀번호로 사용하고
싶습니다

답변:


12

Pyth, 15 바이트

s}D`MTrRO2Xzd\_

데모

s}D`MTrRO2Xzd\_
                   Implicit: z = input(), d = ' '
          Xzd\_    In z, replace ' ' with '_'.
      rR           To each character, apply r-function
        O2         Randomly 0 or 1. r 0 is lowercase, r 1 is uppercase.
 }D                Order the characters based on presence in
   `MT             The strings of the numbers 0 to 9.
s                  Concatenate into a string.

27

미로 , 76 바이트

 `:_64/"32}
,`    (3  :=-{
"`{"; _v2$  ;`3
"`".:@ ; ".5(`3.
<       "" `^`;>

@ MartinBüttner와의 또 다른 충돌과 Labyrinth 스펙트럼의 더 미쳤던 측면 – 처음으로 우리는 ^>v<하나의 프로그램에 네 가지를 모두 가지고 있습니다. 온라인으로 사용해보십시오!

설명

루프에서 실행되는 일반적인 알고리즘은 다음과 같습니다.

 1.   Read a char
 2.   If EOF:
 3.     Move all digits from auxiliary stack to main
 4.     Output all digits on main stack
 5.     Halt
      Otherwise:
 6.     If char is a letter (c >= 64):
 7.       If random turns left:
 8.         Output char XOR 32
          Otherwise:
 9.         Output char
        Otherwise:
10.       Shift char to auxiliary stack
11.       If char is space (c-32 == 0):
12.         Pull char back from auxiliary stack
13.         Output underscore
          Otherwise:
14.         Continue loop

설명을 간결하게 유지하기 위해 프로그램의 각 부분이 위의 의사 코드에 해당하는 방법은 다음과 같습니다.

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

흥미로운 부분이 있습니다.

미로에서 무작위성 얻기

Labyrinth에서 임의성을 얻는 한 가지 방법이 있으며 IP가 앞으로 이동하려고 할 때이지만 1) 앞으로 또는 뒤로 경로가 없으며 2) 왼쪽 및 오른쪽으로 사용할 수있는 경로가 있습니다. 이 경우 IP는 왼쪽과 오른쪽 경로 중에서 무작위로 선택합니다.

이것은 ^>v<연산자를 사용해서 만 가능합니다. 연산자 n는 행 / 열 n을 1 만큼 팝 및 시프트합니다 . 예를 들어, 프로그램 ( 온라인 시도! )

" 1
""v!@
  2
   !@

v오프셋이 0 인 열 (즉, IP가있는 열)을 1 씩 시프트 하므로 1 또는 2가 임의로 출력됩니다.

"
""1!@
  v
  2!@

IP가 오른쪽을 향하고 앞으로 진행하려고하지만 스택 맨 위는 0입니다. 또한 뒤로 이동할 수 없으므로 임의로 왼쪽 또는 오른쪽 중에서 선택합니다.

골프 트릭

  • 프로그램은 첫 번째 문자부터 읽기 순서로 시작합니다. 실제로는 6 단계입니다. 그러나 비어있는 Labyrinth 스택에서 팝하면 0이 생성되므로 10 단계와 14 단계가 발생하여 0을 보조 스택으로 이동시킵니다. 노업.

  • 주요 스택을 사용하여 골프에 코드 레이아웃을 우리가 할 수있는 모든 반복, 후 효과적으로 비어 ><하단의 암시 제로에. 은 >주변에 너무 하단 왼쪽 하단 오른쪽에서 IP 이동하고, 그 아래 줄을 래핑 <변화가 행 다시. 그런 다음 IP는 루프를 계속 진행하기 위해 행복하게 왼쪽 열을 위로 이동합니다.

  • 미로 팝의 숫자 n와 푸시 10*n + <digit>. 또한, 문자는 출력되기 전에 모듈로 256을 취합니다. 이 두 가지를 합하면 `3332 (공백) 를 수행 하여 95 (밑줄)를 출력 할 수 있습니다 -3233 % 256 = 95. 32를 95로 바꾸는 다른 방법이 있지만 ( ;95가장 쉬운 방법) 여기에 음수를 사용하면 왼쪽 회전으로 코드를 조금 압축 할 수 있습니다.


2
이 알고리즘을 사용하여 내 암호를 찾으려고 시도하는 모든 공격자는 반드시 분실 될 것입니다.
J_F_B_M

3
이 프로그램 을 비밀번호로
ILikeTacos


7

CJam , 25 바이트

lelS'_er{58<}${2mr{eu}&}%

온라인으로 사용해보십시오!

설명

내 MATL 답변의 번역.

l                            e# read line as a string
 el                          e# make lowercase
   S'_er                     e# replace spaces by underscores
        {58<}$               e# (stable) sort with key "is digit"
              {        }%    e# map block over the string
               2mr           e# generate 0 or 1 equiprobably
                  {eu}&      e# if it's 1, make uppercase

7

CJam, 23 바이트

lS'_er{60<}${eu_el+mR}%

여기에서 테스트하십시오.

설명

l       e# Read input.
S'_er   e# Turn spaces into underscores.
{60<}$  e# Sort (stably) by whether the character is a digit or not. This moves digits
        e# to the end, without changing the relative order within digits or non-digits.
{       e# Map this block over the characters...
  eu    e#   Convert to upper case.
  _el   e#   Make a copy and convert to lower case.
  +     e#   Join them into one string.
  mR    e#   Randomly choose one of the characters. Of course, this entire block is a
        e#   no-op for non-letter characters.
}%

7

파이썬, 107 바이트

from random import*
lambda s:''.join([choice(c+c.swapcase()),'_'][c<'!']for c in sorted(s,key=str.isdigit))

다른 두 가지 파이썬 답변 의 개선 사항은 다음 같습니다.

  • [...,'_'][c<'!']대신에 사용 s.replace(' ','_')되며
  • choice(c+c.swapcase()) 대신에 사용 choice([c.upper(),c.lower()])

오, 좋은 개선. 좋은 답변입니다! 나에게서 +1
DJMcMayhem

7

자바 스크립트 (ES6) 114 101 바이트

s=>s.replace(/./g,c=>c>'9'?c[`to${Math.random()<.5?"Low":"Upp"}erCase`]():c>' '?(s+=c,''):'_',s='')+s

문자의 경우를 무작위로 만들기 위해 47 바이트 ...

편집 : @ edc65 덕분에 대량의 13 바이트를 저장했습니다.


파티에 또 늦었 어 낮음 / upp가 좋습니다! 그러나 나머지는 더 간단 할 수 있습니다.f=s=>s.replace(/./g,x=>x>'9'?x[`to${Math.random()<.5?"Low":"Upp"}erCase`]():x>' '?(s+=x,''):'_',s='')+s
edc65

와우. 공백 / 밑줄 교체와 대문자 / 소문자 교체를 결합해도 2 바이트가 절약되지만 환상적입니다!
Neil

7

MATL , 27 바이트

k32'_'XEt58<2$S"@rEk?Xk]]v!

온라인으로 사용해보십시오!

k         % implicit input. Make lowercase. Non-lettters are not affected
32'_'XE   % replace spaces by underscores
t58<      % duplicate. Create logical index: true for digits, false otherwise
2$S       % sort first string according to second. Sort is stable
"         % for each character in that string
  @       %   push that character
  rEk     %   generate 0 or 1 with 1/2 probability each
  ?       %   if it's a 1
    Xk    %     make uppercase. Non-letters are not affected
  ]       %   end if
]         % end for each
v         % vertically concatenate all stack contents
!         % transpose into a row char array, i.e. a string. Implicit display

5

파이썬 3 128 개 122 118 문자

from random import*
s=lambda x:''.join(choice(i.upper()+i.lower())for i in sorted(x.replace(' ','_'),key=str.isdigit))

6 바이트를 면도 해 준 xnor에게 감사합니다.


다음을 정렬하여 마지막에 숫자를 얻는 것이 더 짧아 보입니다.lambda x:''.join(choice([i.upper(),i.lower()])for i in sorted(x.replace(' ','_'),key=str.isnumeric))
xnor

@xnor 감사합니다! 나는 정말로 람다를 배우고 사용하기 시작해야한다…
DJMcMayhem

5

펄 6, 77 75 61 바이트

{[~] |S:g/' '/_/.comb(/\D/)».&{(.lc,.uc).pick},|.comb(/\d/)}

S///처럼 s///그것을 수정하지 않습니다 제외하고는 $_자리에


4

Pyth, 17 바이트

smrdO2o}N`UT:zd\_

여기 사용해보십시오!

설명

smrdO2o} N`UT : zd \ _ # z = 입력

            : zd \ _ # 공백을 밑줄로 바꿉니다.
      o 키 기능으로 정렬 ^
       } "0123456789"의 N`UT # N은 숫자에 1을 제공하여 오른쪽으로 정렬됩니다.
 m # ^의 모든 문자를 매핑
  rdO2 # d 난수를 대문자 또는 소문자로 변환
# 조인 목록을 하나의 문자열로 다시

4

매스 매 티카, 86 바이트

1 바이트를 절약 한 Sp3000에 감사합니다.

RandomChoice[{ToLowerCase,Capitalize}]@#/." "->"_"&/@Characters@#~SortBy~{DigitQ}<>""&

아, 문자열 처리 Mathematica는 ... 사랑스럽지 않습니다. 이것은 문자열을 가져 와서 반환하는 명명되지 않은 함수입니다.

모든 구문 설탕으로 인해 읽기 순서는 약간 재미 있습니다.

Characters@#

문자열을 문자로 나누십시오. 그렇지 않으면 실제로 아무것도 할 수 없습니다.

...~SortBy~{DigitQ}

숫자를 끝까지 정렬합니다. 테스트 함수를 목록으로 감싸서 정렬을 안정적으로 만듭니다.

...&/@...

목록의 각 문자 위에 왼쪽 기능을 매핑합니다.

RandomChoice[{ToLowerCase,Capitalize}]

현재 문자에 ​​대해 임의의 대소 문자 변경 기능을 선택합니다.

...@#...

현재 캐릭터에 적용합니다.

.../." "->"_"

공백을 밑줄로 바꿉니다.

...<>""

마지막으로 모든 문자를 다시 문자열로 결합합니다.


3

PowerShell, 113 바이트

-join([char[]]$args[0]-replace" ","_"|%{if($_-match"\d"){$d+=$_}else{"'$_'.To$("Low","Upp"|random)er()"|iex}})+$d

PowerShell은 끔찍한 골프 언어를 나타냅니다. 문자 배열로 분할하고 공백을 밑줄로 바꿉니다. 각 인물과 과정을 가져 가라. 나중에 출력하기 위해 숫자를 변수 $ d로 수집하십시오. 각각 다른 문자를 무작위이다 사용하여 식을 호출하여 대문자 또는 소문자로 만들 'char'.ToLower()거나 'char'.ToUpper(). 숫자가 수집되면 끝에 추가하십시오.


PowerShell은 훌륭하고 모든 작업을 수행합니다. : D 당신은 몇을 사용하여 바이트를 저장할 수 $_-in0..9-inPowerShell에서 소개 연산자 대신 정규식의 v3으로 -match.
AdmBorkBork

3

줄리아, 88 87 78 바이트

s->join([c<33?'_':rand([ucfirst,lcfirst])("$c")for c=sort([s...],by=isdigit)])

이것은 문자열을 받아들이고 문자열을 반환하는 익명 함수입니다. 호출하려면 변수에 지정하십시오.

먼저 입력 문자열을 해당 문자의 배열로 나누고 각 문자가 숫자인지 여부에 따라 배열을 정렬합니다. 이것은 텍스트와 숫자의 순서를 유지하지만 숫자를 끝까지 푸시합니다. 그런 다음 배열의 각 문자에 대해 공백인지 확인합니다. 그렇다면 밑줄로 바꾸십시오. 그렇지 않으면 무작위로 문자 중 하나를 선택 ucfirst하거나 lcfirst문자에 적용하여 각각 대문자 또는 소문자로 변환하십시오. 배열을 문자열로 결합하면 완료됩니다!

여기 사용해보십시오

Sp3000 덕분에 9 바이트 절약!


2

펄, 51 48 바이트

에 +2 포함 -lp

STDIN의 입력으로 실행하십시오.

perl -lp passwordify.pl <<< "Hel1lo wo4rld"

passwordify.pl:

s%\pL%$&^$"x rand 2%eg;$_=y/ 0-9/_/dr.s/\D//gr

1

요소, 154 바이트

또는 222 가져 오기 kernel splitting sequences ascii combinators.random regexp

: f ( x -- y ) R/ \d/ R/ \D/ [ all-matching-subseqs ] bi-curry@ bi [ { [ >upper ] [ >lower ] } call-random ] map [ "" join ] bi@ " " "_" replace prepend ;

나는 골프를 너무 잘하지 못하고, 여기에 최선의 접근 방식을 취했는지 확실하지 않지만, 그것을 갈 것이라고 생각했습니다.


1

루비, 84 바이트

익명의 기능. 전에 공백을 제거하면 c.downcase어떤 이유로 구문 오류가 발생하며 왜 그런지 잘 모르겠습니다.

->s{q="";s.gsub(/./){|c|c=~/\d/?(q+=c;p):c==" "??_:rand<0.5?c.upcase: c.downcase}+q}

1

루아, 125 바이트

물체가 기능을 만나면 루아에서도 예쁜 일을 할 수 있습니다! 나는 이것을 골라 내지 못한다고 생각한다. 벌써 큰 혼란이다. 나는 이미 대부분의 파이썬 답변을 이겼다. : D.

s=""print((...):gsub("%d",function(d)s=s..d return""end):gsub("%s","_"):gsub("%a",1<math.random(2)and s.upper or s.lower)..s)

언 골프 및 설명

s=""                       -- Initialise the string that will contains the digits
print((...)                -- apply the following to the argument then print it
  :gsub("%d",function(d)   -- iterate over the digits
    s=s..d                 -- concatenate them in s
    return""               -- remove them from the arg
   end)
  :gsub("%s","_")          -- replace spaces by underscores
  :gsub("%a",              -- iterate over letters
    1<math.random(2)       -- pick a random integer between 1 and 2
      and s.upper          -- if it is 2, use the function upper() of object s
      or s.lower)          -- else, use the function lower() of object s
  ..s)                     -- concatenate with s

1

진심으로, 25 바이트

,`'_' (Æ≈"ûù"J£ƒ`M;ì;(-+Σ

온라인으로 사용해보십시오!

설명:

,`'_' (Æ≈"ûù"J£ƒ`M;ì;(-+Σ
,`              `M         map over input:
  '_' (Æ                     replace spaces with underscores
        ≈                    cast to int (does nothing if cast fails)
         "ûù"J£ƒ             randomly upper- or lowercase it (does nothing if not letter)
                  ;ì;(-+   move ints to back
                        Σ  join

1

IPOS- 비경쟁, 14 바이트

S'_RE`N-`dE!k?

예,이 과제에 대한 기본 제공 기능을 추가했지만이 문제를 특별히 목표로하지는 않습니다.

이것은 인터프리터 버전 0.1에서 작동합니다 .

예제 실행

> python IPOS.py S'_RE`N-`dE! k? -i "pa55 w0rd"
Pa_WrD550

설명

     # 암시 적 : 스택에 입력을 배치합니다 (C)
S # 스택에 공간을 밀어 넣습니다 (B)
'_ # 스택에 밑줄을 긋습니다 (A)
R # C에서 B를 A로 바꾸고-밑줄을 공백으로 바꿉니다.
     # 스택은 이제 교체 된 문자열 만 포함합니다 (C)
E # 빈 줄을 밉니다 (B)
`# 명령 리터럴을 시작합니다.
     # 이것에 대한 스택은 나중에 단일 문자 (B)로 초기화됩니다.
N # 숫자 0-9를 문자열로 스택에 밀어 넣습니다 (A)
-# A에있는 B에서 모든 문자를 제거
`# 끝 명령 리터럴 (A)
d # B에서 C를 분리하고 키 A로 내림차순으로 부품을 정렬 한 다음 B에서 다시 결합합니다.
     # 키 함수 A는 숫자 인 경우 문자열의 각 문자를 빈 문자열로 변환합니다.
     # 결과 문자는 숫자를 포함하지 않기 때문에 키 값은 길이입니다.
     # 키 0을 숫자로, 키 1을 숫자가 아닌 숫자로 매핑합니다. 이것을 내림차순으로 정렬
     # order는 숫자를 오른쪽으로 이동하고 이전의 순서대로 비 숫자를 남겨 둡니다.
E # 빈 줄을 밀어
! k # 명령 k를 밉니다 (= 스왑 케이스)
? # 모든 문자에 무작위로 ^ 적용
     # 암시 적 : 출력 스택 내용

1

PHP, 368 바이트

$str = "pa55 w0rd";
$str = str_replace(" ","_",$str);
$output AND $numStr = "";
$numArray = ['0','1','2','3','4','5','6','7','8','9'];
for($i=0;$i<strlen($str);$i++){
    in_array($str[$i],$numArray)?($numStr = $numStr.$str[$i]):((rand(10,100)%2==0)?$str[$i] = strtoupper($str[$i]) AND $output = $output.$str[$i]:$output = $output.$str[$i]);
}
echo $output = $output.$numStr;

Ungolfed Code :

$str = "pa55 w0rd";
$str = str_replace(" ","_",$str);
$len = strlen($str);
$output = "";
$numStr = "";
$numArray = ['0','1','2','3','4','5','6','7','8','9'];
for($i=0;$i<$len;$i++){
  if(in_array($str[$i],$numArray)){
    $numStr = $numStr.$str[$i];
  }else {
      if(rand(10,100)%2==0)
      {
        $str[$i] = strtoupper($str[$i]);
      }
      $output = $output.$str[$i];
  }
}
$output = $output.$numStr;
echo $output;

이것은 좋은 출발이지만, 당신은 이것을 훨씬 더 많이 뛸 수 있습니다. 모든 변수를 1 문자 이름으로 변경하고 추가 공백을 제거하십시오. 그렇게하면 일류 골프가 될 것입니다!
NoOneIsHere 여기

0

파이썬 2, 179 바이트

from random import*
f=lambda s,a=[str.upper,str.lower],n='0123456789':''.join(map(lambda x:choice(a)(x),filter(lambda x:x not in n,s).replace(' ','_')))+filter(lambda x:x in n,s)

여기에 나중에 개선 할 개선의 여지가 많을 것입니다.


0

AWK, 128 바이트

{srand();for(;++i<=split($0,a,"");){s=a[i];if(s!=s+0){o=s==" "?"_":rand()>0.5?tolower(s):toupper(s);A=A o}else{N=N s}}print A N}

srand()서로 다른 난수 우리에게이 실행될 때마다 줄 필요하다.
이것이 다중 라인 입력에서 올바르게 작동하려면 루프 A=N=""앞에 무언가를 넣어야 for합니다.


0

파이썬 3.5-118 바이트 :

from random import*
lambda y:''.join(choice([q.upper(),q.lower()])for q in sorted(y.replace(' ','_'),key=str.isdigit))

보시다시피, 기본적으로 무작위 모듈의 choice함수를 사용하여 주어진 문자열의 정렬 된 버전에서 각 문자에 대해 임의의 함수 (.upper () 또는 .lower ())를 선택합니다. 모든 숫자는 종료. 또한 모든 문자열은 정렬 된 문자열에서 밑줄로 바뀝니다.


0

PHP, 164158 자 / ​​바이트

이것은 다른 PHP golf 보다 낫습니다 .

  • 입력이 필요합니다
  • 더 짧아

스크립트

<?$a=$b='';foreach(str_split(strtolower($argv[1]))as$c){if($c==' ')$c='_';if(preg_match("/[0-9]/",$c))$a.=$c;else$b.=(rand(0,1)?$c:strtoupper($c));}echo$b.$a;

php password.php 'thats some 1337 shit'

ThATs_Some__sHiT1337


0

> <> , 73 바이트

 i:"@")?v:" ")?v0) ?\rl?!;o01!.<
 v8<    8>00.! <o"_"/
8<>x<%*4/^o+*
 ^c<

여기서 미친 것도 없습니다.

  • _발생할 때 인쇄 
  • 32 자의 글자를 취한 다음 무작위로 8 * 8 또는 12 * 8을 추가하여 인쇄합니다.
  • 숫자가 쌓이고 입력의 끝에 도달하면 인쇄합니다

여기서 시도해보십시오 !


-1

파이썬 3, 151 바이트

import random as r
x=input();s="";n=""
for c in x:
 if c.isdigit():n+=c
 else:s+=c.upper() if r.randint(0,1) else c.lower()
print(s.replace(" ","_")+n)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.