Biorąc pod uwagę ciąg znaków ASCII, wypisz znak znajdujący się na środku. Jeśli nie ma znaku środkowego (gdy łańcuch ma parzystą długość), wypisz znak ASCII, którego liczba porządkowa jest średnią zmienną dwóch znaków środkowych. Jeśli ciąg jest pusty, powinien zostać wyprowadzony pusty ciąg.
Przypadki testowe:
12345 => 3
Hello => l
Hiya => q
(empty input) => (empty output)
Najkrótszy program w postaci wygrywa. (Nie bajty.)
Tabela liderów
Fragment kodu na dole tego postu generuje tabelę wyników na podstawie odpowiedzi a) jako lista najkrótszych rozwiązań dla każdego języka oraz b) jako ogólna tabela wyników.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
## Language Name, N characters
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
## Ruby, <s>104</s> <s>101</s> 96 characters
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik to suma dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
## Perl, 43 + 2 (-p flag) = 45 characters
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:
## [><>](http://esolangs.org/wiki/Fish), 121 characters
<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 = 64599; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 47556; 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:
Pyth, 15 bajtów
Demonstracja
Począwszy od „Hiya” jako wejścia:
Zauważ, że to zawiesza się z błędem przy pustym wejściu i nie wypisuje nic do STDOUT, co jest prawidłowym sposobem na wyprowadzenie pustego ciągu przez domyślne ustawienia kodu golfa.
źródło
B
ifurcate ponownie pokazuje swoją użyteczność.C
funkcjonalność podłogi: github.com/isaacg1/pyth/commit/0baf23ec Zwróć uwagę na dzień, w którym został dodany, tego samego dnia, w którym zadano to pytanie. To dlatego, że to pytanie zainspirowało mnie do dodania tej funkcjonalności, przez co nie można jej używać w tym pytaniu.Brainf ***, 61 bajtów
Chiński , 16 znaków
Wymaga to, aby dane wejściowe były w zakresie ASCII 1-127 i były zerowane. Usuwa pary znaków od początku i końca łańcucha, aż pozostanie jeden lub dwa znaki. Jeśli są dwa, dodaje je razem, a następnie dzieli przez 2, zaokrąglając w dół. Pozostały znak jest drukowany.
Wypróbuj na tym tłumaczu .
Sekcja:
* Biorąc pod uwagę, że każda instrukcja może być skompresowana do 3 bitów i zakodowana w UTF-32, cały program można technicznie wyrazić za pomocą 6 znaków.
EDYCJA: Dziękuję Janowi Dvorakowi za wprowadzenie mnie w język chiński , który kompresuje to do 16 znaków, na równi z odpowiedzią Dennisa na CJam .
źródło
Given each instruction could be compressed to 3 bits and encoded in UTF64, the whole program could technically be expressed in 3 characters.
Wygrałeś. Internet I wszystko inne.+-<>,.[]
, niezależnie od ich kodowania, a nie ich reprezentacje binarne. Jesteśmy zgodni co do tego, że kodowanie, którego nie może użyć istniejący tłumacz, jest nieprawidłowe.CJam, 16 bajtów
Wypróbuj online!
Jak to działa
źródło
TeaScript , 23 bajty
25 30 31 33Wykorzystuje pomysł @ isaacga na odwrócenie łańcucha.
Wypróbuj online
Przetestuj wszystkie przypadki
Niegolfowane i objaśnienia
TeaScript jest wciąż JavaScript, więc działa podobnie jak JavaScript.
źródło
Matlab,
3937 bajtówfloor((end+[1,2])/2)
zwraca środkowe dwa indeksy łańcucha, jeśli długość jest parzysta, i zwraca środkowy indeks dwa razy, jeśli długość jest nieparzysta.mean
po prostu zwraca średnią z tych wartości ichar
automatycznie ją określa .źródło
Kod maszynowy 8086 + DOS, 31 bajtów
Hexdump:
Kod źródłowy asemblera (może być skompletowany z tasm):
Tutaj jest pewne delikatne użycie rejestru FLAGS. Po przesunięciu długości łańcucha w prawo o 1 bit (co odpowiada podziałowi przez 2) dwie flagi przechowują dodatkowe informacje:
Zazwyczaj flagi powinny być natychmiast sprawdzane, ale tutaj korzystam z faktu, że
mov
instrukcja nie zmienia flag. Można je więc zbadać po załadowaniu środkowego znaku.źródło
Python 3,
61595755 bajtówStaram się nie grać w golfa w językach, w których pracuję, ale to nie jest zbyt złe.
Dzięki @xsot za 2 bajty!
Pełny program ma 59 bajtów:
Wypróbuj tutaj .
źródło
-1-len(x)//2
jest równoważne z~len(x)//2
powodu tego, jak działa podział podłogi na ujemne liczby całkowite.Prolog, 111 bajtów
Kod
Wyjaśnił
Przykłady
źródło
R , 73 bajty
Wypróbuj online!
Ogromne podziękowania dla @ngm za wymyślenie tego nierekurencyjnego pomysłu - pozwolono na grę w golfa 20 bajtów.
Stare rozwiązanie:
R ,
10195 bajtówWypróbuj online!
Rozwiązanie rekurencyjne. Poprawiono jeden problem w cenie 2 bajtów:
try(expr, silent = TRUE)
aby właściwie zarządzać przypadkiem, w którym dane wejściowe są puste.dzięki Giusppe za 4 bajty!
źródło
intToUtf8
obcina liczb niecałkowitych?Łuska , 11 bajtów
Wypróbuj online!
Wyjaśnienie
Pyszne, pyszne kombinatory do samego końca.
ö
to „ułóż te cztery funkcje”,¤
to „zastosuj pierwszy argument do wyników zastosowania drugiego argumentu osobno dla dwóch dodatkowych argumentów”,S
to „zastosuj tę funkcję (która powinna wziąć dwa argumenty) doS
trzeciego argumentu i do wyniku zastosowaniaS
drugiego argumentu do trzeciego ". W związku z tym,Edytowano, aby dodać: Ściśle mówiąc, nie jest to nieco zgodne ze specyfikacją problemu, która żąda ciągu w przypadku pustego wejścia i znaku w innych przypadkach.
Ze względu na ścisłe pisanie przez Husk po prostu nie można zdefiniować funkcji / programu, który może zwrócić jeden z dwóch typów. Zdecydowałem się zwrócić pojedynczy znak we wszystkich przypadkach, a dla Huska najbardziej rozsądnym wyborem dla pojedynczego znaku do reprezentowania pustego ciągu jest
'(space)'
to, że jest to wartość „domyślna” (i w rzeczywistości dlatego ten program zwraca ją; wartość domyślna wartość jest używana przy pobieraniu ostatniego (→
) elementu pustej listy).Mógłbym również rozsądnie zdecydować o zwróceniu ciągów zerowych lub jednego znaku, co nie powiedzie się w specyfikacji w przeciwnym kierunku, ale nie zrobiłem tego, ponieważ dodaje cztery bajty:
Ṡ&ö;c½S¤+öc→←½↔
przy;
konwersji znaku na ciąg jednego znaku, innyö
wyraźne skomponowanie potrzebnych informacji orazṠ&
skrót w przypadku fałszowania danych wejściowych.źródło
C ++ 14, 56 bajtów
Anonimowa lambda bierze ciąg jako argument i zwraca int jako kod char. Na
""
to zwraca0
. Nie jestem pewien, jak dokładnie powinny wyglądać dane wejściowe i wyjściowe (nie jest określone w pytaniu).Bez golfa, z użyciem
źródło
0
dla „”.JavaScript (ES6), 83 bajty
89 91Zaoszczędzono 2 bajty dzięki @ Cᴏɴᴏʀ O'Bʀɪᴇɴ
Zaoszczędź 6 bajtów dzięki @ETHproductions
JavaScript nie jest zbyt dobry w całym tym łańcuchu znaków.
źródło
s=>String.fromCharCode((s[~~(t=s.length/2-.5)][r="charCodeAt"]()+s[Math.ceil(t)][r])/2)
jest o 5 bajtów krótszy.()
wokółcharCodeAt
, więc jest to naprawdę 3 znaki, ale i tak dzięki!t
jest liczbą całkowitą, która nie będzie działaćMath.ceil(t)
można zmienić na0|t+.9
O ,
4434 bajtówPrzekreślone 44 jest nadal regularne 44 :(
Bajty zmarnowane na:
źródło
Minkolang 0,13 ,
2320 bajtówWypróbuj tutaj.
Wyjaśnienie
źródło
hiya
zwracai
zamiastq
Japt ,
4029232120 bajtówZaoszczędzono 4 bajty dzięki @ ן nɟuɐɯɹɐ ן oɯ
Teraz tylko połowa oryginalnej długości! Kocham golfa kodowego. :-RE
Działa poprawnie na pustym ciągu. Wypróbuj online!
Jak to działa
Jak widać, wykorzystuje wiele automatycznych podłóg. (Dzięki, JavaScript!) Sugestie mile widziane!
źródło
V=Ul /2;((UcV +Uw cV )/2 d
?c
tyle razy bez argumentu, że zapomniałem, że je zaakceptowałem. Dzięki!Idź,
166156153 bajtówGo może nie być najlepszym językiem do gry w golfa ... ale tak bardzo go kocham i uczę się go, więc tam.
Ta implementacja akceptuje
\n
dane wejściowe puste ( ) i prawdopodobnie ulegnie awarii z danymi wejściowymi nieobjętymi ASCII / ASCII. Jednak OP nie określił kodowania wejścia / wyjścia, więc ASCII jest wszystkim, co wyraźnie poparłem.Edycja : okazuje się
if
/else
jest krótsza niżswitch
. Teraz wiem, jak sądzę.Gra w golfa:
Nie golfowany:
źródło
𝔼𝕊𝕄𝕚𝕟, 23 znaki
Try it here (Firefox only).
Dzięki @ETHProductions za pomysł!
źródło
C #, 77 bajtów
W rzeczywistości nie zwraca łańcucha, a jeśli łańcuch wejściowy jest pusty, otrzymasz znak spacji, ponieważ funkcja musi zawsze zwracać wartość. Potrzebne będą jeszcze 2 bajty, aby zwrócić ciąg.
Pełny program z przypadkami testowymi:
Alternatywnie, pełny program, który odczytuje dane wprowadzone przez użytkownika i drukuje środek wprowadzonego ciągu:
C #, 144 bajty
Ponownie wykorzystuje tę samą sztuczkę, wypisując znak spacji, którego użytkownik nie zauważy, a nie pusty ciąg, w przeciwnym razie rozwiązanie jest o 2 bajty dłuższe.
źródło
Vim,
382423 klawiszyPonieważ vim ma wbudowaną funkcję znajdowania środkowej linii, ale nie środkowego znaku , każdy znak w osobnej linii dzielimy najpierw za pomocą
substitute
, znajdź środkową linię, a następnie usuwamy wszystko po niej i przed nią.Jeśli chcesz to uruchomić, uważaj na
.vimrc
pliki, które mogą zmienić zachowanie.
(magic regex) ig
(gdefault). Pamiętaj, że w rzeczywistości oszczędza mi 3 naciśnięcia klawiszy na moim komputerze :)Poprzednia odpowiedź
Bierze wejściowy bufor jednowierszowy, aktualizuje bieżący bufor środkowym znakiem. Myślałem, że w vimie byłby na to skrót!
Uwaga: potencjalnie krótsze rozwiązanie wydaje się powodować nieskończoną pętlę ... Jeśli ktoś ma pomysł:
qq^x$x@qq@qp
(12 naciśnięć klawiszy) - działa z<c-c>
ostatnim@q
...źródło
Mathematica,
11899 znakówManipulacja kodem znaków MMA jest kosztowna ...
źródło
%
której się opiera.VBA, 130 bajtów
Myślę, że mogę pograć w golfa z jednym z
asc()
telefonów, ale nie mogłem go skrócić.źródło
K, 40 bajtów
źródło
> <>, 24 + 3 (dla -s) = 27 bajtów
Stare rozwiązanie (nie działa dla pustych danych wejściowych):
Oba pobierają dane wejściowe na stosie
-s
. Oba mają 24 bajty.Wypróbuj online tutaj.
źródło
sb , 83 bajty
Chociaż w ciągu wejściowym są co najmniej 3 znaki, pierwszy i ostatni są usuwane. Pozostawia to 1 znak (należy wydrukować niezmodyfikowany) lub 2 (należy uśrednić i wydrukować). Aby sobie z tym poradzić, pierwszy i ostatni znak ciągu są dodawane razem i dzielone przez dwa. Jeśli istnieje tylko jedna postać,
(a+a)/2==a
. Jeśli były dwa,(a+b)/2
to znak, który należy wydrukować. pb „pożycza” ocenę wyrażeń Pythona (def expression(e): return eval(e, globals())
), więc jest ona automatycznie przenoszona.Obsługa pustych danych wejściowych kosztuje mnie 5 bajtów. W szczególności
<b[1]>
w pierwszej linii. Wcześniej, kiedy powiedziałem „sznurek”, było to całkowite kłamstwo. pb nie ma ciągów, ma znaki, które są blisko siebie. Szukanie „ostatniej postaci sznurka” oznacza po prostu przesuwanie pędzla w lewo, aż uderzy on w postać. Gdy nie podano danych wejściowych, pętla „dopóki są co najmniej 3 znaki” jest całkowicie pomijana i zaczyna szukać ostatniego znaku. Bez tego<b[1]>
wyglądałoby to wiecznie. Ten kod umieszcza znak o wartości 1 w (-1, -1), który można znaleźć, gdy dane wejściowe są puste. Po znalezieniu „ostatniego znaku” struny pędzel przyjmuje, że pierwszy ma wartość (0, -1) i idzie tam bezpośrednio, znajdując wartość 0.(1+0)/2
wynosi 0 w pb,Dzięki, hipotetyczny pytający. Wcześniej, kiedy powiedziałem „drukuj”, było to całkowite kłamstwo. W PB naprawdę nie drukujesz wartości, po prostu umieszczasz je na płótnie. Zamiast „sposobu na wyjście”, bardziej dokładne jest wyobrażenie sobie płótna jako nieskończenie dużej tablicy 2D. Pozwala na ujemne wskaźniki w obu wymiarach, a wiele programów w pb polega na upewnieniu się, że pędzel dotrze do miejsca na płótnie, które chcesz. Po zakończeniu wykonywania programu wszystko na płótnie z nieujemnymi współrzędnymi X i Y jest drukowane w odpowiednim miejscu na konsoli. Po uruchomieniu programu całe płótno jest wypełnione wartościami 0. Aby nie trzeba było drukować nieskończonej liczby linii, każda z nieskończoną liczbą bajtów zerowych, każdy wiersz wyniku jest drukowany tylko do ostatniego niezerowego znaku, a linie są drukowane tylko do ostatniego z niezerowym znakiem. Więc umieszczenie
0
at (0, 0) jest nadal pustym wyjściem.Nie golfowany:
źródło
Poważnie ,
2220 bajtówDzięki @Mego za bycie świetnym w swoim języku
Wypróbuj online lub cokolwiek innego
źródło
,;``@(lIƒ
pozostawi cię z wartością wejściową na stosie, jeślilen
jest> 0, lub zakończy program w inny sposób. Zwróć uwagę, że w backticks znajduje się niezadrukowany znak - postać 127.ƒ
zrobić?CoffeeScript,
104103 bajtyźródło
Rubin,
434241 bajtów42 bajty
43 bajty
Stosowanie:
źródło
Java 7, 152 bajty
Przypadki bez golfa i testy:
Wypróbuj tutaj.
Wydajność:
źródło
PHP,
14793 bajtówPodziękowania i specjalne podziękowania dla Jörga Hülsermanna za grę w golfa moją odpowiedź 54 bajty w dół!
Poprzednia wersja:
Kod testowy:
Przetestuj online
Mam wrażenie, że można to poprawić, ale nie mam na to czasu ...źródło
<?=($l=strlen($s=$argv[1]))%2?$s[($l-1)/2]:chr(floor((ord($s[$l/2])+ord($s[$l/2-1]))/2));
to moja propozycjaExcel,
12279 bajtówWłaściwie odpowiedź @Sophia Lechner:
-5 bajtów od początkowego rozwiązania dzięki @Taylor Scott.
12 bajtów potrzebnych na pusty ciąg.
źródło
Average(...,...)
i użyj(...+...)/2
dla -5 bajtów.=IFERROR(IF(ISODD(LEN(A1)),MID(A1,LEN(A1)/2+1,1),CHAR((CODE(MID(A1,LEN(A1)/2,1))+CODE(MID(A1,LEN(A1)/2+1,1)))/2)),"")
=IFERROR(CHAR(CODE(MID(A1,LEN(A1)/2+1,1))/2+CODE(MID(A1,LEN(A1)/2+.5,1))/2),"")
za 79 bajtów