{"id":26861,"date":"2024-02-22T05:00:00","date_gmt":"2024-02-22T04:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=26861"},"modified":"2024-02-22T08:53:11","modified_gmt":"2024-02-22T07:53:11","slug":"rekrutacja-na-junior-python-developera-przykladowe-zadanie-techniczne","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/rekrutacja-na-junior-python-developera-przykladowe-zadanie-techniczne\/","title":{"rendered":"Rekrutacja na Junior Python Developera \u2013 przyk\u0142adowe zadanie techniczne"},"content":{"rendered":"\n<p>Chc\u0105c rozpocz\u0105\u0107 \u015bcie\u017ck\u0119 kariery jako programista Python, zastanawia\u0142em si\u0119, jaki sens ma rozwi\u0105zywanie zadania \u201ena kartce\u201d podczas rekrutacji.&nbsp; W tym artykule podziel\u0119 si\u0119 z Wami zadaniem, z kt\u00f3rym mia\u0142em styczno\u015b\u0107. Przejdziemy krok po kroku proces jego wytwarzania oraz poznamy kilka w\u0142a\u015bciwo\u015bci j\u0119zyka.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Zadanie: zamiana ci\u0105gu<\/strong><\/h2>\n\n\n\n<p>Naszym zadaniem jest zamiana ci\u0105gu `a4b3r6` na `aaaabbbrrrrrr`.<\/p>\n\n\n\n<p>Pierwsz\u0105 czynno\u015bci\u0105 jest <strong>odnalezienie schematu<\/strong>. W tym przypadku podano w tre\u015bci zadania, \u017ce cyfra jest wi\u0119ksza od 0, a litera jest z alfabetu ASCII. Wskazano r\u00f3wnie\u017c, \u017ce takich par w ci\u0105gu wej\u015bciowym jest co najmniej 1. Wej\u015bcie zawsze b\u0119dzie tego formatu \u2013 nie jest wymagana obs\u0142uga b\u0142\u0119d\u00f3w.<\/p>\n\n\n\n<p>Do rozwi\u0105zania zadania u\u017cy\u0142em Pythona w wersji 3.x. Wiedza, \u017ce Python jest j\u0119zykiem silnie dynamicznie typowanym jest niezb\u0119dna do rozpocz\u0119cia pracy. Takie podej\u015bcie ma swoje wady (wykonywanie operacji na typach, kt\u00f3re wspieraj\u0105 t\u0119 operacj\u0119) i zalety (brak potrzeby zarz\u0105dzania pami\u0119ci\u0105). Jest on r\u00f3wnie\u017c j\u0119zykiem interpretowanym \u2013 nie ma etapu kompilacji, jest niezale\u017cny od architektury, na kt\u00f3rej jest uruchamiany.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podej\u015bcie do rozwi\u0105zania zadania<\/strong><\/h2>\n\n\n\n<p>Kiedy ju\u017c znamy schemat, to wydaje si\u0119 zasadnym, \u017ceby u\u017cy\u0107 wyra\u017cenia regularnego (RegEx). Cytuj\u0105c za klasykiem:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>Je\u017celi co\u015b mo\u017ce zosta\u0107 wykonane przez wyra\u017cenie regularne, to na pewno robisz to \u017ale<\/em>.<\/p>\n<\/blockquote>\n\n\n\n<p>Z tego powodu to rozwi\u0105zanie zostawimy sobie jako wisienk\u0119 na torcie, a zaczniemy od podej\u015bcia `brute force`.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>`brute force`<\/strong><\/h3>\n\n\n\n<p>Zauwa\u017cmy, \u017ce cyfra jest na indeksie (tak, w Pythonie mo\u017cna traktowa\u0107 ci\u0105g znak\u00f3w jak tablic\u0119) o 1 mniejszym ni\u017c litera. Iteruj\u0105c po ca\u0142ym ci\u0105gu wej\u015bciowym (w Pythonie iteruje si\u0119 po elementach tablicy \u2013 funkcja `range` przekszta\u0142ca liczb\u0119 na odpowiedni\u0105 tablic\u0119; je\u015bli chcecie pozna\u0107 ca\u0142y wykaz mo\u017cliwo\u015bci, <a href=\"https:\/\/docs.python.org\/3\/library\/functions.html#func-range\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >zach\u0119cam do przeczytania dokumentacji<\/a>), przy nieparzystej warto\u015bci indeksu (tutaj pojawi si\u0119 cyfra), mo\u017cemy pobra\u0107 liter\u0119 i iteruj\u0105c j\u0105 tyle razy, na ile wskazuje cyfra, konkatenowa\u0107 (w Pythonie konkatenuje si\u0119 znaki symbolem `+`, a tak\u017ce `+=`, gdzie znak po lewej stronie konkatenujemy ze znakiem po prawej stronie i przypisujemy do zmiennej po lewej stronie.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Wykorzystanie metod<\/strong><\/h3>\n\n\n\n<p>Do \u0142\u0105czenia ci\u0105g\u00f3w znak\u00f3w mo\u017cna r\u00f3wnie\u017c u\u017cy\u0107 tych metod) w p\u0119tli. Przyk\u0142ad, jak to zrobi\u0107, mo\u017cecie sprawdzi\u0107 <a href=\"https:\/\/github.com\/slyher\/python_rekrutacja\/blob\/master\/StringEncoder.py#L9\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >w metodzie `stage_one`<\/a>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n    def stage_one(self, st: str) -&gt; str:  # brute force\n        return_string = &#039;&#039;\n        for i in range(len(st)):\n            if i % 2 == 1:\n                for j in range(int(st&#x5B;i])):\n                    return_string += st&#x5B;i - 1]\n        return return_string\n<\/pre><\/div>\n\n\n<p>Je\u017celi lekko zoptymalizujemy poprzedni przyk\u0142ad i podzielimy ci\u0105g wej\u015bciowy na paczki sk\u0142adaj\u0105ce si\u0119 z 2 element\u00f3w, to p\u0119tla g\u0142\u00f3wna metody wykona si\u0119 tylko po\u0142ow\u0119 razy. U\u017cy\u0142em r\u00f3wnie\u017c w\u0142a\u015bciwo\u015bci j\u0119zyka umo\u017cliwiaj\u0105cej \u201ewyci\u0119cie\u201d z tabeli zakresu indeks\u00f3w, co mo\u017cecie zobaczy\u0107 <a href=\"https:\/\/github.com\/slyher\/python_rekrutacja\/blob\/master\/StringEncoder.py#L17\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >w metodzie `stage_two`.<\/a><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n    def stage_two(self, st: str) -&gt; str:  # lets think about optimisation\n        return_string = &#039;&#039;\n        for i in range(int(len(st) \/ 2)):\n            st_temp = st&#x5B;2 * i: 2 * (i + 1)]\n            for j in range(int(st_temp&#x5B;1])):\n                return_string += st_temp&#x5B;0]\n        return return_string\n<\/pre><\/div>\n\n\n<p>Kolejnym etapem usprawnienia b\u0119dzie pozbycie si\u0119 w\u0142a\u015bnie dodanego \u201ewydzielania\u201d przez zauwa\u017cenie, \u017ce cyfra b\u0119dzie zawsze w tym samym miejscu, dzi\u0119ki czemu pozbywamy si\u0119 jednej operacji: <a href=\"https:\/\/github.com\/slyher\/python_rekrutacja\/blob\/master\/StringEncoder.py#L25\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >metoda `stage_three`.<\/a><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n   def stage_three(self, st: str) -&gt; str:  # more optimisation\n        return_string = &#039;&#039;\n        for i in range(int(len(st) \/ 2)):\n            for j in range(int(st&#x5B;2 * i + 1])):\n                return_string += st&#x5B;2 * i]\n        return return_string\n<\/pre><\/div>\n\n\n<p><a href=\"https:\/\/github.com\/slyher\/python_rekrutacja\/blob\/master\/StringEncoder.py#L39\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Metoda \u201astage_four\u2019<\/a> wprowadza kolejn\u0105 w\u0142a\u015bciwo\u015b\u0107 j\u0119zyka Python \u2013 mno\u017cenie string\u00f3w. Jest w\u0142a\u015bciwym mno\u017ceniem string\u00f3w: `6*\u201dalf\u201d = \u201calfalfalfalfalfalf\u201d`. Ta cecha pozwala nam ca\u0142kowicie pozby\u0107 si\u0119 wewn\u0119trznej p\u0119tli.&nbsp;<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n  def stage_four(self, st: str) -&gt; str:  # let it lok nice too\n        return_string = &#039;&#039;\n        for i in range(len(st)):\n            if i % 2 == 0:\n                return_string += str(int(st&#x5B;i + 1]) * st&#x5B;i])\n        return return_string\n<\/pre><\/div>\n\n\n<p>Ta metoda by\u0142aby wersj\u0105 ostateczn\u0105 \u2013 rozwi\u0105zaniem zadanego problemu. Po drobnych porz\u0105dkach mamy <a href=\"https:\/\/github.com\/slyher\/python_rekrutacja\/blob\/master\/StringEncoder.py#L39\" target=\"_blank\" aria-label=\"metod\u0119 `stage_five` (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >metod\u0119 `stage_five`<\/a>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n    def stage_five(self, st: str) -&gt; str:  # final version\n        return_string = &#039;&#039;\n        for i in range(int(len(st) \/ 2)):\n            return_string += str(int(st&#x5B;2 * i + 1]) * st&#x5B;2 * i])\n        return return_string\n<\/pre><\/div>\n\n\n<p>Pojawia si\u0119 mo\u017cliwo\u015b\u0107 przedstawienia <a href=\"https:\/\/pl.wikipedia.org\/wiki\/Programowanie_funkcyjne\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >wersji funkcyjnej<\/a> tego rozwi\u0105zania \u2013 <a href=\"https:\/\/github.com\/slyher\/python_rekrutacja\/blob\/master\/StringEncoder.py#L52\" class=\"ek-link\" rel=\"nofollow\" >metoda `stage_functional`<\/a>, w kt\u00f3rej zamiast p\u0119tli u\u017cyjemy metody `enumerate`, a \u017ceby po\u0142\u0105czy\u0107 ci\u0105gi znak\u00f3w, skorzystamy z metody `join` na pustym znaku.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n    def stage_functional(self, str:str) -&gt; str:\n        return &#039;&#039;.join(map(lambda x: x&#x5B;1] * int(str&#x5B;x&#x5B;0] + 1]) if x&#x5B;0] % 2 == 0 else &quot;&quot;, enumerate(list(str))))\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\"><strong>Wyra\u017cenie regularne<\/strong><\/h3>\n\n\n\n<p>Istnieje drobna obawa o to, czy jeste\u015bmy w stanie co\u015b poradzi\u0107, je\u017celi zamiast cyfry w ci\u0105gu znak\u00f3w wej\u015bciowych pojawi si\u0119 liczba \u2013 zmieni\u0105 si\u0119 warunki wej\u015bciowe. Tutaj najbardziej og\u00f3lnym, wymagaj\u0105cym najmniejszej ilo\u015bci modyfikacji, rozwi\u0105zaniem b\u0119dzie u\u017cycie wyra\u017ce\u0144 regularnych \u2013 ich odmiana istnieje w j\u0119zyku Python w bibliotece \u201are\u2019, kt\u00f3ra zosta\u0142a zaimportowana i u\u017cyta w <a href=\"https:\/\/github.com\/slyher\/python_rekrutacja\/blob\/master\/StringEncoder.py#L45\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >metodzie `stage_six`.<\/a><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n    def stage_six(self, st: str) -&gt; str:  # regexp bonus :P\n        import re\n        return_string = &#039;&#039;\n        for st_temp in re.findall(r&quot;\\D+\\d+&quot;, st):\n            return_string += str(int(st_temp&#x5B;1]) * st_temp&#x5B;0])\n        return return_string\n<\/pre><\/div>\n\n\n<p>O wyra\u017ceniach regularnych s\u0105 pisane ksi\u0105\u017cki maj\u0105ce kilkaset stron \u2013 ka\u017cdy j\u0119zyk ma swoje podej\u015bcie do tematu. W <a href=\"https:\/\/docs.python.org\/3\/library\/re.html\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >dokumentacji biblioteki `re`<\/a> mo\u017cna przeczyta\u0107, \u017ce `\\d` jest znacznikiem cyfr, a `\\D` jest znacznikiem liter.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumujmy, co wiemy<\/strong><\/h2>\n\n\n\n<p>Sprawd\u017amy, jakie informacje przekazali\u015bmy rekruterowi na temat naszej wiedzy o j\u0119zyku Python i podej\u015bciu do rozwi\u0105zania problemu:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>iteracja po tablicy element\u00f3w \u2013 funkcja `range`,<\/li>\n\n\n\n<li>ci\u0105g znak\u00f3w jest tablic\u0105,<\/li>\n\n\n\n<li>konkatenacja z pomoc\u0105 `+`, `+=`,<\/li>\n\n\n\n<li>wycinanie element\u00f3w tablicy,<\/li>\n\n\n\n<li>mno\u017cenie string\u00f3w,<\/li>\n\n\n\n<li>wyra\u017cenia regularne jako biblioteka,<\/li>\n\n\n\n<li>mo\u017cliwe podej\u015bcie funkcyjne,<\/li>\n\n\n\n<li>`join` jako metoda \u0142\u0105czenia znak\u00f3w, `enumerate` jako zamiennik p\u0119tli,<\/li>\n\n\n\n<li>pokazali\u015bmy, \u017ce potrafimy optymalizowa\u0107 swoje rozwi\u0105zanie,<\/li>\n\n\n\n<li>jeste\u015bmy w stanie zastosowa\u0107 r\u00f3\u017cne podej\u015bcia do problemu \u2013 wyra\u017cenia regularne, programowanie funkcyjne.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Wnioski<\/strong><\/h2>\n\n\n\n<p>Czy wykazanie si\u0119 t\u0105 wiedz\u0105 i umiej\u0119tno\u015bciami b\u0119dzie wystarczaj\u0105ce do zapewnienia sobie stanowiska \u201eJunior Python Developer\u201d? Nie. Mo\u017ce by\u0107 przydatne. Na pewno nie zaszkodzi \ud83d\ude0a Trenowanie na takich podstawowych przyk\u0142adach, rozwijanie si\u0119 oraz dokumentowanie tego b\u0119dzie dodatkowym atutem.<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Je\u015bli interesuje Ci\u0119 obszar rekrutacji, zajrzyj koniecznie <a href=\"https:\/\/sii.pl\/blog\/all\/rekrutacja\/\" target=\"_blank\" aria-label=\"do innych artyku\u0142\u00f3w naszych ekspert\u00f3w (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">do innych artyku\u0142\u00f3w naszych ekspert\u00f3w<\/a> oraz <a href=\"https:\/\/sii.pl\/oferty-pracy\/\" target=\"_blank\" aria-label=\"do ofert pracy (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">do ofert pracy<\/a> \ud83d\ude42<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;26861&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;35&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 35)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Rekrutacja na Junior Python Developera \u2013 przyk\u0142adowe zadanie techniczne&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 35)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Chc\u0105c rozpocz\u0105\u0107 \u015bcie\u017ck\u0119 kariery jako programista Python, zastanawia\u0142em si\u0119, jaki sens ma rozwi\u0105zywanie zadania \u201ena kartce\u201d podczas rekrutacji.&nbsp; W tym &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/rekrutacja-na-junior-python-developera-przykladowe-zadanie-techniczne\/\">Continued<\/a><\/p>\n","protected":false},"author":613,"featured_media":26864,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[1512,1095,584,177],"class_list":["post-26861","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-poradnik","tag-sciezki-karier","tag-python","tag-rekrutacja"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/Rekrutacja-na-programiste-Junior-Python-Developer-\u2013-przykladowe-zadanie-techniczne.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/26861"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/613"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=26861"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/26861\/revisions"}],"predecessor-version":[{"id":26867,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/26861\/revisions\/26867"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/26864"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=26861"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=26861"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=26861"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}