Zdefiniujemy nieparzysty / parzysty szyfr ASCII za pomocą poniższego pseudokodu:
Define 'neighbor' as the characters adjacent to the current letter in the string
If the one of the neighbors is out of bounds of the string, treat it as \0 or null
Take an input string
For each letter in the string, do
If the 0-based index of the current letter is even, then
Use the binary-or of the ASCII codes of both its neighbors
Else
If the ASCII code of the current letter is odd, then
Use the binary-or of itself plus the left neighbor
Else
Use the binary-or of itself plus the right neighbor
In all cases,
Convert the result back to ASCII and return it
If this would result in a code point 127 or greater to be converted, then
Instead return a space
Join the results of the For loop back into one string and output it
Na przykład dla danych wejściowych Hello
dane wyjściowe są emmol
, ponieważ
- W
H
zakręty na\0 | 'e'
których jeste
e
Okazuje się'e' | 'l'
, albo101 | 108
, co jest109
lubm
- Pierwszy
l
zmienia się również w101 | 108
lubm
- Drugi
l
zamienia się w108 | 111
, czyli111
lubo
o
Okazuje się108 | \0
, lubl
Wejście
- Zdanie złożone wyłącznie z drukowalnych znaków ASCII, w dowolnym odpowiednim formacie .
- W zdaniu mogą znajdować się kropki, spacje i inne znaki interpunkcyjne, ale zawsze będzie to tylko jedna linia.
- Zdanie będzie miało co najmniej trzy znaki.
Wynik
- Powstały szyfr, oparty na regułach opisanych powyżej, zwrócony jako ciąg lub wynik.
Zasady
- Dopuszczalny jest pełny program lub funkcja.
- Standardowe luki są zabronione.
- To jest golf golfowy, więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
Przykłady
Dane wejściowe w jednym wierszu, dane wyjściowe w następującym. Puste linie oddzielają przykłady.
Hello
emmol
Hello, World!
emmol, ww~ved
PPCG
PSWG
Programming Puzzles and Code Golf
r wogsmmoonpuu ~ meannncoooeggonl
abcdefghijklmnopqrstuvwxyz
bcfefgnijknmno~qrsvuvw~yzz
!abcdefghijklmnopqrstuvwxyz
aaccgeggoikkomoo qsswuww yy
Test 123 with odd characters. R@*SKA0z8d862
euutu133www|todddchizsscguwssr`jS{SK{z~|v66
o
zmianyl
w pierwszym przykładzie, jestem prawie pewien, że twoje specyfikacje zapewniają, że pierwszyo
nie zmieni sięl
w drugim przykładzie. Powinien zmienić się na'l' | ','
, cokolwiek to jest, prawda?'l' | ','
to108 | 44 --> 1101111 | 0101100
, co się staje108
, co jestl
.,
Dzieje się w kolejce zl
, więc nie ma zmiany, gdy binarnie lub odbywa.Odpowiedzi:
Galaretka ,
3331 bajtówProste podejście, które z pewnością można skrócić.
Wypróbuj online!
źródło
Perl,
6362 bajtówObejmuje +4 za
-lp
Podaj dane na STDIN
oddeven.pl
:Działa to tak, jak pokazano, ale aby uzyskać deklarowany wynik, należy go umieścić w pliku bez końcowej
;
i nowej linii, a\xhh
znaki zmiany znaczenia należy zastąpić ich literalnymi wartościami. Możesz to zrobić, umieszczając powyższy kod w pliku i uruchamiając:źródło
Python 2,
138131 bajtówWypróbuj online (zawiera wszystkie przypadki testowe)
Mniej golfa:
Wypróbuj online (bez golfa)
Dodałem
\x00
po obu stronach łańcucha, aby nie musiałem się tym martwić podczas bitowego oringowania. Pętlę wzdłuż oryginalnych znaków ciągu, wykonując operacje bitowe i dodając je do wyniku, zgodnie z regułami parzystości.źródło
|=
... odpowiednikiem w PowerShell byłby$a=$a-bor$b
a?b:c
lubił JS.C - 101 bajtów
Nie musimy nawet sprawdzać, czy jest to ostatni element w ciągu, ponieważ łańcuchy w C są zakończone zerem.
Wyjaśnienie
Raczej prosty:
Użyj & 1, aby sprawdzić, czy wyrażenia nieparzyste / parzyste oraz potrójne wyrażenia zastępują if / elses. Zwiększ wartość * p, aby zmniejszyć liczbę wymaganych nawiasów.
źródło
Mathematica, 152 bajty
Wyjaśnienie
Konwertuje ciąg znaków na kody ASCII
Dzieli kody ASCII na długość 3, przesunięcie 1 partycji, z dopełnianymi zerami.
Stosuje funkcję dla każdej partycji.
If...else if... else
w Mathematica .Sprawdza, czy indeks (# 2) jest nieparzysty. (
Max
służy do spłaszczania); ponieważ indeks Mathematica zaczyna się od 1, użyłemOddQ
tutaj, nieEvenQ
Pobiera kody ASCII lewego i prawego sąsiada.
Sprawdza, czy kod ASCII odpowiedniego znaku jest nieparzysty.
Pobiera kody ASCII znaku i lewego sąsiada.
Pobiera kody ASCII znaku i prawego sąsiada.
Stosuje lub działa.
Zamienia wszystkie liczby większe niż 126 na 32 (spacja).
Konwertuje kod ASCII z powrotem na znaki i dołącza do nich.
źródło
From/ToCharacterCode
funkcjach. Wtedy to wygląda jakDrop
puszki użycie notacji Infix:#~Drop~{2}
. I wygląda na to, że aplikujeszBitOr
na każdy możliwy wynik,Which
więc dlaczego nie zastosować go później i tylko raz?Ruby
133128108106 bajtówJordan pomógł mi zaoszczędzić 20 bajtów, a cia_rana pomógł mi zaoszczędzić 2 bajty :)
s
jest brany jako ciąg wejściowy.Przykładowe dane wyjściowe z
s="Test 123 with odd characters. R@*SKA0z8d862"
:Wyjaśnienie
Powyższy kod jest bardzo nieczytelny, więc oto wyjaśnienie. Kod jest trochę hacky, jestem całkiem nowy w Ruby, więc założę się, że jest to krótszy sposób :)
źródło
print
zamiastp
: p->s{p s[-i=-1]+s.bytes.each_cons(3).map{|x,y,z|i+=1;a=i%2>0?x|z :y%2>0?y|x :y|z;a>126?' ':a.chr}*""+s[-2]}
J, 42 bajty
Wykorzystuje właściwość, że czasowniki w J mogą być stosowane naprzemiennie przy użyciu gerunda
`
dla niektórych przysłówków, takich jak infix\
.Stosowanie
Wyjaśnienie
źródło
JavaScript (ES6),
125118114 bajtówŻenująco długa, ale
charCodeAt
iString.fromCharCode
sam jest 29 bajtów. : - /Jak to działa
Każdy znak na pozycji
i
jest tłumaczony następującą formułą, która obejmuje wszystkie zasady jednocześnie:gdzie
C(n)
zwraca kod ASCII n-tego znaku ciągu wejściowego.Próbny
źródło
PHP,
10797 bajtówprawdopodobnie gra w golfa.
źródło
C #, 145 bajtów
Pełny program z nieprzylepioną metodą i przypadkami testowymi:
To okazało się dłuższe niż myślałem ...
źródło