Jeśli kiedykolwiek próbowałeś dodać etykiety do naprawdę gęstej działki, zdasz sobie sprawę, że czasami etykiety nakładają się na siebie, co utrudnia ich czytanie. Zrobimy coś podobnego, ale w 1D.
Dane wejściowe będą sekwencją (label, x-coordinate)
par, a dane wyjściowe będą wynikiem losowania każdego punktu i etykiety w podanej kolejności. Gwiazdka *
reprezentująca punkt powinna być umieszczona na danej współrzędnej x, a etykieta powinna następować. Wszelkie istniejące postacie zostaną zastąpione.
Na przykład, jeśli dane wejściowe były
Hello 0
World 8
Fizz 3
Buzz 5
PPCG 16
X 9
Wtedy miałyby miejsce następujące zdarzenia:
*Hello
*Hello *World
*He*Fizz*World
*He*F*Buzzorld
*He*F*Buzzorld *PPCG
*He*F*Buz*Xrld *PPCG
Ostateczny wiersz powinien być następnie wyprowadzony.
Zasady we / wy
Dane wejściowe mogą składać się z dowolnej liczby par. Każda etykieta będzie składać się wyłącznie z wielkich i małych liter, a długość etykiety będzie wynosić maksymalnie 127 znaków. Każda współrzędna x będzie zawierać się między 0 a 127 włącznie.
Dane wejściowe mogą być w dowolnym dogodnym formacie listy lub ciągu, tak że pary są jednoznaczne, a etykiety / współrzędne x zmieniają się na wejściu. Na przykład format podobny do
[("Hello", 0), ("World", 8) ...]
lub[0 "Hello" 8 "World" ...]
jest w porządku. Nie można jednak zakładać dwóch osobnych list etykiet i współrzędnych x.Funkcje i pełne programy są w porządku.
Wszelkie miejsca nie pokryte etykietą powinny być reprezentowane spacją. Jednak nie może istnieć żadna obca wiodąca lub końcowa biała spacja oprócz pojedynczej opcjonalnej końcowej nowej linii.
Przykłady
Wkład:
OneLabel 10
Wydajność:
*OneLabel
Wkład:
Heathrow 0
Edinburgh 2
London 4
Liverpool 6
Oxford 8
Wydajność:
*H*E*L*L*Oxfordl
Wkład:
alpha 20
beta 4
gamma 57
delta 3
epsilon 22
zeta 32
eta 53
theta 27
Wydajność:
*delta *a*epsi*thetazeta *eta*gamma
Wkład:
abc 5
d 5
abc 10
ABCDEFGHIJKLMNOPQRSTUVWXYZ 127
Wydajność:
*dbc *abc *ABCDEFGHIJKLMNOPQRSTUVWXYZ
Pamiętaj, że etykiety i / lub współrzędne X mogą się powtarzać.
Odpowiedzi:
CJam,
242319 bajtówOdczytuje to dane wejściowe jako tablicę CJam par etykiet współrzędnych.
Wypróbuj to skrzypce w interpretatorze CJam lub zweryfikuj wszystkie przypadki testowe jednocześnie.
Dzięki @ MartinBüttner za pomoc w oszczędzaniu 4 bajtów!
Jak to działa
źródło
Pyth, 20 bajtów
Wypróbuj online: pakiet demonstracyjny lub testowy
Wyjaśnienie
źródło
JavaScript ES6, 104 bajty
Przykładowe użycie
Dane wejściowe do zgodnej konsoli:
Dane wyjściowe z ostatniej instrukcji:
Wyjaśnienie
Tworzy to anonimową funkcję od
c
trzech wyrażeń, które zostały logicznie połączone AND. Pierwsze dwa stwierdzenia są zawsze prawdziwe, a reguły zwarcia JS mówią, że gdy pierwsze jest prawdziwe, zwracaj całą wartość po prawej stronie (bez zmuszania do logicznej wartości): więc jest to formalnie równoważne zPierwsza instrukcja musi być owinięta w nawiasy powyżej, ponieważ operator przypisania
=
ma niższy priorytet niż operator logiczny AND&&
.Zespół „parametru odpoczynku”
..."*"+v
jest również częścią ES6; konkatenuje odprowadzenie*
do łańcucha, a następnie interpretuje go jako parametr podobny do listy, dzieląc go na kilka argumentów, które są dostarczaneArray.prototype.splice
, które pobierają(m, n, ...rest)
i modyfikują jego tablicę w pozycjim
celu usunięcian
elementów, a następnie wstawia wszystkierest
argumenty. Aby to zrobić przed ES6, użyłbyś bardziej kłopotliwej:Tablica jest następnie łączona z pustym ciągiem, a końcowe białe znaki są usuwane.
źródło
Python 2, 67 bajtów
Przyjmuje dane wejściowe jak
[('Heathrow', 0), ('Edinburgh', 2), ('London', 4), ('Liverpool', 6), ('Oxford', 8)]
i drukuje wynik.Python nie zezwala na modyfikowanie ciągów, a konwersja do i z listy jest kosztowna. To odtwarza ciąg,
z
aby dodać nowe słowo. Bierzemyb
znaki przed słowem, dopełniając w razie potrzeby spacjami, następnie nowy tekst z gwiazdką, a następnie częśćz
po nowym słowie. Pamiętaj, że końcowe spacje nigdy nie są dodawane.reduce
Wersja 3 znaków dłużej (70):źródło
Ruby,
948175 bajtówGra w golfa:
Oto nielepszy kod:
Dzięki @ w0lf za sugestie dotyczące mapowania danych wejściowych!
Dzięki @ w0lf i @Nie że Charles za myśl o usunięciu zmiennej.
źródło
puts
ją$><<
(co nie wymaga dodatkowej przestrzeni)..chomp
można go usunąć..to_i
stanie. Dobra myśl. Dzięki @ w0lf!s[int, int]
formularza zamiasts[range]
1 oszczędności char.JavaScript 121 znaków
Korzystanie z niestandardowych funkcji działa w przeglądarce Firefox.
x=Array(255).fill(" ");eval(prompt()).map(s=>{s[0].split``.map((n,i)=>x[s[1]+i+1]=n);x[s[1]]="*"});x=x.join``.trimRight()
Starsza wersja:
x=Array(255).fill(" ");eval(prompt()).map(s=>{s[0].split``.map((n,i)=>x[s[1]+i+1]=n);x[s[1]]="*"});x=x.join``.replace(/ +$/,"")
źródło
/ +/
ma o wiele większy sens niż\s
rozczarowanie, że za tym tęskniłem! Czy możesz zaoszczędzić bajty przy użyciux=' '.repeat(255);
i unikaniu.join
?.split('')
było stworzyć zmienną strukturę danych, ale w tym momencieArray(255).fill(' ')
jest ono krótsze. W mojej wersji większość moich oszczędności pochodzi z (a) użycia reguły „możesz podać funkcję lub program” do usunięciaeval(prompt())
w zamianc=>
i (b) za pomocą wbudowanejArray.prototype.slice
metody z parametrem rest, aby nieco skrócić część logiczną .[].map.call(s[0],
nie oszczędza też ...Python, 85 bajtów
Wypróbuj online
źródło
'z'[2::5]
(backsticks zamiast apostrofów) zamiast''.join(z)
zapisywać jeden bajt, a przejściez=[' ']*256
do parametrów powinno uratować inny. Także myślę, że można zmienićreturn
naprint
.p=input()
(Python 2) zamiast funkcji, co pozwala uniknąć wcięć. Ponadtob+len(a)+1
może byćb-~len(a)
for a,b in input():
.Perl, 66 bajtów
63 bajty skryptu + 3 bajty na
-p
Nic specjalnego, wykorzystującego zmienne
$`
i$'
które są „przed meczem” i „po meczu”, odpowiednio, zamiast dzielenia ciąg. Użyłem$}
zmiennej dla ciągu, ponieważ początkowo oszczędzał mi bajt, ale już nie!Przykładowy przebieg:
Perl, 65 bajtów
62 bajty skryptu + 3 bajty na
-p
Kolejna wersja, która wypisuje każdą linię (o jeden bajt mniej!). (Tak, zrobiłem to, ponieważ nie przeczytałem poprawnie pytania ...)
Przykładowy przebieg:
źródło
PHP - 84 bajty
Używa kodów specjalnych ANSI do pozycjonowania kursora (
\x1b[XG
zawierającego znak Escape, a X jest współrzędną 1), a*
następnie łańcuch wejściowy dla tego wiersza. Akceptuje dane wejściowe w wierszu polecenia formularza:Akceptuje wpisy zawierające wiele słów, jeśli są w cudzysłowach, ponieważ są to argumenty wiersza poleceń.
źródło
C ++ 11, 95 bajtów
Dlaczego nie?
Jako funkcję odbieraj dane wejściowe jako
map<int, string>
nazwanev
zawierające pozycję i ciąg znaków.Stosowanie
Sprawdź, czy działa tutaj
źródło