Hasło do łańcucha


31

Twoim wyzwaniem jest hasło do łańcucha! Co to jest hasło, pytasz?

Weź ciąg jako dane wejściowe. Ten ciąg będzie zawierać tylko wielkie litery, małe litery, cyfry i spacje.

Musisz zastąpić wszystkie spacje znakami podkreślenia i przenieść wszystkie liczby na koniec łańcucha w kolejności, w jakiej pojawiają się od lewej do prawej. Następnie, dla każdej litery w ciągu, losowo zmień ją na wielkie lub małe litery.

Przykłady (wielkość znaków powinna się zmieniać za każdym razem):

Input
Hello world
Output
HElLo_wORld

Input
pa55 w0rd
Output
pA_Wrd550

Input
14 35
Output
_1435

Input
0971
Output
0971

Input
[space]
Output
_

Najkrótszy kod w bajtach wygrywa!

Ten, kto pyta w sprawie bezpieczeństwa informacji SE, czy jest to dobry algorytm haszujący, wygrywa! - Nie martw się, panowie SE, żartuję.


47
Świetny. Teraz opublikowałeś mój plan. Zaraz wracam, zmieniam wszystkie moje hasła ...
Geobits

8
Nie jest to nawet algorytm mieszania hasła ... zostałby zabity ogniem w Security SE XD
Justin

1
Gdyby tylko istniał łatwy sposób na zrobienie losowości w
Retinie

4
To nie jest dobry algorytm mieszający, ponieważ jest losowy
CalculatorFeline

6
Kusi mnie, aby użyć niektórych odpowiedzi jako hasła
MickyT

Odpowiedzi:


12

Pyth, 15 bajtów

s}D`MTrRO2Xzd\_

Demonstracja

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

Labirynt , 76 bajtów

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

Kolejna współpraca z @ MartinBüttner i po bardziej szalonej stronie spektrum Labiryntu - po raz pierwszy mamy wszystkie cztery ^>v<w jednym programie. Wypróbuj online!

Wyjaśnienie

Ogólny algorytm działający w pętli wygląda następująco:

 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

Aby zachować zwięzłe wyjaśnienie, oto z grubsza, w jaki sposób każda część programu odpowiada powyższemu pseudokodowi:

wprowadź opis zdjęcia tutaj

Oto interesujące części.

Zdobywanie losowości w Labiryncie

Jest tylko jeden sposób na uzyskanie losowości w Labiryncie, i wtedy, gdy IP próbuje iść naprzód, ale 1) nie ma ścieżki do przodu ani do tyłu i 2) są ścieżki dostępne po lewej i prawej stronie. W takim przypadku adres IP losowo wybiera między lewą a prawą trasą.

Jest to możliwe tylko przy użyciu ^>v<operatorów, które nprzesuwają wiersz / kolumnę no 1. Na przykład program ( Wypróbuj online! )

" 1
""v!@
  2
   !@

wyprowadza losowo 1 lub 2, ponieważ vprzesuwa kolumnę z przesunięciem 0 (tj. kolumna, w której IP jest włączony) o 1, dając

"
""1!@
  v
  2!@

Adres IP jest skierowany w prawo i próbuje iść do przodu (górna część stosu wynosi zero), ale nie może. Nie może się również poruszać do tyłu, więc losowo wybiera między lewą a prawą.

Sztuczki golfowe

  • Program rozpoczyna się od pierwszego znaku w kolejności odczytu, który faktycznie jest krokiem 6. Jednak wyskakiwanie z pustego stosu Labiryntu daje 0, więc występują kroki 10 i 14, przesuwając zero na stos pomocniczy, który jest efektywny brak op.

  • Główny stos jest praktycznie pusty po każdej iteracji, co pozwala nam sprawdzać układ kodu za pomocą >i <na ukrytych zerach na dole. >Owija się wokół dolny wiersz tak, że porusza IP z prawym dolnym rogu do dolnego lewego, i <przesunięcia powrót wiersz. IP następnie szczęśliwie przesuwa się w górę lewej kolumny, aby kontynuować pętlę.

  • Cyfry w labiryncie pop ni push 10*n + <digit>. Ponadto znaki są pobierane modulo 256 przed wysłaniem. Połączenie tych dwóch razem daje nam wynik 95 (podkreślenie), wykonując `33do 32 (spacja), co działa, ponieważ -3233 % 256 = 95. Mimo że istnieją inne sposoby przekształcenia 32 w 95 ( ;95najłatwiejsze), praca z liczbą ujemną pozwala nam nieco skompresować kod za pomocą skrętów w lewo.


2
Każdy atakujący, który próbuje użyć tego algorytmu do znalezienia mojego hasła, z pewnością się zgubi ...
J_F_B_M

3
Po prostu
użyję


7

CJam , 25 bajtów

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

Wypróbuj online!

Wyjaśnienie

Tłumaczenie mojej odpowiedzi 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 bajty

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

Sprawdź to tutaj.

Wyjaśnienie

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

Python, 107 bajtów

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

Ulepszenie pozostałych dwóch odpowiedzi w języku Python, ponieważ:

  • [...,'_'][c<'!']jest używany zamiast s.replace(' ','_')i
  • choice(c+c.swapcase()) jest używany zamiast choice([c.upper(),c.lower()])

Och, fajne ulepszenia. Świetna odpowiedź! +1 ode mnie
DJMcMayhem

7

JavaScript (ES6), 114 101 bajtów

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

47 bajtów tylko w celu losowego przydzielenia wielkości znaku ...

Edycja: Oszczędność 13 bajtów dzięki @ edc65.


Znowu się spóźniam na przyjęcie. Low / upp jest świetny! Ale reszta może być prostsza:f=s=>s.replace(/./g,x=>x>'9'?x[`to${Math.random()<.5?"Low":"Upp"}erCase`]():x>' '?(s+=x,''):'_',s='')+s
edc65

@ edc65 Wow. Nawet samo połączenie zamiany spacji / podkreślenia z zamianą wielkich / małych liter pozwala zaoszczędzić dwa bajty, ale to fantastyczne!
Neil

7

MATL , 27 bajtów

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

Wypróbuj online!

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

Python 3, 128 122 118 znaków

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

Dzięki xnor za golenie 6 bajtów.


Wygląda na to, że liczby na końcu są krótsze, sortując:lambda x:''.join(choice([i.upper(),i.lower()])for i in sorted(x.replace(' ','_'),key=str.isnumeric))
xnor

@xnor Thanks! Naprawdę powinienem się uczyć i zacząć używać
lambdas

5

Perl 6, 77 75 61 bajtów

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

S///jest jak s///, ale nie zmienia się $_w miejscu


4

Pyth, 17 bajtów

smrdO2o}N`UT:zd\_

Wypróbuj tutaj!

Wyjaśnienie

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

            : zd \ _ # zamień spacje na podkreślenia
      o # Sortuj ^ z funkcją klucza (N)
       } N`UT # N w „0123456789”, daje 1 dla liczb, więc zostaną posortowane po prawej stronie
 m # mapuj każdą postać d ^
  rdO2 # Konwertuj d losowe na wielkie lub małe litery
s # dołącz listę z powrotem do jednego ciągu

4

Mathematica, 86 bajtów

Dzięki Sp3000 za oszczędność 1 bajtu.

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

Ahhh, przetwarzanie znaków Mathematica ... czyż nie jest cudowne. Jest to nienazwana funkcja, która pobiera i zwraca ciąg znaków.

Ze względu na cały cukier syntaktyczny kolejność czytania jest nieco śmieszna:

Characters@#

Podziel łańcuch na znaki, w przeciwnym razie nie będziemy w stanie nic z nim zrobić.

...~SortBy~{DigitQ}

Sortuje cyfry do końca. Zawinięcie funkcji testowej w listę sprawia, że ​​sortowanie jest stabilne.

...&/@...

Mapuje funkcję lewej ręki nad każdym znakiem na liście.

RandomChoice[{ToLowerCase,Capitalize}]

Wybiera losową funkcję zmiany wielkości liter dla bieżącego znaku.

...@#...

Stosuje go do bieżącej postaci.

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

Zastępuje spacje podkreśleniami.

...<>""

Na koniec łączy wszystkie znaki z powrotem w ciąg.


3

PowerShell, 113 bajtów

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

PowerShell oznacza okropny język golfa. Podziel na tablicę znaków i zastąp spacje znakami podkreślenia. Weź każdą postać i proces. Zbierz liczby do zmiennej $ d do późniejszego wyjścia. Każda inna postać jest losowo przekształcana na wielkie lub małe litery, wywołując wyrażenie za pomocą 'char'.ToLower()lub 'char'.ToUpper(). Jeśli jakieś cyfry zostały zebrane, dołącz je na końcu.


PowerShell jest świetny i robi wszystko. : D Możesz zapisać kilka bajtów za pomocą $_-in0..9i -inoperatora wprowadzonego w PowerShell v3 zamiast wyrażenia regularnego -match.
AdmBorkBork

3

Julia, 88 87 78 bajtów

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

Jest to anonimowa funkcja, która przyjmuje ciąg i zwraca ciąg. Aby go wywołać, przypisz go do zmiennej.

Najpierw dzielimy ciąg wejściowy na tablicę jego znaków i sortujemy tablicę według tego, czy każdy znak jest cyfrą. Utrzymuje to porządek w tekście i cyfrach, ale wypycha cyfry do końca. Następnie dla każdego znaku w tablicy sprawdzamy, czy jest to spacja. Jeśli tak, zamień na podkreślenie, w przeciwnym razie losowo wybierz jeden z znaków ucfirstlub lcfirstzastosuj do znaku, przekształcając go odpowiednio na wielkie lub małe litery. Połącz tablicę w ciąg i gotowe!

Wypróbuj tutaj

Zaoszczędź 9 bajtów dzięki Sp3000!


2

Perl, 51 48 bajtów

Obejmuje +2 za -lp

Uruchom z wejściem na STDIN:

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

passwordify.pl:

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

1

Współczynnik, 154 bajtów

lub 222 z importem 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 ;

Nie jestem zbyt dobry w golfa i nie jestem pewien, czy wybrałem tutaj najlepsze podejście, ale pomyślałem, że spróbuję


1

Rubinowy, 84 bajtów

Funkcja anonimowa. Usunięcie spacji wcześniej c.downcasez jakiegoś powodu powoduje błąd składniowy i nie jestem pewien, dlaczego.

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

1

Lua, 125 bajtów

Kiedy obiekt spełnia funkcje, możesz robić ładne rzeczy, nawet w lua! Nie sądzę, żebym mógł to pograć w golfa, to już jest dość duży bałagan i już cieszę się, że pokonałem większość odpowiedzi na pytania w języku Python: 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)

Bez golfa i wyjaśnienia

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

Poważnie, 25 bajtów

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

Wypróbuj online!

Wyjaśnienie:

,`'_' (Æ≈"ûù"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 - niekonkurujący, 14 bajtów

S'_RE`N-`dE!k?

Tak, dodałem wbudowane do tego wyzwania, ale nie są one specjalnie ukierunkowane na ten problem.

Działa to z wersją 0.1 interpretera .

Przykładowy przebieg

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

Wyjaśnienie

     # Implicit: umieść dane wejściowe na stosie (C)
S # Wciśnij spację na stos (B)
„_ # Wciśnij znak podkreślenia na stos (A)
R # W C zamień B na A -> zastąp podkreślniki spacjami
     # stos zawiera teraz tylko zastąpiony ciąg (C)
E # Wciśnij pusty ciąg (B)
`# Uruchom literał polecenia,
     # stos do tego inicjuje się później jednym znakiem (B)
N # Wciśnij cyfry 0–9 jako ciąg znaków na stosie (A)
- # Usuń każdą postać z B, która jest w A
`# Literał polecenia zakończenia (A)
d # podziel C na B, posortuj części malejące klawiszem A i ponownie połącz na B.
     # Funkcja klucza A przekształca każdy znak ciągu w pusty ciąg, jeśli jest cyfrą.
     # Ponieważ wynikowy znak nie zawiera cyfry, jego kluczową wartością jest długość.
     # To mapuje klucz 0 na cyfry i klucz 1 na cyfry. Sortuję to malejąco
     # order przenosi cyfry w prawo i pozostawia cyfry w kolejności, w jakiej były wcześniej.
E # Naciśnij pusty ciąg
! k # Naciśnij polecenie k (= swapcase)
? # Zastosuj ^ losowo do każdej postaci
     # Implikowany: zawartość stosu wyjściowego

1

PHP, 368 bajtów

$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;

Nieskluczony kod:

$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;

To świetny początek, ale możesz grać w golfa o wiele więcej. Zmień wszystkie zmienne na nazwy 1-znakowe i usuń dodatkowe białe znaki. Gdy to zrobisz, będzie to golf pierwszej klasy!
NoOneIsHere

0

Python 2, 179 bajtów

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)

Prawdopodobnie jest tu dużo miejsca na ulepszenia, które wypracuję później.


0

AWK, 128 bajtów

{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()Jest potrzebne, aby dać nam różnych liczb losowych za każdym razem, gdy jest uruchamiany.
Aby działało to poprawnie z wejściem wieloliniowym, musielibyśmy umieścić coś takiego A=N=""przed forpętlą.


0

Python 3.5 - 118 bajtów:

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

Jak widać, używam w zasadzie funkcji modułu losowego, choiceaby wybrać funkcję losową (.upper () lub .lower ()) dla każdej litery w posortowanej wersji podanego ciągu, w którym wszystkie cyfry przechodzą do koniec. Ponadto każda spacja jest zastępowana podkreśleniem w posortowanym ciągu.


0

PHP, 164 158 znaków / bajtów

Jest to lepsze niż w innych golfach PHP , ponieważ:

  • Wymaga nakładów
  • Jest krótszy

Scenariusz

<?$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;

Przykład

php password.php 'thats some 1337 shit'

ThATs_Some__sHiT1337


0

> <> , 73 bajty

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

Nic szalonego tutaj, to:

  • drukuje _po napotkaniu 
  • pobiera mod 32 liter, a następnie losowo dodaje 8 * 8 lub 12 * 8 przed ich wydrukowaniem
  • ustawia liczbę w stos i drukuje je po osiągnięciu końca danych wejściowych

Możesz spróbować tutaj !


-1

Python 3, 151 bajtów

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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.