Wprowadzenie:
Mam wiele różnych szyfrów przechowywanych w dokumencie, który kiedyś skompilowałem jako dziecko, wybrałem kilka z tych, które moim zdaniem najlepiej nadawały się na wyzwania (niezbyt trywialne i niezbyt trudne) i przekształciłem je w wyzwania. Większość z nich wciąż znajduje się w piaskownicy i nie jestem jeszcze pewien, czy opublikuję je wszystkie, czy tylko kilka. Ale oto pierwszy z nich.
Szyfr komputerowy zaszyfruje dany tekst w „losowe” grupy znaków danego length
. Jeśli taka grupa zawiera cyfrę, użyje tej cyfry do zaindeksowania własnej grupy dla zaszyfrowanego znaku. Jeśli w grupie nie ma żadnej cyfry, oznacza to, że użyto pierwszego znaku.
Załóżmy na przykład, że chcemy zaszyfrować tekst this is a computer cipher
o podanej długości 5
. Jest to potencjalny wynik (uwaga: liczby są indeksowane 1 w poniższym przykładzie):
t h i s i s a c o m p u t e r c i p h e r (without spaces of course, but added as clarification)
qu5dt hprit k3iqb osyw2 jii2o m5uzs akiwb hwpc4 eoo3j muxer z4lpc 4lsuw 2tsmp eirkr r3rsi b5nvc vid2o dmh5p hrptj oeh2l 4ngrv (without spaces of course, but added as clarification)
Weźmy kilka grup za przykłady, aby wyjaśnić, jak odszyfrować grupę:
qu5dt
: Ta grupa zawiera cyfrę5
, więc (1-indeksowane) 5 charakter tej grupy jest znak używany dla tekstu rozszyfrować:t
.hprit
: Ta grupa nie zawiera cyfry, więc pierwszy znak tej grupy jest używany w sposób dorozumiany do tekstu rozszyfrować:h
.osyw2
: Te grupy zawiera cyfrę2
, więc (1-indeksowane) 2. charakter tej grupy jest znak używany dla tekstu rozszyfrować:s
.
Wyzwanie:
Biorąc pod uwagę liczbę całkowitą length
i ciąg word_to_encipher
, wypisz losowy zaszyfrowany ciąg, jak opisano powyżej.
Musisz tylko wyszyfrować dane dane length
i word_to_encipher
, więc nie musisz również tworzyć programu / funkcji odszyfrowującej. Mogę jednak podjąć wyzwanie w ramach części 2 w celu odszyfrowania w przyszłości.
Zasady konkursu:
- Możesz założyć, że
length
będzie w zakresie[3,9]
. - Możesz założyć, że
word_to_encipher
będzie zawierać tylko litery. - Możesz użyć zarówno wielkich, jak i wielkich liter (podaj, którego użyłeś w odpowiedzi).
- Twoje dane wyjściowe, każda grupa i pozycje cyfr w grupie (jeśli są obecne) powinny być jednakowo losowe . Tak więc wszystkie losowe litery alfabetu mają taką samą szansę wystąpienia; pozycja zaszyfrowanej litery w każdej grupie ma taką samą szansę wystąpienia; a pozycja cyfry ma taką samą szansę wystąpienia (z wyjątkiem sytuacji, gdy jest to pierwszy znak i nie ma żadnej cyfry; i oczywiście nie może znajdować się w tej samej pozycji co zaszyfrowany znak).
- Możesz także używać cyfr 0-indeksowanych zamiast 1-indeksowanych. Podaj, którego z dwóch użyłeś w swojej odpowiedzi.
- Cyfra
1
(lub0
indeksowana 0) nigdy nie będzie obecna na wyjściu. Dlategob1ndh
nie jest prawidłową grupą do szyfrowania znaku „b”. Jednakb4tbw
jest ważne, gdzie4
enciphersb
na 4. (1 indeksowane) pozycji, a pozostałe znakib
,t
,w
są przypadkowe (który zawiera przypadkowo takżeb
). Inne możliwe ważnych gruplength
5 do encipher znak „B”:abcd2
,ab2de
,babbk
,hue5b
, itd.
Główne zasady:
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania. - Do odpowiedzi mają zastosowanie standardowe reguły z domyślnymi regułami We / Wy , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i typem zwracanych, pełnych programów. Twoja decyzja.
- Domyślne luki są zabronione.
- Jeśli to możliwe, dodaj link z testem swojego kodu (tj. TIO ).
- Zalecane jest również dodanie wyjaśnienia do odpowiedzi.
Przypadki testowe:
Input:
Length: 5
Word to encipher: thisisacomputercipher
Possible output:
qu5dthpritk3iqbosyw2jii2om5uzsakiwbhwpc4eoo3jmuxerz4lpc4lsuw2tsmpeirkrr3rsib5nvcvid2odmh5phrptjoeh2l4ngrv
Input:
Length: 8
Word to encipher: test
Possible output:
ewetng4o6smptebyo6ontsrbtxten3qk
Input:
Length: 3
Word to encipher: three
Possible output:
tomv3h2rvege3le
abcd2
,ab2de
,babbk
wszystkie są takie same? Czy jest równieżb1akk
ważny?b1akk
odmowę. Zmodyfikuje to w opisie wyzwania, aby wyjaśnić. Jeśli pierwszy znak jest zaszyfrowany, cyfra nie powinna być obecna."a??"
ma 676 możliwych wyników, ale"1a?"
,"?a1"
,"2?a"
,"?2a"
, ma only104 wyników. Tak więc, jeśli próbuję wybrać jeden wynik z tych wszystkich 780 wyników, rozkład „pozycji zaszyfrowanej litery” wynosi 13: 1: 1, a nie 1: 1: 1. I uznałbym to za działanie „równomiernie losowe”.Odpowiedzi:
Pyth, 22 bajty
Wypróbuj online.
Używa małych i zerowania.
Wyjaśnienie
Bardzo prosty algorytm.
źródło
Perl 6 , 125 bajtów
Wypróbuj online!
Pobiera dane wejściowe i wyjściowe dużymi literami. Wymaga curry wejściowego, jak
f(n)(string)
. Używa 1 indeksowania.Wyjaśnienie:
źródło
Python 2 ,
187177176156154148 bajtówWypróbuj online!
Wykorzystuje wielkie litery i cyfry 0-indeksowane.
-3 bajty, dzięki Kevin Cruijssen
źródło
sample(R(l),2)[::1|-(random()<.5)]
znaczyrange(l)
i przetasowuje je. Ale najwyraźniej próbka nie gwarantuje porządku, więc nie jest potrzebna :)(j==i)*(n>0)
? Mnożenie ma pierwszeństwo operatora przed odejmowaniem, prawda?JavaScript (Node.js) , 135 bajtów
Wypróbuj online!
Dziękujemy Arnauldowi za 1B
źródło
R ,
134132123 bajtówWypróbuj online!
Przyjmuje wielkie litery.
Objaśnienie starego kodu (głównie tego samego podejścia):
źródło
Java (JDK) , 193 bajty
Wypróbuj online!
IntStream
(przeszedłString::chars
) jako danych wejściowych, a także liczby i zwraca innyIntStream
.double
doint
jest niepotrzebne z powodu+=
włamania.źródło
Japt , 29 bajtów
Wypróbuj online!
Zero indeksowane.
Wyjaśnienie:
źródło
C, 115 bajtów
Wypróbuj online!
0-indeksowane, małe litery.
Nieznacznie pozbawiony golfa i rozwinięty:
Kod powinien być dość prosty. Dwa losowe
i
,j
wygenerowane w jednymrand()
wywołaniu, są tak samo niezależne, ponieważ gcd (n
,~-n
) = 1 iRAND_MAX
jest duże.źródło
Czysty , 256 bajtów
Wypróbuj online!
Wybiera:
x
(pozycja postaci w segmencie)y
która nie jest równax
(pozycja cyfry w segmencie)x
ani różna,y
chyba żex
wynosi zeroźródło
JavaScript, 134 bajty
Wypróbuj online!
W odpowiedzi wybrano jednolicie zakodowany ciąg ze wszystkich możliwych zakodowanych ciągów. Dlatego bardziej możliwe jest, aby zakodowana litera była pierwsza.
źródło
C # (interaktywny kompilator Visual C #) , 171 bajtów
Wypróbuj online!
Wyjaśnienie...
źródło
Węgiel drzewny ,
3530 bajtówWypróbuj online! Link jest do pełnej wersji kodu. 0-indeksowane. Wyjaśnienie:
Wprowadź długość.
Wpisz słowo i zapętl znaki.
Wybierz losową pozycję rozszyfrowanej litery.
Wybierz inną losową pozycję cyfry, chyba że litera znajduje się w pozycji 0, w którym to przypadku umieść cyfrę również w pozycji 0.
Zapętlić raz dla każdego znaku wyjściowego i włączyć pozycję.
Jeśli jest to pozycja cyfry, wyślij pozycję rozszyfrowanej litery.
Ale jeśli jest to pozycja rozszyfrowanej litery, wyślij ją. Ma to pierwszeństwo przed pozycją cyfry, ponieważ węgiel zajmuje ostatni wpis, jeśli wiele skrzynek przełączników ma tę samą wartość.
W przeciwnym razie wypisz losową literę.
źródło
05AB1E , 26 bajtów
0-indeksowane.
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło