Wyzwanie
Biorąc niepusty ciąg S o długości L , składające się wyłącznie z drukowanych znaków ASCII, wyjście drugiego łańcucha o długości L , który składa się w całości z drukowanych znaków ASCII, ale nie jest równa S .
Do celów tego wyzwania znak ASCII do wydruku to jeden między U + 0020 i U + 007E włącznie; to znaczy od
(spacja) do ~
(tylda). Nowe linie i karty nie są uwzględnione.
Na przykład "abcde"
niektóre prawidłowe dane wyjściowe mogą być:
"11111"
"abcdf"
"edcba"
Ale byłyby one nieprawidłowe:
"abcde"
"bcde"
"abcde0"
Przypadki testowe
"asdf"
"1111"
" "
"~~~~~"
"abcba"
"1"
" "
"~"
" ~"
"~ "
" 0"
"!@#$%^&*()ABCDEFGhijklmnop1234567890"
" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
Zasady
- Możesz założyć, że dane wejściowe składają się wyłącznie z drukowalnych znaków ASCII.
- Nie można zakładać, że dane wejściowe nie zawierają wszystkich 95 znaków do wydrukowania.
- Możesz założyć, że dane wejściowe zawierają co najmniej jeden znak i mają mniej niż 256 znaków.
- Dane wyjściowe muszą również składać się wyłącznie z drukowalnych znaków ASCII. Nie można na przykład wyprowadzić bajtu \ x7F do wprowadzenia
"~"
. - Wyjście musi być inne niż wejście z prawdopodobieństwem 1; to znaczy, możesz generować losowe ciągi, dopóki jeden nie będzie inny niż wejście, ale nie możesz po prostu wyprowadzić L losowych znaków i mieć nadzieję, że będzie inny.
- Nowe linie są niedozwolone w danych wyjściowych, ale możesz wypisać jedną nową linię, która nie jest liczona do ciągu.
Punktacja
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach w każdym języku.
Odpowiedzi:
Python 2 , 21 bajtów
Wypróbuj online!
Pobiera reprezentację ciągu wejściowego i obcina go do długości ciągu wejściowego. W przypadku typowego ciągu umieszcza to w
'
cudzysłowie i kroi na końcu:Zauważ, że nowy ciąg zaczyna się od
'
. Pokażmy, że wyjście zawsze różni się od wejścia.Jeśli wejście nie ma
'
, to wyjście zaczyna się od,'
a wejście nie.Jeśli dane wejściowe zawierają
'
a, ale nie"
, Python użyje"
zewnętrznych cytatów, dając pierwszy znak,"
którego nie ma w ciągu wejściowym.Jeśli dane wejściowe zawierają jedno
'
i drugie"
, wówczas cudzysłowy zewnętrzne są,'
a każdy'
jest poprzedzany znakiem ucieczki\'
. Ilekroć pierwszy"
pojawia się na wejściu, jest przesuwany w prawo przez inicjał'
w wyjściu i wszelkie możliwe znaki ucieczki. Oznacza to, że nie może się równać z"
odpowiednią pozycją na wyjściu.Na koniec zauważ, że zacytowanie danych wejściowych i ewentualnie znaków ucieczki zawsze zwiększa liczbę znaków, więc obcięcie wyniku powoduje, że ma on tę samą długość co dane wejściowe.
Zauważ, że kluczowe znaczenie miało adaptacyjne przełączenie Pythona
"
w drugim przypadku. Jeśli tego nie zrobi, nie powiedzie się przy wprowadzaniu trzech znaków'\'
. Lub dowolny dłuższy prefiks ciągu pokazu poprawek za pomocą'
. Ta metoda nie będzie działać w przypadku większości języków.źródło
len(s)
zamiast-2
?'
oraz"
więcej niż 2 znaki zostaną dodane, ponieważ cudzysłowy muszą być poprzedzone znakami ucieczki.[2:]
zamiast[:len(s)]
zejść do 16 znaków.05AB1E , 3 bajty
Wypróbuj online!
źródło
JavaScript (ES6),
3733362926182119 bajtówWypróbuj online!
-4 bajty dzięki ETHProductions
-7 + -5 + -2 bajtów dzięki CalculatorFeline
-3 bajty dzięki Rickowi Hitchcockowi
Przenosi pierwszy znak na koniec i ustawia go na 0, jeśli jest liczbowy i niezerowy, a 1 w przeciwnym razie.
Wyjaśnienie
Dowód
Ponieważ drugi znak staje się pierwszym, trzeci znak staje się drugim itd., Wszystkie znaki muszą być identyczne. Ostatni pozostały znak może być tylko 0 lub 1, więc powtarzany znak musiałby być albo 0 albo 1. Ale dowolny ciąg 0s daje 1 na końcu i odwrotnie; dlatego niemożliwe jest utworzenie danych wejściowych równych ich wynikom. -ETHProdukty
Zobacz zmiany poprzednich wersji i objaśnień.
źródło
Galaretka , 3 bajty
Dane wyjściowe to ciąg cyfr, przecinków i znaków łącznika minus, których pierwszy znak będzie się różnić od pierwszego znaku ciągu wejściowego.
Wypróbuj online!
Jak to działa
źródło
Haskell , 20 bajtów
Wypróbuj online!
Konwertuje na ciąg
F
iT
. Liczy się to, że postacieF
iT
konwertowane na siebie nawzajem. Odbywa się to poprzez sprawdzenie, czy znak jest mniejszy niżM
do uzyskania,True
lubFalse
następnie wzięcie pierwszego znaku reprezentacji ciągu.Haskell , 23 bajty
Wypróbuj online
Zastępuje każdą postać, z
~
wyjątkiem, że~
staje się spacją.źródło
q '~'
? Dlaczego nie można go usunąć?'
na znak w identyfikatorach, więcq'~'=' '
zostanie przeanalizowany jakoq' ~ '=' '
(zgłoszenie błędu leksykalnego, ponieważ ostatni'
nie ma sobie równych.)Biała spacja, 59 bajtów
Widoczna reprezentacja
Co to robi:
Dla każdego czytanego znaku drukuje spację, z wyjątkiem gdy jest to spacja, a następnie drukuje @.
Demontaż:
źródło
SSSTSSSSSN (push 32)
sięSSSTSSTN (push 9)
iTSSS (add)
doTSSN (multiply)
. Wydrukuje zakładkę dla każdego znaku o wartości Unicode powyżej 9 orazQ
(9 * 9 = 81) dla każdego znaku o wartości Unicode równej0..9
. Wypróbuj online bezMATL ,
65 bajtówWypróbuj online!
Wyjaśnienie
źródło
l'0f=
(jeśli robi to, co myślę, że robi)Haskell , 19 bajtów
Anonimowa funkcja, która przyjmuje i zwraca a
String
. Użyj jako(map$(!!1).show.succ) "1111"
.Wypróbuj online! (Korzystanie z wiązki testowej @ xnor.)
'
cytacie początkowym .&
i~
, które zamiast tego\
, ponieważ ich następcy'
i\DEL
uciekają w literackich postaciach.źródło
head
można go użyć zamiast(!!1)
dodatkowego bajtuhead
to(!!0)
nie(!!1)
. Zawiodłoby to na postaci'
.05AB1E , 5 bajtów
Wypróbuj online!
Wyjaśnienie
Zamienia każdy znak na następny znak do wydruku ascii, owijając od tyldy do spacji.
źródło
V , 7 bajtów
Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe!
Jak to działa?
Rozważ wszystkie ciągi znaków składające się z drukowalnego ASCII. Każdy ciąg musi albo 1) zawierać znaki alfabetu lub 2) nie zawierać znaków alfabetu.
Tak więc ten program działa, najpierw konwertując jeden znak niealfabetyczny na
'a'
, a następnie wykonując ROT13 na ciągu wejściowym.źródło
9
sama, a zwiększanie powoduje dodanie kolejnego znaku do łańcuchaC (gcc) , 22 bajty
Pobiera wskaźnik łańcucha i modyfikuje pierwszy znak.
Wypróbuj online!
źródło
*s=159-*s
. Zawsze zmienia ostatni bit, dlatego nigdy nie nadaje tej samej postaci. Należy pamiętać, że159 = ' ' + '~'
~
zły kod znaku .C (gcc) , 20 bajtów
Zobaczył odpowiedź Dennisa, pomyślał o niezbędnej 2-bajtowej poprawie.
Wypróbuj online! (Stopka Dennisa).
Podobnie jak oryginał, modyfikuje pierwszy znak łańcucha w miejscu, ale xorsuje go, dzieląc wartość przez 3 (najmniejsza liczba, która działa. 2 zawodzi na pojedynczym znaku,
'U'
który daje 127, nie można go wydrukować).źródło
Python 2 , 25 bajtów
Wypróbuj online!
Anders Kaseorg uratował bajt, wyodrębniając pierwszą postać z
True
lubFalse
.źródło
'?'
na dwucyfrowy kod znaków, ale Python nie jest jednym z tych języków, w których możesz to zrobić :(lambda s:`+(s<'1')`+s[1:]
lublambda s:`s<'T'`[0]+s[1:]
Haskell,
3026 bajtówWypróbuj online!
Zastępuje każdy znak swoim poprzednikiem, a spacja tyldy.
źródło
Oktawa ,
1918 bajtówWypróbuj online!
Wyjaśnienie:
źródło
CJam , 5 bajtów
Wypróbuj online!
Konwertuje ostatni znak na jego punkt kodowy i przyjmuje ten moduł 10. Jest to wyraźnie różne w przypadku znaków innych niż cyfry na ostatniej pozycji. Ale cyfry zaczynają się w punkcie kodowym 48, więc przyjęcie tych modów 10 spowoduje ich cykliczne przesunięcie w lewo, a zatem ostatni znak jest zawsze zmieniany.
źródło
Siatkówka ,
106 bajtów4 bajty w golfa dzięki @Neil
Wypróbuj online!
To transliteruje
do
~
,!
do,
"
do!
, ...,~
do}
.źródło
Japt , 4 bajty
Wypróbuj online!
Wyjaśnienie:
źródło
Cubix , 10 bajtów
Wypróbuj online! lub Zobacz, jak działa!
Dla każdego znaku wypisuje,
1
jeśli znak ma parzysty punkt kodowy, w2
przeciwnym razie;1
ma nieparzysty punkt kodowy i2
parzysty, więc wynik nigdy nie będzie równy wejściu.Wyjaśnienie
Ten kod odpowiada następującej kostce netto:
IP (wskaźnik instrukcji) zaczyna się w lewym górnym rogu skrajnie lewej twarzy, kierując się na wschód. Postępuje zgodnie z tą serią instrukcji:
źródło
Alice , 9 bajtów
Wypróbuj online!
Wyjaśnienie
Pomysł zaczerpnięto z przesłania Martina Endera do CJam. Pierwszy znak jest traktowany jako punkt kodowy, zredukowany mod 10 i przenoszony na koniec wyniku. Ponieważ zmieniono dokładnie jeden znak, permutacja znaków nie może spowodować odzyskania tego samego łańcucha.
źródło
t
mod 10 jest naprawdę sprytne, miłe. :)Pushy , 1 bajt
Wypróbuj online!
Konwertuje podany ciąg znaków na listę kodów znaków ASCII, indeksuje je (indeksowanie modułowe) na wielkie litery, a następnie drukuje wynik. Zasadniczo każda postać
n
jest przypisana do mapychr(ord(n) % 26 + 65)
. Możesz użyć tego programu, aby zobaczyć, jak działa mapowanie.Wyjście:
n
, żechr(ord(n) % 26 + 65) == n
aby było to prawdą, musi istnieć liczba całkowitax
taka26x = 65
, dla której nie ma rozwiązania.1 bajt
Wypróbuj online!
Ta odpowiedź jest dokładnie taka sama, z tym wyjątkiem, że odwzorowuje na małe litery, a nie na duże litery. To jest nadal ważna, gdyż nie ma możliwości wejścia charakter
n
taki, żechr(ord(n) % 26 + 97) == n
.źródło
Brain-Flak , 53 bajty
Obejmuje +1 dla
-c
Spowoduje to zmniejszenie pierwszego znaku, chyba że jest to spacja, w takim przypadku zwiększy pierwszy znak.
Wypróbuj online!
źródło
Galaretka , 4 bajty
Wysyła ciąg cyfr. Żaden znak wyjściowy nie będzie równy odpowiadającemu znakowi wejściowemu.
Wypróbuj online!
Jak to działa
źródło
Bash + coreutils, 13
Transliteruje znaki
na
~
(0x20 - 0x7e) za pomocą~
, a następniena
}
(0x7e, 0x20 - 0x7d).Wypróbuj online .
źródło
PHP,
3027Zmienia każdy znak równy pierwszemu znakowi z char, który ma najmniej znaczący odwrócony bit.
źródło
~
działa , generuje1
.!$a
czy~$a
działa?!$a
zamieniają się"12"
w,"12"
ponieważfalse
są konwertowane na pusty ciąg, dzięki czemu nic nie jest zamieniane i~$a
wszystko zamienia się w niedrukowalne, ponieważ~"12"
najpierw nie konwertuje na int, ale dosłownie odwraca wszystkie bity w ciągu.Rubinowy , 20 + 1 = 21 bajtów
Używa
-p
flagi.Wypróbuj online!
Zamienia pierwszy znak na wejściu na „
0
if”1
lub w1
inny sposób.źródło
Brachylog , 9 bajtów
Wypróbuj online!
Wyjaśnienie
To zastępuje wszystkie znaki przez spację, z wyjątkiem spacji, które zastępuje
"0"
.źródło
PHP <7.1, 31 bajtów
Wypróbuj online!
źródło
A non-numeric value encountered
. I możesz użyć~
zamiasta&
.Golfscript, 3 bajty
Wypróbuj online!
Weź wartość ASCII ostatniego znaku modulo 5 i zastąp ostatni znak wynikiem. Działa to oczywiście dla znaków innych niż cyfry, ale jeśli ostatni znak jest cyfrą, również się zmienia („0” mod 5 = 3, „1” mod 5 = 4 itd.).
Działa to również z 7 lub 9, zachowując tę samą długość.
Też tak! Mam tutaj rozwiązanie Golfscript oraz najlepsze rozwiązania!
źródło
Funky ,
2622 bajtówOblicza,
~a
które w przypadku znaków innych niż cyfry zwrócą NaN. Następnie1&
ogranicza go do 0 lub 1, dla cyfry 0 będzie to1
i do1
tego będzie0
. Więc ten ciąg jest zawsze unikalny.Wypróbuj online!
źródło