Użytkownicy wcięć w przestrzeni, łączcie się ! Musimy walczyć ze wszystkimi małymi użytkownikami kart !
Twoim zadaniem (jeśli zdecydujesz się to zaakceptować) jest napisanie programu lub funkcji, która przyjmuje dwa argumenty:
- Ciąg: To jest dane wejściowe.
- Dodatnia liczba całkowita: liczba spacji na tabulator.
Musisz przejść przez każdą linię łańcucha i zastąpić każdą tabulację używaną do wcięcia podaną liczbą spacji, a każdą tabulację nieużywaną do wcięcia (np. W środku linii) jedną spacją.
Zauważ, że linie takie jak \t \tabc
niezdefiniowane zachowanie; zostały one wstawione przez użytkowników karty zła, aby skomplikować twoje programy.
Według Tabs Must Die Society, twój program musi być tak krótki, jak to możliwe, aby uniknąć wykrycia przez złych użytkowników kart.
Przykład
\t
służy tutaj do reprezentowania kart.
Ciąg wejściowy:
a
\t\tb\tc
d
Wpisz numer:
4
Wydajność:
a
b c
d
Środkowa linia była wcięta 8 spacjami, po 4 na tabulację (ponieważ podana liczba to 4).
Ciąg wejściowy:
\ta\t\tb
Wpisz numer:
4
Wydajność:
a b
UWAGA: To nie duplikat wyzwanie ekspansji zakładka ; wymaga bardzo innego formatu wejściowego i nieco innych wymagań.
źródło
\ta\t\tb
,4
(moja poprzednia wersja była jego braku jeden)Odpowiedzi:
CJam,
302423 bajtówZwykle odmawiam zamieszczania złośliwego kodu w Internecie…
Jest to pełny program, który wczytuje ciąg ze STDIN i liczbę jako argument wiersza poleceń.
Wypróbuj online w interpretatorze CJam .
Jak to działa
Co
NA=
robi:Dla pierwszego znaku
N
będzie zawierać jego wartość domyślną, tj"\n"
. Ciąg .Dla wszystkich kolejnych znaków
N
będzie zawierał wynik ostatniej iteracji, tj. Ostatni znak z wejścia, znak spacji lub ciąg jednej lub więcej spacji.Jeśli
N
jest łańcuchem,NA=
wybiera element o indeksie 10 N (zawijanie). Wynikiem będzie spacja lub znak przesunięcia wiersza. Oba są prawdą.Jeśli N jest znakiem,
NA=
popycha 1, aby przesunąć linię, a 0 w przeciwnym razie.Z tego powodu
NA=
przesunie prawdziwą wartość dla pierwszego znaku, znaku poprzedzonego linią znaków lub znaku poprzedzonego ciągiem spacji (wcięcie, które zostało już zastąpione).We wszystkich pozostałych przypadkach (w tym tabulator, który został zastąpić spacją charakteru ),
NA=
będzie apelować wartość falsy.źródło
K5,
5345 bajtówW akcji:
Chcę tylko, aby dokumentacja wykazała, że to pytanie jest moralnie naganne.
źródło
... this question is morally reprehensible.
`0:
i „\ n” \ `.Perl, 23 bajty
Kod 22 bajtów + wiersz poleceń 1 bajt
Mam nadzieję, że nie jest zbyt bezczelny, aby przyjąć, że dane liczbowe można podać za pomocą parametru -i! Upewnij się, że \ t w poniższym kodzie zastąpiono rzeczywistym znakiem tabulacji.
Przykład użycia:
Lub dla wygody:
Wyjaśnienie:
Użycie
-p
argumentu spowoduje wykonanie programu dla każdej linii na wejściu, a następnie wydrukowanie wyniku na końcu.W powyższym przykładzie podstawienie wyrażenia regularnego zastępuje
\G\t
się" "x4
(spacja powtórzona czterokrotnie).\G
jest mało znaną konstrukcją wyrażeń regularnych, która pasuje do pozycji pierwszego dopasowania, jeśli pierwsza iteracja, lub z pozycji poprzedniego dopasowania, jeśli nie jest to pierwsza iteracja, co oznacza, że zastąpi tylko wszystkie tabulatory na początku łańcucha i będzie rób to jeden po drugim. Poy/\t/ /
prostu zamienia wszystkie pozostałe zakładki spacjami.źródło
Julia,
6959 bajtówNie golfowany:
Zaoszczędziłem 10 bajtów i naprawiłem problem dzięki Glen O!
źródło
"hello\t\t1"
?"\t \t"
sytuacji), można to zrobić:,f(s,n)=(r=replace)(r(s,r"^\t*"m,i->" "^endof(i)n),"\t"," ")
który używa funkcji zastępowania i przechwytuje wszystkie tabulacje wcięcia za jednym razem.Haskell, 82 bajty
Więc
g 3 "a\n\t\tb\tc\nd"
robi to.źródło
Mathematica,
4237 bajtówDzięki @ LegionMammal978 za wiele sugestii dotyczących oszczędzania kodu. Pierwszy parametr
#
dotyczy tekstu wejściowego, drugi parametr -#2
liczby spacji na tabulatorze.źródło
Table[" ",{#2}]
na," "~Table~{#2}
aby zapisać bajt. Dlaczego umieszczaszStringJoin
na nim pusty ciąg?Ruby 49 bajtów
źródło
JavaScript (ES6), 70
Używając ciągów szablonów, nowa linia jest znacząca i zliczana
Przetestuj poniższy fragment kodu w przeglądarce Firefox.
źródło
CoffeeScript, 72 bajty
(Próbowanie gry w golfa co najmniej 2 kolejne brania, aby pokonać rozwiązanie ES6 ... Pomoc doceniona: D)
Stosowanie:
źródło
Siatkówka, 42 bajty
Wszystkie wystąpienia
.
są spacjami, wszystkie\t
są literami (1 bajt) i<empty>
reprezentują pusty plik. To tylko dla czytelności. Nie jestem też do końca pewien, czy poprawnie wykonuję pętlę, ale tak myślę. Każda linia powinna być umieszczona we własnym pliku. Dodałem 1 bajt dla każdego dodatkowego pliku.Zakłada się, że wejście ma wartość Unary w swoim własnym wierszu na końcu wejścia.
Wyjaśnienie
Dodaję
_
przed wejściem Unary, aby rozgraniczać je podczas zamiany, aby nie usuwać żadnych ciągów wejściowych z ciągu wejściowego. Następnie zastępuję wszystkie tabulatory nie na początku wiersza pojedynczym odstępem. Następnie zapętlam, usuwając pojedynczy1
i dodając pojedynczą spację po każdej karcie, aż zabraknie danych wejściowych. Na koniec sprzątam usuwając zakładki i podkreślenia.źródło
Python,
7268 bajtówTabulatory to dosłowne tabulatory (1 bajt), więc
r'...'
nie są potrzebne. Niestety, Python wymaga podglądu / podglądu o stałej szerokości, więc nie mogę go używać(?<!^|\t)
. Używa prawie tej samej metody, co moje rozwiązanie Retina.źródło
Stax , 20 bajtów
Uruchom i debuguj
Ten program odczytuje pierwszy wiersz jako szerokość wcięcia, a resztę danych wejściowych jako program.
źródło
Japt v2.0a0, 17 bajtów
Spróbuj
źródło
Haskell , 75 bajtów
Wypróbuj online! Zakłada się, że dane wejściowe zawierają tylko drukowalne znaki, a także tabulatory i znaki nowej linii, co dopuszcza OP w komentarzach.
Wyjaśnienie:
Funkcja zewnętrzna
#
pobiera ciągs
i liczbęm
i wywołuje wewnętrznie zdefiniowaną#
funkcję lokalną z tymi samymi argumentami. Odbywa się to w celu śledzenia pierwotnejm
wartości, ponieważ#
funkcja wewnętrzna zmienia liczbę:('\t':r)#n=(' '<$[1..n])++r#n
Jeśli napotkasz kartę, zastąp jąn
spacjami i pozostawn
bez zmian.(x:r)#n=x:r#(m^sum[1|x<' '])
Jeślix
napotkasz kartę, która nie jest kartą, zachowaj ją taką, jaka jest, ale ustawn
oryginalną liczbę,m
jeślix
jest to nowa linia, lub w1
przeciwnym razie. Odbywa się to poprzezm^sum[1|x<' ']
:m
przeniesienie do potęgi,sum[1|x<' ']
która ocenia,1
kiedyx
jest mniejsza niż spacja (tj. Nowa linia), więc otrzymujemym^1 = m
. W przeciwnym razie jest0
i mamym^0 = 1
.źródło
Java 11, 134 bajty
Wypróbuj online.
UWAGA: Java 11 nie jest jeszcze w TIO, więc
" ".repeat(n)
została emulowana jakorepeat(" ",n)
zamiast (z tą samą liczbą bajtów).Wyjaśnienie:
źródło