Wygeneruj szyfr, podając liczbę i ciąg znaków
Twoje zadanie jest proste. Biorąc pod uwagę ciąg s
i liczbę 0 <= n <= 9
jako dane wejściowe, wstaw pseudolosowy drukowalny znak ASCII między każdym znakiem czasów ciągu n
. Tak, że dla każdej postaci s
znajdują się n
między nimi losowe znaki. Przestrzenie należy przyciąć.
Wejście:
- Ciąg
s
fraza do szyfrowania w szyfru - liczba całkowita
n
z zakresu0 <= n <= 9
Przykład:
Wejście:
The treasure is here
2
Wynik:
T ! 0 h 32 e F4 t 0i r lk e hm a 7y s # 0 u * & r * h e ! 2 i H ^ s B, h ! @ E 0) r $ h e
To jest golf golfowy, więc wygrywa najkrótszy kod! Powodzenia i miłej zabawy!
code-golf
string
random
cryptography
jacksonecac
źródło
źródło
n
znaków składa się zn
kopii tego samego losowego znaku, są one nadal losowe, ale są nie statystycznie niezależny. I tak dalejO
były bardziej prawdopodobne niż spacje lub~
? Jeśli musi być jednolity, powinieneś to wyraźnie powiedzieć. A jeśli nie musi być jednolity, powinieneś przynajmniej powiedzieć coś takiego, że każda postać musi mieć niezerowe prawdopodobieństwo. Ty również zaznaczono w poprzednim komentarzu, że każda postać ma mieć niezależną dystrybucję, więc jeśli to jest ważne, należy wspomnieć w wyzwaniu. Istnieje bardzo szerokie spektrum losowości.Odpowiedzi:
C #,
141131 bajtówCałkiem podobna do odpowiedzi Java @ Geobit , z wyjątkiem obecnie dłuższych :(
Pełna zawartość lambda:
źródło
R=...
możesz po prostu użyć bezpośrednionew System.Random().Next(...)
05AB1E , 11 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Java 7,
132124 bajtyNic szczególnego, tylko podwójna pętla, której można się spodziewać. Zewnętrzne, aby zapętlić ciąg, wewnętrzne, aby wypełnić losowe:
źródło
k
:String f(int n,char[]a){String o="";for(char b:a)if(b>32){o+=b;for(int i=0;i++<n;o+=(char)(33+Math.random()*94));}return o;}
(125 bajtów)char
obsadą. Dzięki!Pyke,
12119 bajtówWypróbuj tutaj!
Końcowe losowe znaki są w porządku według OP.
źródło
Oktawa, 43 bajty
Pobiera na wejściu ciąg znaków
s
i liczbę całkowitąn
. Ciąg w Octave to po prostu tablica znaków.s>32
jest logiczną mapą1
dla dowolnych znaków spacji. Kod dołącza macierz zn
wierszami i taką samą liczbą kolumn, jaks(s>32)
ma, zawierającą liczby zmiennoprzecinkowe od 33 do 126. Jest domyślnie zaokrąglana do liczb całkowitych i konwertowana na znaki ASCII, gdy jest łączona z łańcuchems
.(:)'
prostuje to do poziomej tablicy znaków.Sprawdź to tutaj!
źródło
Python 2,
12312211811498 bajtówCzłowieku, chciałbym, żeby
random
nie było tak drogie (i żebyśmy nie musieli filtrować spacji). Teraz mamy duże oszczędności, ponieważ możemy mieć na końcu znaki zaszyfrowane :) W każdym razie, proszę:źródło
JavaScript (Firefox 30+), 96 bajtów
Pure ES6 ma dwa bajty dłużej:
Oto naprawdę fajne podejście, które jest niestety o 26 bajtów dłuższe:
źródło
/. *(?=.)/
, nie działa na ciągi znaków rozpoczynające się lub kończące spacjami, nie na tym, że nikogo to nie obchodzi. (Teraz możesz nawet śledzić losowe postacie.)(?=.)
co zajmuje spacje na końcu łańcuchów.94+33
zamiast95+32
R, 97 bajtów
Nienazwana funkcja przyjmująca dane wejściowe
x
(ciąg) in
.Wypróbuj na skrzypcach R.
źródło
CJam ,
21 lat18 bajtówWypróbuj online!
Drukuje
n
losowe znaki końcowe.Wyjaśnienie
źródło
Bash, 124 bajty
Pure Bash + Coreutils , brak struktur kontroli przepływu, brak podjęzyków, brak „eval”
Grał w golfa
Test
źródło
Q / KDB +,
39 3634 bajtówZmienne w użyciu:
To wykorzystuje wcześniejsze przysłówka, który stosuje funkcję po lewej stronie między każdym elementem po prawej stronie a jego poprzednikiem. (Zasadniczo stosuje funkcję po lewej stronie między każdą postacią po prawej stronie.)
Wygeneruj n liczb losowych od 40 do 126, a następnie przekonwertuj je na znaki ekwiwalentne: (wydaje się, że q ma tylko te znaki)
Przykładowe dane wyjściowe:
EDYCJA:
Zapisano 3 bajty, przekształcając raze q w (, /) za pomocą notacji k i podobnie zmieniono przed `: Dzięki @slackwear za aktualizację, ogoliłem 2 bajty :)
źródło
10h$
Java 8, 114 bajtów
Grał w golfa
Lambda, który akceptuje liczbę całkowitą i ciąg. Zainspirowany odpowiedzią Java 7 podwójna pętla przy użyciu składni Java 8 Stream (
String.chars
) w celu zaoszczędzenia kilku bajtów.Wejście
Wynik
źródło
Scala,
9594 bajtówNic nadzwyczajnego, oprócz użycia mkString na łańcuchu. Traktuje ciąg znaków jako listę znaków i pozwala mi wstawić między nimi separator. Moim separatorem jest odpowiednia liczba losowo generowanych znaków alfanumerycznych.
źródło
Random.alphanumeric
spowoduje, że każdy fragment będzie taki sam, więc jest to kiepski szyfr ... Zobacz ten przykład:scala> c("Hello", 1) res0: String = Hbeblblbo
filter
. InwokacjamkString
ciągu będzie traktować go jako kolekcję znaków.> <> (Ryba),
107106103 bajtówWypróbuj online!
To nie jest super losowe, ale jest losowe. Wystarczy umieścić ciąg i liczbę całkowitą na stosie (przykład: „Witaj świecie!”, 5).
Pełne wyjaśnienie
To jest nieco starsza wersja kodu, dopóki nie zaktualizuję wyjaśnienia. W większości jest taki sam, może nieco łatwiejszy do odczytania:
Udajemy, że parametrem ciągu jest,
s
a parametrem liczby całkowitej jesti
.<
Mówi rybę od razu w lewo, który owija się wokół celu" "
, który dodaje spację characted na stosie. Następnie ryba przemieszcza się&
, co dodaje miejsce do rejestru.r
odwraca stos i{:}
przesuwa stos w lewo (umieszczeniei
na końcu stosu), kopiuje wartość na końcu stosu, a następnie przesuwa go w prawo.v
mówi rybie, aby zaczęła poruszać się w dół.x
każe rybom poruszać się w losowym kierunku, co ostatecznie prowadzi do tego, że ryba idzie w prawo i kontynuuje w dół, lub przechodzi1+
lub2+
wcześniej. Dodaje to odpowiednio 1 lub 2 do liczby na końcu stosu. Jeśli ryba przemieszcza się w górę, uderzav
ponownie i płynie z powrotem w dół.}
przesuwa stos w prawo, a następnie mai
pozycję 1 na stosie i tę nową zmienną w pozycji 0 (nazwiemy tom
).Ta sekcja jest funkcją, nazwijmy ją whitespaceTrimmer . Zaczyna się tam, gdzie
<
jest. Po prostu usuwa spacje, które znajdują się na końcu stosu (czyli na początku łańcucha), aż napotka znak spacji.Tak więc ryba natychmiast wpada do
<
i musi skręcić w lewo. Następnie biegnie do:&:&
której kopiuje wartość na końcu stosu, umieszcza przestrzeń z rejestru na końcu stosu, kopiuje ją, a następnie umieszcza z powrotem na rejestrze.Następnie ryba uderza
=?!v ~
, a ściślej mówiąc,=
co wyrywa dwie ostatnie wartości (dwie, które właśnie utworzyliśmy) ze stosu, porównuje je, umieszcza 1 na końcu stosu, jeśli są równe, a 0 na koniec stosu, jeśli są różne.?
Wyskakuje nową wartość od końca stosu, jeśli jest 0 to nie wykonać następną instrukcję, która w tym przypadku jest!
, zamiast tego Wykonujev
, który nakazuje ryby, aby przenieść w dół (wyjście z funkcji).Jeśli jednak ma wartość 1, to znalazło miejsce, więc wykonuje
!
trampolinę, co powoduje, że ryba pomija następną instrukcję, czyli av
, więc ryba kontynuuje. Przed rybą widzi,~
co mówi mu, aby zrzuciła ostatnią wartość ze stosu (potwierdzoną spacją), a następnie ryba kontynuuje i ponownie uruchamia funkcję.Ryba natychmiast przepływa przez a
>
, a następnie wypuszcza ostatnią postać na stosieo
(która, przy pierwszym uruchomieniu, jest pierwszą postaciąs
). Pobiera długość stosul
, umieszcza a2
na końcu stosu, a następnie-
powoduje odjęcie 2l
. Uderza,?!;
co, pamiętając o tym, co?
powoduje, powoduje, że ryba przeskakuje,!
jeśli stos jest pusty, i ląduje;
, co kończy program.Następnie, jeśli na stosie nadal znajdują się postacie, wykonujemy polecenie,
!
które powoduje, że ryba odbija się od niego;
i wykonujemya6.
, który przechowujea
(AKA10
), a6
na końcu stosu, któregox, y
współrzędne są współrzędne.
, co wyskakuje z końca stos, następnie teleportuje rybę10, 6
i wykonuje instrukcje po prawej stronie tej pozycji (gdy ryba płynie w prawo).Jest to mniej skomplikowane, niż się wydaje, gdy uświadomisz sobie, że
y
pozycja 6 to linia poniżej tego.x
pozycja 10 jest wtedyv
, a po jej prawej stronie, co jest opcją. Powoduje to, że ryba dalej pływa w prawo i faktycznie zaczyna wykonywanie na początku linii ...
Jest to funkcja, która dodaje losowy tekst między znakami. To trochę kęs, ale tylko dlatego, że starałem się, aby było trochę bardziej losowe. Nazwijmy to genRandomChars .
W
:{{:}l1-[rv
rzeczywistości jest to konfiguracja funkcji, a tym bardziej część samej funkcji. Ryba najpierw przepływa, nad:{{
którą kopiuje wartość na końcu stosu, a następnie dwukrotnie przesuwa ją w lewo. Jeśli przypomnisz sobie, żei
było to w pozycji 1 na stosie, to wieszi
teraz jest na końcu stosu.Ryba następnie przepływa przez
:}
które kopiei
i przesuwa stos w prawo, umieszczająci
zarówno na początku, jak i na końcu stosu.l1-[
ryba umieszcza długość na końcu stosu, odejmuje 1 od niego, a następnie[
tworzy nowy stos, przenosząc wartościl-1
(długość stosu minus 1) na nowy stos (pozostawiając tylkoi
stary stos). Następnie ryba po prostu uderza,rv
co ponownie odwraca stos (myślę, że utworzenie nowego stosu odwraca go z jakiegoś powodu), i każe rybom ponownie opłynąć w dół, naprawdę rozpoczynając funkcję na<
poniżej.Tak więc obecnie koniec stosu ma
m
nasz tymczasowyi
, który nazwiemyti
. Ryba natychmiast przepływa1-}
, co odejmuje 1ti
i przenosi ją na początek stosu. Następnie,:}
który po prostu kopiujem
i przenosi go na początek stosu (umieszczenieti
w pozycji stosu 1).Właśnie wtedy uderzamy w tę małą rzecz:
To jest naprawdę bardzo proste.
!
Powoduje ryby do pominąć|
i wykonaniax
. Pamiętając, cox
robi, pamiętamy, że powoduje to, że ryba porusza się w 4 dowolnych kierunkach.|
jest po prostu lustrem i powoduje, że ryba wraca dox
. Zasadniczo ryba umieści 1, 2 lub 3 na końcu stosu i będzie kontynuować ruch w lewo, owijając się wokół.Ryba następnie wykonuje,
*+o
co powoduje, że ostatnie dwie wartości na stosie są usuwane, mnożone razem, a wynik przesuwa się z powrotem, potem to samo z dodawaniem, a następnie końcowa wartość jest usuwana ze stosu i generowana za pomocąo
. Nasz stos jest teraz stosunkowo znowu normalny zawierający tylko [m
,ti
,s
].:}}:
powodujes
skopiowanie wartości na końcu stosu (zasadniczo pozycja 0), następnie stos jest dwukrotnie przesuwany w prawo (ti
ponowne umieszczanie na przodzie), a następnieti
kopiowany.?!v
do tej pory powinno być dość łatwe do zrozumienia. Zasadniczo, jeśliti
wynosi 0, to wychodzimy z funkcji za pomocąv
, w przeciwnym razie wykonujemy!
i pomijamyv
(wykonując kolejną pętlę).Jeśli
ti
ma wartość 0 i skończyliśmy wyprowadzać nieco losowe znaki, wówczas wykonujemyv
i widzimy:Nic nadzwyczajnego. Usuwamy
ti
ze stosu za pośrednictwem~
. Następnie]
jest nowy, usuwa wszystkie nasze wartości ze stosu i umieszcza je na starym stosie! Z powodu problemu odwracania odwrócić sięr
, a następnie przesunąć stos prawo dwukrotnie}}~
, shufting stos do prawej strony, przedstawiając nam [m
,i
,s
], sygnał~
jest usunięcie Extra kopiowanes[0]
z wcześniej funkcji jak my potrzebujemy go, jeśli robiliśmy pętlę (ale nie, wychodzimy).v
każe rybom płynąć w dół i do>34.
(odwrócony, aby pokazać kolejność wykonywania), co oznacza, że ryba po prostu płynie w lewo i do3, 4
(bo.
to skok!).3, 4
jest właściwie na samym początkuwhitespaceTrimmer
, co jest idealne, ponieważ podróżujemy w lewo.Postępując zgodnie z tą logiką, możemy podążać za rybą, aż stos będzie ostatecznie pusty i program zakończy się zaraz po
whitespaceTrimmer
wykonaniu.źródło
Perl 5, 81 bajtów
Mam nadzieję, że poniższe informacje pomogą ci zrozumieć, co robi liniowiec:
źródło
Clojure,
126123118122117 bajtówMapuje wiadomość, wstawia losowe znaki, a następnie konkatenuje wynik.
Instrukcje sugerują, że należy usunąć wszystkie spacje z ciągu wynikowego. Jeśli mają zostać usunięte tylko spacje z oryginalnej wiadomości, mogę to zmienić.
Nie golfowany:
źródło
Python 3, 127 bajtów
Prawdopodobnie znacznie dłużej niż to konieczne, ale do tej pory jest to moja gra w golfa.
źródło
PHP, 96 bajtów
Pobiera Ciąg jako argument 1, a Liczba jako argument 2
Wypróbuj online
źródło
Python 3, 133 bajtów
źródło
Node.js, 88 bajtów
Przykładowe wyniki:
Wypróbuj online!
źródło
C,
102100 bajtów-2 bajty do pominięcia
continue
.Nie golfowany:
Stosowanie:
źródło