Wyzwanie:
Biorąc pod uwagę ciąg zawierający tylko wielkie i / lub małe litery (w zależności od tego, co wolisz), umieść go tape
poziomo, aby go naprawić. Robimy to poprzez sprawdzenie różnicy dwóch sąsiadujących liter w alfabecie (pomijając wrap-around i tylko idzie do przodu) i wypełnienie przestrzeni z taką TAPE
/ tape
jak będziemy potrzebować.
Przykład:
Wejście: abcmnnnopstzra
Wyjście:abcTAPETAPETmnnnopTAstTAPETzra
Dlaczego?
- Pomiędzy
c
im
powinno byćdefghijkl
(długość 9), więc wypełniamy toTAPETAPET
; - Pomiędzy
p
is
powinno byćqr
(długość 2), więc wypełniamy toTA
; - Pomiędzy
t
iz
powinno byćuvwxy
(długość 5), więc wypełniamy toTAPET
.
Zasady konkursu:
- Różnica dotyczy tylko przodu, więc nie ma między nimi taśmy
zra
. - Możliwe jest posiadanie wielu takich samych sąsiadujących liter jak
nnn
. - Dozwolone jest przyjmowanie danych wejściowych w dowolnym rozsądnym formacie. Może być pojedynczym łańcuchem, tablicą / listą znaków, tablicą znaków / listą itp. Wyjście ma taką samą elastyczność.
- Możesz używać małych i / lub wielkich liter w dowolny sposób. Dotyczy to zarówno wejścia, wyjścia, jak i
TAPE
. - Możliwe, że nie
TAPE
jest konieczne, w którym to przypadku dane wejściowe pozostają niezmienione.
Główne zasady:
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania. - Do odpowiedzi mają zastosowanie standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i zwracanymi typami, pełnych programów. Twoja decyzja.
- Domyślne luki są zabronione.
- Jeśli to możliwe, dodaj link do testu kodu.
- W razie potrzeby dodaj również wyjaśnienie.
Przypadki testowe:
Input: "abcmnnnopstzra"
Output: "abcTAPETAPETmnnnopTAstTAPETzra"
Input: "aza"
Output: "aTAPETAPETAPETAPETAPETAPEza"
Input: "ghijk"
Output: "ghijk"
Input: "aabbddeeffiiacek"
Output: "aabbTddeeffTAiiaTcTeTAPETk"
Input: "zyxxccba"
Output: "zyxxccba"
Input: "abccxxyz"
Output: "abccTAPETAPETAPETAPETAPExxyz"
Input: "abtapegh"
Output: "abTAPETAPETAPETAPETtaTAPETAPETAPETApeTgh"
Input: "tape"
Output: "taTAPETAPETAPETApe"
ab[TAPETAPETAPETAPET]TA[TAPETAPETAPETA]PE[T]gh
(dodano,[]
aby był bardziej czytelny).Odpowiedzi:
05AB1E ,
1412 bajtówWypróbuj online!
Wyjaśnienie
źródło
-d
aby uzyskać zrzut stosu operacji po operacji surowego stosu tego, co dzieje się zamiast wyjaśnienia, ale staram się je również opublikować, ale nie jest to proste, szczególnie na niektórych z mojego LOL.Galaretka , 13 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
abctapetapetmnnnopapstetapezra
zamiastabctapetapetmnnnoptasttapetzra
.Haskell , 58 bajtów
Wypróbuj online! Funkcja
f
powtarza się nad ciągiem znaków i sprawdza kolejne znakix
orazy
.cycle"TAPE"
daje nieskończony ciąg"TAPETAPETAPE..."
.[x..y]
pobiera zakres znaków odx
doy
włącznie, więc musimy odjąć dwa od długości. W przypadku, gdyx
występuje później w alfabecie,y
lub oba są tym samym znakiem, po odjęciu otrzymujemy liczbę ujemną, ale na szczęścietake
je również akceptuje i po prostu nic nie bierze.źródło
Perl 5 ,
-F
46 bajtówWypróbuj online!
źródło
P,E,T,A
zamiastT,A,P,E
, ale teraz zauważam, że użyłeś((P,E,T,A)x7)[2..-$^H+($^H=ord)
zamiast((T,A,P,E)x7)[0..-$^H+($^H=ord)-2
zapisać dwa bajty. Niezła odpowiedź!^H
(\x08
)!do$0
), ale tutaj są tylko 2 bajty, więc nie zawracałem sobie głowyPython 2 ,
968780 bajtówWypróbuj online!
źródło
Haskell , 64 bajty
Obsługuje ciągi wielkich lub małych liter, ale nie oba.
Wypróbuj online!
źródło
C, 84 bajtów
Wypróbuj online!
C (uruchamiany z wiersza polecenia systemu Windows), 81 bajtów
Wynik:
źródło
Python 3 , 98 bajtów
Wypróbuj online!
-1 bajt dzięki Asone Tuhid
źródło
Scala , 66 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
PHP , 85 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
JavaScript,
131127 bajtów4 bajty zapisane dzięki Rickowi Hitchcockowi.
Rozwinięty
Mój problem polega na tym, że JavaScript nie ma czystego sposobu na uzyskanie odległości między znakiem a i b.
źródło
charCodeAt
do zmiennej:z=(a=>[...a].reduce((x,y)=>x+[...Array((f=y[c='charCodeAt']()-x.slice(-1)[c]())>1?f-1:0)].reduce((e,r,t)=>e+"TAPE"[t%4],"")+y))
Python 2/3 ,
7069 bajtówWypróbuj online!
źródło
Węgiel drzewny , 20 bajtów
Wypróbuj online! Wyjaśnienie:
źródło
Pip , 29 bajtów
Pobiera dane wejściowe jako argument wiersza polecenia (małe lub wielkie litery, nie ma znaczenia). Wypróbuj online!
Wyjaśnienie
źródło
JavaScript (ES6),
8078 bajtówOdległość między dwoma znakami można określić, przekształcając ich konkatenację w podstawę 36, odejmując 370, moduł 37.
Na przykład
(parseInt('cy',36)-370)%37 == 22
.Następnie możemy użyć
padEnd
do wypełnienia luk i rekurencji do obsługi pętli.Przypadki testowe:
Pokaż fragment kodu
źródło
K4 , 48 bajtów
Rozwiązanie:
Przykłady:
Wyjaśnienie:
Dość proste rozwiązanie, ale duża liczba bajtów ... Znajdź delty, pobierz z ciągu
"TAPE"
, dołącz do oryginalnego cięcia ciągu, w którym delty są> 1.źródło
Excel VBA, 106 bajtów
Anonimowa funkcja bezpośredniego okna VBE, która pobiera dane jako ciąg wielkich liter przez komórkę
A1
i wysyła je do bezpośredniego okna VBE.źródło
Ruby ,
5953 bajtówWypróbuj online!
W rzeczywistości jest to dość proste - bierzemy dane wejściowe,
dzieląc nasz ciąg znaków natablicę znaków (dzięki Asone Tuhid za wskazanie tego) i stosujemy operację redukcji, w której uzasadniamy każdy znak do wymaganej długości, używając „TAPE” jako łańcucha wypełniającego.źródło
K (oK) , 33 bajty
Wypróbuj online!
{ }
funkcja anonimowa z argumentemx
-':x
odejmij każdy poprzedni (użyj wyimaginowanego 0 przed pierwszym elementem)1_
upuść pierwszy przedmiot0,
wstawić 0-1+
dodaj -10|
max (0, ...)(
...)#\:"TAPE"
przekształć ciąg"TAPE"
do każdego elementu z listy po lewej stronie(
...),'x
dołączaj odpowiedni znakx
do każdego przekształconego łańcucha,/
połącz wszystkieźródło
Rubinowy ,
78 77 6462 bajtów-1 bajt dzięki Kevin Cruijssen
Wypróbuj online!
źródło
ord-l[-1].ord-1
naord+~l[-1].ord
. Ładna odpowiedź. +1 ode mnieJava (JDK) , 91 bajtów
Wypróbuj online!
Wyjaśnienie
Kredyty
var
źródło
int p=123
uratuje jedną postać. Nie ma znaczenia, cop
jest w pierwszej iteracji, o ile jest ona większa lub równa pierwszej postaci. Największa wartość, jaką może mieć pierwszy znak, to'z'
== ASCII122
, więc 123 jest wystarczająco dobre. Ponadto, jeśli użyłeś wielkich liter, możesz użyć 91 zamiast 123, oszczędzając inną postać.C # (.NET Core) ,
122111 bajtówZaoszczędź 11 bajtów dzięki @KevinCruijssen
Wypróbuj online!
Wyjaśnienie:
źródło
while
Dofor
i usuwanie nawiasów:for(int i=1,e,d;i<s.Length;r+=s[i++])for(e=d=s[i]-s[i-1];d-->1;r+=t[(e-d)%4]);
. :) Aha, i skoro używaszt="ETAP"
tylko raz, można go używać bezpośrednio, a zmianastring
navar
zaoszczędzenie 7 więcej bajtów:s=>{var r=""+s[0];for(int i=1,e,d;i<s.Length;r+=s[i++])for(e=d=s[i]-s[i-1];d-->1;r+="ETAP"[(e-d)%4]);return r;}
.Yabasic , 119 bajtów
Anonimowa funkcja, która pobiera dane wejściowe jako ciąg wielkich liter i wysyła je do STDOUT.
Wypróbuj online!
źródło
Python 3, 90 bajtów
Wypróbuj online
źródło
**title**
do#title
. Czy zechcesz dodać link TryItOnline z kodem testowym?Clojure,
139119 bajtówAnonimowa funkcja, która pobiera ciąg znaków i zwraca taśmę. Jak zawsze, Clojure nie wydaje się zbyt dobrze działać. To, czego tak naprawdę nie udało mi się wypracować, to pobranie następnego znaku w skrócie. Na ostatnim znaku dostanę
OutOfBoundsException
oczywisty powód. Więc obejdęcycle
to. Może jest bardziej eleganckie rozwiązanie.Bez golfa
Aktualizacja
Udało się uniknąć kilku bajtów. Pozbyłem się nieznośnego
if
stwierdzenia, zmniejszając różnicę.take
tworzy pustą listę, jeśli liczba wynosi 0 lub mniej, co z kolei skutkuje pustym łańcuchem.Bez golfa
źródło
APL (Dyalog Classic) , 30 bajtów
Wypróbuj online!
{ }
funkcja anonimowa z argumentem⍵
⎕a⍳⍵
znajdź indeksy jego znaków w alfabecie2-/
różnice par (poprzedni minus następny)1+
dodaj 1-
negować0⌈
max (0, ...)0,
wstawić 0⍴∘'TAPE'¨
zmieniaj cyklicznie ciąg'TAPE'
dla każdego⍵,¨⍨
dołączaj każdy znak z argumentu do odpowiedniego przekształconego łańcucha∊
spłaszczyćźródło
CJam ,
2725 bajtówWypróbuj online!
Daleko, daleko od innych języków golfowych, ale i tak jestem z tego dumny.
Wyjaśnienie
źródło
Łuska ,
2625 bajtówWypróbuj online!
źródło
PowerShell , 72 bajty
Wypróbuj online!
źródło
Java,
213166153 bajtówspróbuj online
Proszę, pomóż mi to ulepszyć.
Dzięki @cairdcoinheringaahing za wskazówkę dotyczącą białych znaków. Dzięki @RM za wskazówkę na sznurku taśmy. Dzięki @KevinCruijssen za wskazówki dotyczące lambda i wyrażeń.
źródło
"TAPETAPETAPETAPETAPETAPET".substring...
.int a=1,l=i.length;a<=l;a++
może byćint a=0,l=i.length;++a<=l;
,char u=i[a-1];o+=u;if(a<l){char n=
może byćchar u=i[a-1],n;o+=u;if(a<l){n=
,(n-u)
nie potrzebuje nawiasu in-u-1
może byćn+~u
. Ponadto twoja odpowiedź jest obecnie fragmentem zamiast funkcji. Aby była lambda, musisz dodaći->{
z przodu i}
na końcu. Łącznie: wypróbuj online. 153 bajty