Zaimplementuj ten klucz szyfrujący
Cel
Użyj algorytmu (wyjaśnionego w sekcji Algorytm), aby zaimplementować określony szyfr.
Program musi odczytać dane wejściowe ze STDIN lub najbliższego dostępnego odpowiednika, użyć algorytmu do wygenerowania tekstu zaszyfrowanego i klucza.
Tekst zaszyfrowany i klucz zostaną zapisane w STDOUT lub najbliższym dostępnym odpowiedniku. Dowolny format jest dozwolony, o ile wyprowadza tekst zaszyfrowany i klucz.
Algorytm
Konwertuj znaki w ciągu na odpowiednie wartości ASCII. Na przykład:
Hello -> 72 101 108 108 111
Następnie musisz wygenerować klucz tak długi, jak ciąg z liczbami losowymi w zakresie 0–9.
Hello -> 62841
Dodaj liczby całkowite w losowej sekwencji liczb do wartości ASCII ciągu. W powyższych przykładach 72 zmieniłoby się na 78, a 101 na 104.
72 + 6 = 78, 101 + 2 = 103, 108 + 8 = 116, etc
Następnie przekonwertuj nowe wartości z powrotem na znaki. W powyższych przykładach tekst Hello
stał się Ngtpp
.
Przykłady
(Są to tylko przykłady tego, jak może wyglądać wydruk. Wyjście może i będzie się różnić).
Hello World
Lfrlu)_supg
41606984343
This will be encoded
Zhjs$~koo gj$iuhofgj
60104723305544750226
Zasady
- Możesz założyć, że dane wejściowe będą zawierać tylko znaki z zakresu az, AZ i spacji.
- Zgłoszenia muszą być pełnymi programami lub funkcjami.
- Zgłoszenia będą oceniane w bajtach.
- Standardowe luki są zabronione.
- To jest golf golfowy, więc wygrywa najkrótszy kod.
(To jedno z moich pierwszych wyzwań, jeśli coś jest nie tak, możesz mi powiedzieć, jak mogę to poprawić).
źródło
preferably with the format (ciphertext)\n(key).
„preferowane funkcje” i golf golfowy nie mieszają się zbyt dobrze. Powinieneś uczynić to obowiązkowym lub zezwolić na inne formaty wyjściowe. 3. Czy klucz musi być wydrukowany bez spacji? A co z wydrukowaniem go np. W formie listy[0, 5, 2, ...]
?Odpowiedzi:
Galaretka ,
129 bajtówWypróbuj online!
Jak to działa
źródło
Python 3, 130 bajtów
Dzięki @Rod za wskazanie błędu
Funkcja, która pobiera dane wejściowe za pomocą argumentu jako ciąg i wypisuje do STDOUT.
Jak to działa
Wypróbuj na Ideone
źródło
m=10**len(x);k=str(randint(m,m*10))[1:];
a nawet zapisujesz bajt w procesie c:randint
jest włącznie, co oznacza, że musisz to zrobićm*10-1
. Właśnie wymyśliłem sposób, aby to naprawić dla tej samej liczby bajtów.Pyth - 16 bajtów
Oczekiwanie na decyzję OP dotyczącą formatów wyjściowych.
Pakiet testowy .
źródło
Właściwie 17 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
CJam - 14 bajtów
Kiedy zobaczyłem matematykę ascii, wiedziałem, że muszę napisać odpowiedź CJam.
Wypróbuj online tutaj .
źródło
MATL, 13 bajtów
Dane wyjściowe wyglądają następująco:
Wypróbuj online!
Wyjaśnienie:
źródło
r
lubYr
PowerShell v2 +,
7977 bajtówPobiera dane wejściowe
$n
, zapętla każdą postać i pobieraRandom
element z0..9
każdej iteracji. Przechowuje te liczby (jako tablicę) w$x
. Ruruje tę tablicę do innej pętli. Każda iteracja pobiera bieżący element$_
, dodaje go do pozycyjnego znaku wyciętego z$n
(niejawne rzutowanie char-to-int), a następnie ponownie rzutuje jako[char]
. Pozostawia to w przygotowaniu. Jest to zamknięte w parens i zmontowane-join
razem, tworząc słowo. Zostało to w przygotowaniu. Ponadto numer$x
jest również-join
edytowany razem i pozostawiony w potoku. Są one domyślnie drukowane zWrite-Output
końcem wykonania, co powoduje, że domyślnie są drukowane z nową linią.Przykład
źródło
C #,
252247245232216 bajtówRozmiar jest dość zły w porównaniu do innych rozwiązań, ale jednak ...
To jest moja druga odpowiedź na codegolf i jestem całkiem początkującym, biorąc pod uwagę C #, więc chętnie usłyszę, jak to skrócić :)
Nie golfowany:
static
z klasy pźródło
b++<i.Count()
i pozostawić trzecią klauzulę pustą? Również nie sądzę, trzeba końcowego znaku nowej linii, więc ostatni dzwonek, abyWriteLine
mógł byćWrite
zamiast.var
. tzn.var c=
zamiaststring c=
ogolić kilka bajtów.Console.ReadLine()
jako ciągu?i.Length
jest krótszy niżi.Count()
, nie potrzebujesz System.Linq. ciąg ma indeksatora znaków. Również tworzenie nowych obiektów losowe w pętli jest mniej bajtów:new Random().Next(10)
.CJam, 11 bajtów
Wypróbuj online!
Jak to działa
źródło
05AB1E ,
1817 bajtówWyjaśnienie
Wypróbuj online
źródło
Python 3, 112 bajtów
c to funkcja, która zwraca zaszyfrowany tekst i klucz
Oto kod, który robi to samo i jest nieco bardziej czytelny
Wynik:
źródło
PHP,
638682 bajtówEdycja: zapomniałem wydrukować klucz ...
Dzięki Alex Howansky za uratowanie mnie 4 bajtów.
Dane wejściowe są przekazywane za pomocą argumentu wiersza poleceń. Bierze każdy znak w ciągu i dodaje losową liczbę całkowitą od 0 do 9 do kodu ASCII, a następnie konwertuje kod z powrotem na ASCII. Każda liczba losowa jest dołączana do
$s
, która jest drukowana na końcu.źródło
$s.=$r
po drugiej połowie w pętli for, oszczędzając bajt, ponieważ możesz zrzucić jego końcowe pół. Wtedy twoja pętla będzie tylko jedną instrukcją, więc możesz wyciąć nawiasy klamrowe, oszczędzając 2 dodatkowe bajty. Na koniec możesz umieścić$s
wewnątrz cytowanego ciągu, oszczędzając.
operatorowi jeszcze jeden bajt. :)J, 32 bajty
odpowiednik python:
źródło
Perl, 34 bajty
Obejmuje +1 dla
-p
źródło
Perl, 65 bajtów
Chwilę zajęło mi wymyślenie, jak uzyskać dane wejściowe bez nowej linii na końcu. Przyjmuje to jako argument linii poleceń
źródło
$;
nie zaczynają się puste, więc drukuje starą treść, a rand nigdy nie może wygenerować 9. Są łatwe do naprawienia, a użycie STDIN<>=~/./g
. I nie,int
w perlu obcina się do 0, to nie zaokrągla.perl -wle 'print int 8.6'
wyniki8
Python 2,
8499 bajtówWykorzystuje
id()
wartość ciągu do generowania liczb losowych.Spróbuj
źródło
map(chr,[ord(a)+int(b)for a,b in zip(x,y)])
namap(lambda x,y:chr(ord(x)+int(y)),x,y)
? to powinno coś uratowaćSenva , 74 bajty
Oto najkrótszy program, jaki stworzyłem:
Małe wyjaśnienie? (Uwaga: BM oznacza pamięć wsteczną ):
To wydaje się teraz większe, prawda: p? Być może można zoptymalizować ten kod, ale na razie jest to najkrótszy czas, jaki znalazłem.
źródło
C #, 174 bajtów
Nie golfowany:
Naprawdę całkiem proste.
źródło
Perl 6: 55 lub 70 bajtów
Jako anonimowa funkcja, która pobiera parametr ciągu i zwraca listę dwóch ciągów (54 znaków, 55 bajtów) :
Jako program, który czyta ze STDIN i zapisuje do STDOUT (69 znaków, 70 bajtów) :
źródło