Jest to oparte na xkcd # 153 .
Utwórz program lub funkcję o nazwie, która pobierze 2 parametry, z których każdy jest łańcuchem, listą lub tablicą bajtów lub znaków. Drugi parametr będzie zawierał tylko znaki zaczerpnięte z lrfu
(lub równoważne bajty ASCII). Należy to interpretować jako ciąg instrukcji do wykonania na sekwencji bitowej reprezentowanej przez pierwszy parametr.
Wykonane przetwarzanie musi być równoważne z następującymi:
- Konwertuj pierwszy parametr na pojedynczy ciąg bitów utworzony przez konkatenację bitów każdego znaku (interpretowanego jako jeden z 7-bitowego ASCII, 8-bitowego rozszerzonego ASCII lub standardowego kodowania Unicode). Np. Jeśli pierwszym parametrem jest,
"AB"
to będzie to jeden z 10000011000010
(7-bitów), 0100000101000010
(8-bitów lub UTF-8) 00000000010000010000000001000010
lub 01000001000000000100001000000000
(UTF-16 w dwóch endiannościach) itp.
- Dla każdego znaku w drugim parametrze wykonaj kolejno odpowiednią instrukcję:
l
obraca łańcuch bitów w lewo. Np . 10000011000010
Staje się 00000110000101
.
r
obraca łańcuch bitów w prawo. Np . 10000011000010
Staje się 01000001100001
.
f
odwraca (lub odwraca) każdy bit w łańcuchu bitów. Np . 10000011000010
Staje się 01111100111101
.
u
odwraca ciąg bitów. Np . 10000011000010
Staje się 01000011000001
.
- Przekształć ciąg bitów na ciąg ASCII, który używa jednego znaku na bit. Np .
10000011000010
Staje się "10000011000010"
. Wynika to z faktu, że nie wszystkie zestawy 7/8 bitów mają przypisany znak.
Przykład (w Pythonie):
>>> f("b", "rfu")
01110011
Przekształca się "b"
w 8-bitową reprezentację binarną ASCII 01100010
, obraca ją w prawo ( 00110001
), odwraca każdy bit ( 11001110
) i odwraca ( 01110011
).
Elastyczność
Inne znaki mogą być stosowane zamiast znaków l
, r
, f
, i u
, ale muszą one być wyraźnie udokumentowane.
Tablica wyników
Dzięki @Optimizer za utworzenie następującego fragmentu kodu. Aby użyć, kliknij „Pokaż fragment kodu”, przewiń w dół i kliknij „► Uruchom fragment kodu”.
var QUESTION_ID = 45087; var answers = [], page = 1;var SCORE_REG = /\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;function url(index) {return "http://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=votes&site=codegolf&filter=!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";}function getAnswers() {$.ajax({url: url(page++),method: "get",dataType: "jsonp",crossDomain: true,success: function (data) {answers.push.apply(answers, data.items);if (data.has_more) getAnswers();else process()}});}getAnswers();function shouldHaveHeading(a) {var pass = false;try {pass |= /^(#|<h).*/.test(a.body_markdown);pass |= ["-", "="].indexOf(a.body_markdown.split("\n")[1][0]) > -1;} catch (ex) {}return pass;}function shouldHaveScore(a) {var pass = false;try {pass |= SCORE_REG.test(a.body_markdown.split("\n")[0]);} catch (ex) {}return pass;}function getRelDate(previous) {var current = Date.now();var msPerMinute = 60 * 1000;var msPerHour = msPerMinute * 60;var msPerDay = msPerHour * 24;var msPerMonth = msPerDay * 30;var msPerYear = msPerDay * 365;var elapsed = current - previous;if (elapsed < msPerMinute) {return Math.round(elapsed/1000) + ' seconds ago';}if (elapsed < msPerHour) {return Math.round(elapsed/msPerMinute) + ' minutes ago';}if (elapsed < msPerDay ) {return Math.round(elapsed/msPerHour ) + ' hours ago';}if (elapsed < msPerMonth) {return 'approx. ' + Math.round(elapsed/msPerDay) + ' days ago';}if (elapsed < msPerYear) {return 'approx. ' + Math.round(elapsed/msPerMonth) + ' months ago';}return 'approx. ' + Math.round(elapsed/msPerYear ) + ' years ago';}function process() {answers = answers.filter(shouldHaveHeading);answers = answers.filter(shouldHaveScore);answers.sort(function (a, b) {var aB = +(a.body_markdown.split("\n")[0].match(SCORE_REG) || [Infinity])[0],bB = +(b.body_markdown.split("\n")[0].match(SCORE_REG) || [Infinity])[0];return aB - bB});answers.forEach(function (a) {var answer = $("#answer-template").html();answer = answer.replace("{{BODY}}", a.body).replace("{{NAME}}", a.owner.display_name).replace("{{REP}}", a.owner.reputation).replace("{{VOTES}}", a.score).replace("{{DATE}}", new Date(a.creation_date*1e3).toUTCString()).replace("{{REL_TIME}}", getRelDate(a.creation_date*1e3)).replace("{{POST_LINK}}", a.share_link).replace(/{{USER_LINK}}/g, a.owner.link).replace('{{img}}=""', "src=\"" + a.owner.profile_image + '"');answer = $(answer);if (a.is_accepted) {answer.find(".vote-accepted-on").removeAttr("style");}$("#answers").append(answer);});}
body { text-align: left !important}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id="answers"></div><div id="answer-template" style="display: none"><div class="answer" ><table><tbody><tr><td class="votecell"><div class="vote"><span style="cursor: pointer;" title="Total Votes" itemprop="upvoteCount" class="vote-count-post ">{{VOTES}}</span><span style="display: none" class="vote-accepted-on load-accepted-answer-date" title="The question owner accepted this as the best answer">accepted</span></div></td><td class="answercell"><div class="post-text" itemprop="text">{{BODY}}</div><table class="fw"><tbody><tr><td class="vt"><div class="post-menu"><a href="{{POST_LINK}}" title="short permalink to this answer" class="short-link">share</a></div></td><td class="post-signature" align="right"><div class="user-info "><div class="user-action-time">answered <span title="{{DATE}}" class="relativetime">{{REL_TIME}}</span></div><div class="user-gravatar32"></div><div class="user-details"><br></div></div></td><td class="post-signature" align="right"><div class="user-info user-hover"><div class="user-action-time"></div><div class="user-gravatar32"><a href="{{USER_LINK}}"><div class="gravatar-wrapper-32"><img {{img}} alt="" height="32" width="32"></div></a></div><div class="user-details"><a href="{{USER_LINK}}">{{NAME}}</a><br><span class="reputation-score" title="reputation score " dir="ltr">{{REP}}</span></div></div></td></tr></tbody></table></td></tr></tbody></table></div></div>
"rrfrburb"
? Ponadto, kiedy przesuwa się lub odwraca bity, czy robi to dla każdej pojedynczej litery lub ciągu jako całości? Więcej przypadków testowych by to wyjaśniło.Odpowiedzi:
CJam,
3432 bajtyW instrukcji użyto następujących znaków:
Dane wejściowe są pobierane ze STDIN ze słowem w pierwszym wierszu i ciągiem instrukcji w drugim wierszu.
Sprawdź to tutaj.
Wyjaśnienie
Uzyskanie ciągu bitowego jest tak naprawdę kwestią interpretacji kodów znaków jako cyfr liczby base-256 (i uzyskania jej reprezentacji base-2). Trudne jest to, że ta ostatnia podstawowa konwersja nie spowoduje uzupełnienia wyniku zerami po lewej stronie. Dlatego dodam wiodącą 1 do początkowego wejścia, a następnie ponownie podzielę tę 1 w reprezentacji binarnej. Na przykład, jeśli dane wejściowe to
ab
, przekształcam je w tablicę[1 'a 'b]
, interpretuję to jako base-256 (znaki są automatycznie konwertowane na kody znaków), czyli90466
i na base-2, czyli[1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0]
. Teraz, jeśli po prostu usunę tę wiodącą1
, mam strumień bitów, którego szukam.Tak właśnie działa ta część kodu:
Teraz czytam listę instrukcji i wykonuję blok dla każdego znaku w ciągu instrukcji:
Pierwszą rzeczą do zrobienia jest, aby ocenić charakter i rzeczywiste liczby całkowite
0
,1
,2
lub3
. Teraz prawdziwa magia golfa ... w zależności od instrukcji chcę uruchomić krótki fragment kodu, który implementuje operację:Mógłbym przechowywać je w tablicy bloków i wybrać odpowiedni blok do uruchomienia, ale kodowanie ich w ciągu jest w rzeczywistości krótsze:
Najpierw używam liczby całkowitej powiązanej z instrukcją, aby odciąć początek łańcucha. Tak więc w przypadku obrotu w lewo ciąg znaków pozostaje niezmieniony, w przypadku obrotu w prawo pierwszy znak jest odrzucany i tak dalej. Następnie wybieram co czwarty znak z ciągu, zaczynając od pierwszego, z
4%
. Zwróć uwagę, jak cztery fragmenty kodu są rozmieszczone w całym ciągu. Wreszcie po prostu oceniam ciąg jako kod~
.Łańcuch bitów jest drukowany automatycznie na końcu programu.
źródło
1m<
zamiast(+
? Pracujesz nad tablicą, a nie liczbą, prawda?CJam, 34 bajty
Inne podejście w CJam.
Tekst wejściowy znajduje się w pierwszym wierszu, a instrukcje w drugim wierszu.
Instrukcje:
źródło
f~
nie została wdrożona, prawda? ;)Pyth 33
Wykorzystuje:
Pyth github
Wypróbuj online tutaj.
Jest to program, który przyjmuje ciąg znaków jako pierwszy argument, a ciąg poleceń jako drugi argument. W wersji online powinieneś podać ciągi znaków oddzielone znakiem nowej linii, na przykład:
Wyjaśnienie:
Coś, do czego nie mogłem się wcisnąć: Pyth
reduce
automatycznie używaG
poprzedniej wartości iH
następnej wartości.źródło
lrfu
, ale muszą być one wyraźnie udokumentowane”. (moje podkreślenie)Scala - 192
źródło
Matlab (166 bajtów)
Używa odpowiednio liter
abcd
zamiastlrfu
.Niektóre sztuczki użyte tutaj, aby zaoszczędzić miejsce:
abcd
litery pozwala mi odjąć97
jeden raz, a następnie litery stać0
,1
,2
,3
. Oszczędza to miejsce w klauzulachswitch
-case
.circshift
jako jednoliterowej funkcji anonimowej również oszczędza miejsce, ponieważ jest używane dwukrotnie.D
składa się z'0'
i'1'
znaków (kody ASCII48
i49
), instrukcjaD=char(97-D)
odpowiada inwersji między'0'
i'1'
wartościami. Pamiętaj, że97
nie ma to nic wspólnego z tym, o którym mowa powyżej.'
Zamiast transpozycji stosowana jest transpozycja złożonego sprzężonego.'
.źródło
Python 2 - 179
źródło
C #, 418 bajtów
Sformatowany:
źródło
J, 164
Sformatowany:
Przykład
źródło
JavaScript (E6), 163
167W pełni wykorzystująca elastyczność wprowadzania nazwana funkcja z 2 parametrami tablicy.
Funkcja zwraca ciąg znaków złożony z „1” i „0”
Przykład
f("b", "rfu")
przetłumacz naF([98],[82,70,85])
, wynikiem jest0111001
Uwaga: używanie ciągów znaków jest o wiele dłuższe w javascript! Liczba bajtów 186
Przykład
F("b", "RFU")
, wynik jest0111001
ponownieźródło
Ruby, 151
Dość bezpośredni. Pętle przechodzą przez postacie
s
i wykonują akcję dla dowolnej z nich.źródło
Python 2, 142
Podobna do mojej odpowiedzi pyta w podejściu: buduję listę wszystkich ciągów i indeksuję do niej na podstawie wartości ciągu instrukcji, nad którym iteruję, używając redukcji.
Wykorzystuje:
źródło