Myślę, że nie ma tu wystarczająco łatwych pytań, na które mogliby spróbować początkujący!
Wyzwanie: Biorąc pod uwagę losowy ciąg wejściowy 1 i 0 takich jak:
10101110101010010100010001010110101001010
Napisz najkrótszy kod, który wypisuje bitową odwrotność w następujący sposób:
01010001010101101011101110101001010110101
=&'0'
działa dla tej samej liczby bajtów.GolfScript , 5 bajtów
Wypróbuj online.
Jak to działa
GolfScript odczytuje całe dane wejściowe ze STDIN i umieszcza je na stosie jako ciąg.
{}%
przechodzi przez wszystkie znaki w ciągu i wykonuje blok kodu dla wszystkich z nich.1^
oblicza wyłączną OR dla znaków ASCII z 1. „0” odpowiada kodowi ASCII 48, „1” oznacza kod ASCII 49.Od
48 ^ 1 = 49
i49 ^ 1 = 48
, to zmienia 0 na 1, a 1 na 0.Po zakończeniu GolfScript drukuje zmodyfikowany ciąg.
źródło
CJam - 4
Ta xor to każda postać z 1.
W przeciwieństwie do innych odpowiedzi CJam, nie zakładam, że dane wejściowe są już na stosie.
Wypróbuj na http://cjam.aditsu.net/
źródło
f
.kod maszynowy x86 w systemie DOS -
141311 bajtówCóż, znowu się skróciło! Po napisaniu rozwiązania niepowiązanego wyzwania zauważyłem, że tę samą sztuczkę można zastosować nawet tutaj. Więc zaczynamy:
Skomentowany montaż:
Poprzednie rozwiązanie - 13 bajtów
Myślę, że nie jest dużo krótszy niż to.Tak się stało! Dzięki @ninjalj za wygolenie jeszcze jednego bajtu.Ta wersja oferuje zaawansowaną interaktywność ™ - po uruchomieniu z wiersza poleceń wyrzuca „odwrócone” znaki, o ile piszesz cyfry wejściowe (które nie są powtarzane); aby wyjść, po prostu wykonaj Ctrl + C.
W przeciwieństwie do poprzedniego rozwiązania ma to pewne problemy z uruchomieniem w DosBox - ponieważ DosBox nie obsługuje poprawnie Ctrl-C , musisz zamknąć okno DosBox, jeśli chcesz wyjść. Zamiast tego działa na maszynie wirtualnej z systemem DOS 6.0 zgodnie z przeznaczeniem.
Źródło NASM:
Stare rozwiązanie -
272522 bajtyTo zaakceptowało dane wejściowe z wiersza poleceń; działa płynnie jako plik .COM w DosBox.
Wejście NASM:
źródło
xchg dx,ax
jest o 1 bajt krótszy niżmov dl,al
Bash + coreutils, 8 bajtów
Pobiera dane wejściowe ze STDIN.
Lub
sed, 8 bajtów
źródło
y 01 10
tr
...CJam , 4 bajty
Zakłada, że oryginalny ciąg znaków znajduje się już na stosie. Wyświetla zmodyfikowany ciąg.
Wypróbuj online , wklejając następujący kod :
Jak to działa
:~
ocenia każdy znak ciągu, tzn. zastępuje znak 0 liczbą całkowitą 0.:!
oblicza logiczne NIE dla każdej liczby całkowitej. To zmienia 0 na 1, a 1 na 0.źródło
Brainfuck (
7071)Wyjaśnienie:
źródło
a
na11
.PHP - 19 bajtów
Tak, chyba niezbyt oryginalne!
źródło
Pancake Stack , 532 bajty
Zakłada, że wejście jest zakończone znakiem zerowym. Strategia jest następująca:
1
od niego wartość ascii .0
(dając a1
gdybyśmy mieli0
lub a0
gdybyśmy mieli1
)0
do niegoźródło
C: 29
Wypróbuj online tutaj .
Dzięki za wskazanie sztuczki XOR, Dennis.
źródło
i(char*s){while(*s)*s++^=1;}
while
zfor
wynikami jeszcze o długości 28 znaków.Python 2.7 - 34 *
Och, jak bardzo ten pierwszy jest do bani. Całkiem brzydka, ta jest. 63 znaki.
Ten jest nieco lepszy, ale nadal nie jest tak fantazyjny. 44 znaki.
Ponieważ
int(x) and 1
zwraca,int(x)
jeśli nie jest to 0, a inaczej False. Rozwiązanie można dodatkowo zredukować do 36 znaków.Ponieważ
join()
pobiera generator, wsporniki można usunąć. 32 znaki.Zamiast tego można zastosować backtyki
str()
Zmniejszono do 44 z 34 dzięki wskaźnikom z @TheRare
Znalezienie uzupełnienia jest trudne w Pythonie, ponieważ
bin(-int)
zwraca -0bxxx stąd powyższe.źródło
(int(x) and 1) == int(x)
'' == False
i'hi' == True
''.join(`1-int(x)`for x in'')
repr(x)
dla x <maks. Jest równastr(x)
Perl, 9 znaków
Dziewiąty znak to flaga „p”
Stosowanie:
źródło
y/10/01/
ale o jeden znak krótszy, ponieważ nie wymaga żadnych flagJavaScript ( ES6 ) 36
źródło
s
, żes.replace(/./g,x=>x^1)
są 22 znaki.p=prompt(p().replace(/./g,x=>x^1))
(p=prompt)(p().replace(/./g,x=>x^1))
i to jest tej samej długości.Labirynt , 6 bajtów
(Labirynt jest nowszy od tego wyzwania, więc ta odpowiedź nie konkuruje - nie dlatego, że i tak wygrywa ...)
Ten kod zakłada, że STDIN zawiera tylko cyfry (w szczególności brak znaku nowej linii).
Wskaźnik instrukcji (IP) zaczyna się w lewym górnym rogu, w prawo. Podczas gdy istnieją cyfry do odczytania, będzie on przechodził w ciasną pętlę przez lewy blok 2x2:
1
naciśnij 1,,
przeczytaj cyfrę,$
XOR z 1, aby przełączyć ostatni bit,.
wydrukuj wynik. IP bierze tę pętlę, ponieważ górna część stosu jest dodatnia po XOR, tak że skręci w prawo. Gdy trafimy EOF, zamiast tego,
wraca-1
. Wtedy XOR ustąpi,-2
a przy tej wartości ujemnej IP skręci w lewo na@
i program się zakończy.To rozwiązanie powinno być optymalne dla Labiryntu: potrzebujesz
,
i.
dla pętli we / wy i@
do zakończenia programu. Potrzebujesz co najmniej dwóch znaków (tutaj1
i$
), aby przełączyć ostatni bit. I potrzebujesz przynajmniej jednej nowej linii dla pętli, która może zostać zakończona.Chyba że ... jeśli zignorujemy STDERR, tzn. Zezwolimy na zakończenie z błędem, możemy zapisać plik
@
i nie potrzebujemy żadnego sposobu przełączania się między dwiema ścieżkami. Po prostu czytamy i drukujemy, dopóki przypadkowo nie spróbujemy wydrukować wartości ujemnej (the-2
). Pozwala to na co najmniej dwa rozwiązania 5-bajtowe:źródło
Rubin: 23
źródło
Kod maszynowy Turinga, 32 bajty (1 stan - 3 kolory)
Korzystanie ze składni tabeli reguł wymaganej przez ten internetowy symulator TM. Zapożyczony z postu napisanego na blogu użytkownika Wiki Googology kilka miesięcy temu.
Możesz to również przetestować za pomocą tej implementacji Java.
źródło
Python 2.x - 44 bajty
Po co go komplikować lub używać niektórych oszukańczych zmiennych?
źródło
print''.join('1-int(x)'for x in'input()')
. Nie mogłem uzyskać tylnych zwrotów w kodzie komentarza, więc zastąpiłem je znakiem „.`a\`b`
->a`b
.R, 27 znaków
Stosowanie:
źródło
APL (Dyalog Unicode) , 7 bajtów SBCS
Pełny program Monituje standardowe wejście.
Wypróbuj online!
⍞
natychmiastowe standardowe⍎¨
wykonać każdą postać~
logiczne NIE⍕¨
sformatuj każdy znak jako tekst∊
ε nlist (spłaszczenie)źródło
PHP> 5,4 - 37 znaków
$s
jest wejściemTry it online
źródło
<kbd>
tagu.TI-BASIC, 7 bajtów
Jest to funkcja, która pobiera ciąg binarny (przez
Ans
) jako dane wejściowe i zwraca dane wyjściowe jako ciąg odwrócony (nie odwrócony), jak określono. Aby uzyskać więcej pomocy, możesz przeczytać listę aplikacji przeznot(
na wiki TI-BASIC. Używam skompilowanej wersji, ponieważ jest mniejsza:W hex:
Wyjaśnienie
»*r
- Weź wejście funkcji jako ciąg znaków i przekonwertuj na listę>
- Prześlij listę do kolejnych operatorówÕ¸r
- Zwraca odwrotność listyźródło
»*r>Õ¸r
?expr(Ans:Returnnot(Ans
; 2. Ponieważ ciąg nie jest oddzielony przecinkami i nie zaczyna się od a{
, będzie ewaluowany do liczby całkowitej takiej jak 1000010011, a nie listy; 3.Return
nie działa tak, jak to napisałeś; 4. Daje to wynik jako listę, a nie ciąg.Haskell, 22 bajty
Byłem zaskoczony brakiem rozwiązań Haskell do tego wyzwania, więc oto jedno. Zwraca wartość do funkcji, która pobiera ciąg znaków i zwraca jego odwrotność.
Wyjaśnienie
Nic szczególnego tutaj.
źródło
Befunge 93, 25 bajtów
Zakładając, że pusty stos i EOF zarówno czytają -1.
0
wypycha \ 0 jako terminator zerowy>~1+:#v_
jest pętlą wejściową, odczytuje ascii, dodaje 1, sprawdza EOF + 1 = 0,^ -1<
w przeciwnym razie odejmuje 1 i pozostawia wypchniętą wartość ascii na stosie.$>:#,_@
upuszcza dodatkową kopię zera na stos, a następnie drukuje ciąg binarny od góry do dołuJeśli pusty stos ma wartość 0, zapisz 2 bajty za pomocą
Możliwe jest wykonanie około 15 bajtów przy użyciu tego samego algorytmu, jeśli EOF = 0, ale nie mam takiej implementacji przydatnej do przetestowania.
źródło
JavaScript ES6, 26 znaków
źródło
Befunge-98 (PyFunge) , 7 bajtów
Dla każdego znaku
c
na wejściu wypisuje znak o wartości ascii94 - c
, gdzie 94 to wartość „0” + „1” lub „a”Wypróbuj online!
źródło
Python3, 39
Methinks Python nie jest najlepszym językiem do tego. :)
Jeśli zależy ci na nowej linii po wyjściu, oto 43-znakowa alternatywa:
źródło
end=''
prostu,
zrobi :) - jeśli nie dbają o nie będąc bez spacjiprint
wymaga dostrajaniaend
parametru, aby ukryć nowy wiersz na końcu każdego wydruku. Ponadto, zgodnie ze specyfikacją OP, myślę, że zależy mi na tym, aby nie było spacji. :) Ale dziękuję za komentarz!J - 11 znaków
Wartości logiczne w J są reprezentowane jako liczby całkowite
0
i1
, które oczywiście są również poprawnymi indeksami w tablicach (w tym przypadku tablica 2-znakowa'01'
)źródło
C #, 131 bajtów
Trochę późno na przyjęcie, ale tu jest moje. :)
źródło
MATLAB, 13 bajtów
Po uruchomieniu powyższego wywołaj funkcję z łańcuchem wejściowym, aby uzyskać odwrócony ciąg. Na przykład bieganie:
drukuje:
źródło
BotEngine , 4x8 = 32
Niekonkurencyjny, ponieważ język postdatuje pytanie.
Z wyróżnieniem:
źródło