Zacznijmy od zdefiniowania odbicia znaku w ciągu:
Biorąc pod uwagę ciąg znaków z wyraźnymi małymi literami alfabetu bez spacji, np. abcdefg
Zdefiniuj odbicie litery w ciągu c
jako przeniesienie go (bez zmiany kolejności jakiejkolwiek innej litery) w nowe miejsce w ciągu, tak aby liczba liter pierwotnie po prawej stronie jest teraz liczba liter po lewej stronie.
Zatem odbicie pisma c
w abcdefg
będzie abdecfg
. Objaśnienie: po prawej stronie były 4 litery, c
a teraz po lewej stronie są 4 litery c
.
Kilka innych przykładów:
Odbicie znaku e
w myfriend
utworzy ciągmyefrind
Odbicie znaku a
w axyz
utworzy ciąg xyza
.
Odbicie znaku b
w abc
utworzy ciąg abc
.
Odbicie znaku d
w d
utworzy ciąg d
.
Odbicie znaku e
w ef
utworzy ciąg fe
.
Aby uzyskać więcej informacji lub wypróbować niektóre przypadki testowe, oto (nieco długi) program, który napisałem w C ++.
Wyzwanie
Biorąc pod uwagę ciąg z wyraźnymi małymi literami, przejrzyj każdy znak alfabetycznie i „odzwierciedlaj” go w ciągu.
Wyjaśnienia: Litery w ciągu pochodzą z a-z
, nie ma spacji, litery są unikalne, a ciąg ma co najmniej 1 literę i co najwyżej 26 liter.
Przykłady
Wejście: dcba
. Wyjście: dcba
.
Powód: Po pierwsze, odzwierciedl to, a
ponieważ jest to znak w ciągu, który pojawia się najwcześniej w alfabecie. Dostaniesz adcb
. Następnie zastanów się nad tym, b
jak będzie dalej w alfabecie, aby uzyskać badc
. Następnie zastanów się, c
aby dostać cbad
, a następnie d
dostać dcba
.
Wejście: myface
. Wyjście: fyecma
.
Wskazówka: Przejrzyj litery w kolejności a, c, e, f, m, y
.
Wejście: a
. Wyjście: a
.
Wejście: acb
. Wyjście: bac
.
Wejście: cwmfjordbankglyphsvextquiz
. Wyjście: ieabhqzugdltkfnvpjxsormycw
.
Punktacja
- Dane wejściowe i wyjściowe można podać dowolną dogodną metodą .
- Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je wydrukować.
- 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).
- Akceptowanie ~ 100 godzin po wysłaniu.
Aktualny zwycięzca
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><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="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 162891; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 12012; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Odpowiedzi:
Brain-Flak , 188 bajtów
Wypróbuj online!
Oprócz odbić opisanych w specyfikacji wyzwania kod ten również odwraca ciąg dokładnie 26 razy. Nie ma to wpływu na końcową wydajność.
źródło
05AB1E ,
2017 bajtówWypróbuj online!
Wyjaśnienie
Na przykład dla pierwszej iteracji
myface
Ciąg jest otoczony spacjami przy każdej iteracji, ponieważ podział na pierwszą lub ostatnią literę ciągu spowoduje, że w przeciwnym razie powstanie lista długości 1, a scalenie nie będzie zawierało tej litery.
źródło
Pyth,
18161916 bajtówWypróbuj tutaj
Wyjaśnienie
źródło
Python 3 ,
8073 bajtówDzięki Esolanging Fruit za przypomnienie, że funkcje mogą wrócić, modyfikując swój argument.
Wypróbuj online!
Pobiera dane wejściowe jako listę znaków.
źródło
Python 2 , 70 bajtów
Wypróbuj online!
Zmienia listę wejściową
źródło
Retina 0.8.2 , 61 bajtów
Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:
Rozpocznij pętlę o
a
.Jeśli dane wejściowe zawierają bieżącą literę, przenieś ją na koniec, ciąg znaków
_
s reprezentujący jej pierwotną pozycję.Dla każdego
_
przesunięcia litera wstecz jedna postać.Zwiększ list. Po
z
zmianie na!
tak, aby nic nie pasowało, a pętla się kończy.Usuń
!
.źródło
Java 8,
1409692888785 bajtów-44 bajty tworzą port odpowiedzi @TFeld na Python 2 .
-6 bajtów dzięki @ OlivierGrégoire .
Zmienia listę wejściową zamiast tworzyć nową.
Wyjaśnienie:
Wypróbuj online.
źródło
s->{for(char c=96;++c<123;){int i=s.indexOf(c);if(i>=0)s.add(s.size()+~i,s.remove(i));}}
for(char c=9;++c>1;)
lepiej ;-)char
również obejmuje:Integer.MAX_VALUE + 1 == Integer.MIN_VALUE
Inteligentny!s
jest ArrayList, więcindexOf
będzie typu ogólnegoT
(dotyczyCharacter
tej listy danych wejściowych).JavaScript,
858079 bajtów-6 bajtów dzięki @DanielIndie
Wypróbuj online!
źródło
Rubinowy , 51 bajtów
Wypróbuj online!
Zajmuje tablicę znaków
Zwraca przez modyfikację wejścia
źródło
Czerwony ,
9694 bajtów2 bajty zapisane dzięki Kevin Cruijssen
Wypróbuj online!
Bardziej czytelny:
źródło
find x c replace x c""insert at x i c
na,find x c insert at replace x c""i c
aby pozbyć sięx
i spacji.R ,
737269 bajtówWypróbuj online!
Wprowadza i wyprowadza wektor znaków.
źródło
c
jako nazwy zmiennej? to okropne, nawet dla golfa kodowego!c
dlachar
) niż w nieużywanych wbudowanych.c
, a okropne było, gdy nie mogłem zrozumieć, co się dzieje. Zazwyczaj używamK
lubk
nawetC
po prostu unikam takich problemów, ale całkowicie to rozumiem.append
jest zdecydowanie odpowiednim narzędziem do pracy.Perl 5
-p
, 37 bajtówWypróbuj online!
źródło
Japt ,
2322 bajtówOszczędność jednego bajtu dzięki Oliverowi .
Wypróbuj online!
źródło
,É
przezJ
Haskell, 87 bajtów
Wypróbuj online!
źródło
f s=foldl(#)s['a'..'z']
?['a'..]
nie jest nieskończony, ponieważChar
należy do klasyBounded
. Lista z..]
odBounded
wartości zatrzymuje sięmaxBound
. Spróbuj:print [False ..]
.SNOBOL4 (CSNOBOL4) ,
132128 bajtówWypróbuj online!
Prosta implementacja wymaganego algorytmu. Zapisano kilka bajtów, przełączając się na funkcję zamiast na pełny program; wyjaśnienie pozostaje mniej więcej takie samo.
źródło
Galaretka ,
1211 bajtówMonadyczny link przyjmujący listę znaków i zwracający listę znaków.
Wypróbuj online!
W jaki sposób?
źródło
ḟ
(odfiltruj), ale jeszcze go nie zarządzałem.sorted
a następnie przechodzi przez iteracje mniej skomplikowanych operacji (spłaszczanie, dzielenie przy znalezionych indeksach, łączenie, cofanie ). - a Pythonsorted
to O (n log n).C (clang) ,
164162 bajtyWypróbuj online!
f()
pobiera tablicę znaków zawierającą łańcuch wejściowy i długość tej tablicy jako parametry i wykonuje wymagane odbicia na miejscu.callf()
ładnie drukuje.Kredyty
-2 bajty. @Kevin. Dzięki
źródło
char *s
i zmienići=96
na,i=9
aby zapisać 2 bajty.a
. DziękiAPL + WIN, 63 bajty
Monity o ciąg wejściowy
Wyjaśnienie:
źródło
Perl ,
7470 bajtów8480 bajtów, w tym wywołanie jako filtr uniksowyźródło