Jeśli chodzi o jedzenie cukierków, trzymam się wyższych standardów niż typowy laik. Istnieje delikatna równowaga między „pomieszaniem” a „zachowaniem tego, co najlepsze na koniec”.
W tym wyzwaniu otrzymasz ciąg znaków, w którym każda postać reprezentuje kawałek cukierka. Różne znaki (z uwzględnieniem wielkości liter) reprezentują różne rodzaje cukierków. Twój program musi następnie ustalić prawidłową kolejność konsumpcji słodyczy, zgodnie z poniższą procedurą. Możesz napisać albo pełny program (STDIN / STDOUT), albo nazwaną funkcję, aby wykonać to zadanie.
Powiedzmy, że moja skrytka z cukierkami jest oroybgrbbyrorypoprr
. Najpierw sortuję cukierki na stosy tego samego typu, z większymi ilościami na górze, używając niższych wartości znaków ASCII jako elementu rozstrzygającego.
rrrrrr
oooo
bbb
yyy
pp
g
Następnie biorę każdy rząd cukierków i układam je równo w odstępie czasu. Na przykład, jeśli są 3 kawałki cukierków, jedna jest umieszczana 1/3 drogi, 2/3 drogi i na końcu.
.r.r.r.r.r.r
..o..o..o..o
...b...b...b
...y...y...y
.....p.....p
...........g
Następnie idę w dół każdej kolumny, aby stworzyć mój ostateczny rozkaz cukierków, rorbyroprbyorrobypg
.
Wkład
Sznurek zawierający skrytkę z cukierkami. Dane wejściowe dla powyższego przykładu mogły być następujące:
oroybgrbbyrorypoprr
Wydajność
Sznurek zawierający cukierki zreorganizowany w prawidłowej kolejności konsumpcji.
rorbyroprbyorrobypg
Punktacja
To jest kod golfowy. Najkrótsza odpowiedź w bajtach wygrywa. Obowiązują standardowe zasady gry w golfa.
Odpowiedzi:
CJam,
78 68 61 45 42 39 3130 bajtówBierze ciąg wejściowy przez STDIN
Zainspirowany podejściem rekurencyjnym, ale trochę innym. Nie ma potrzeby transpozycji ani prostokąta!
Jak to działa:
(Smutne, że CJam nie może już ukończyć Pyth'a z powodu potrzeby tak dużego wzdęcia jak składni)
Wypróbuj tutaj
źródło
{_@_@{_@\%}h;/*}
z:
.Pyth , 25
Wykorzystuje zupełnie nowy algorytm, zainspirowany tą odpowiedzią .
Krok po kroku:
Najpierw posortowaliśmy postacie według ich pospolitości, powiązania zerwane alfabetycznie. Jest
o_/zZSz
.o
jest taki sam jak Pythonsorted(<stuff>,key=<stuff>)
, z wyrażeniem lambda dla klucza, tyle że zachowuje go jako ciąg znaków.Następnie generujemy listę prefiksów tego ciągu, od długości
len(z)
do długości 1.>
jest równoważna pythonowi<stuff>[<int>:]
.Następnie zmieniamy kolejność tej listy ciągów prefiksów według położenia ułamkowego, gdzie 0 oznacza lewą krawędź, a 1 prawą, pierwszego znaku prefiksu na układzie prostokątnym widocznym w pytaniu.
/NhN
zlicza, ile razy pierwszy znak w prefiksie występuje w prefiksie, a jednocześnie/zhN
podaje liczbę wystąpień pierwszego znaku w prefiksie w ciągu jako dziury. Przypisuje to każdemu prefiksowi prowadzonemu przez każdą postać w grupie inną frakcję, od1/k
skrajnego prawego wystąpienia tego znaku dok/k
skrajnego lewego. Zmiana kolejności listy prefiksów o ten numer daje odpowiednią pozycję w układzie. Więzy są zrywane przy użyciu wcześniejszego zamówienia, które najpierw było zliczane, a następnie alfabetycznie, zgodnie z życzeniem.Na koniec musimy wyodrębnić pierwszy znak z każdego ciągu prefiksu, połączyć je w jeden ciąg i wydrukować. Wyodrębnianie pierwszych znaków to
hC
.C
wykonuje transpozycję macierzy na liście, faktyczniezip(*x)
w Pythonie 3.h
wyodrębnia pierwszy wiersz wynikowej macierzy. Jest to właściwie jedyny wiersz, ponieważ obecność prefiksu 1 znaku uniemożliwia utworzenie innych kompletnych wierszy.s
sumuje znaki w tej krotce w pojedynczy ciąg. Drukowanie jest niejawne.Test:
Przyrostowe elementy programu na
oroybgrbbyrorypoprr
:Stara odpowiedź:
Pyth , 34
Ten program działa na zasadzie obliczania, ile razy ma być replikowana określona lista podrzędna. Wygląda na to lista podrzędna
['', '', '', '', ... , 'r']
. Całkowita długość tej podlisty jest iloczynem liczby wystąpień wszystkich innych cukierków, to jestu*G/zHS{-zd1
. Pełna lista podrzędna jest konstruowana poprzez replikację listy pustego łańcucha,]k
wiele razy, a następnie usuwanie i wstawianiet
oraz dodawanie nazwy cukierka na końcu za pomocą+d
.Wtedy to sub-lista jest powtórzone tyle razy, że cukierek znajduje się w wejściu,
/zd
zapewniając każdej listy cukierek jest jednakowej długości.Teraz, gdy ta funkcja jest odwzorowana na wszystkie unikalne cukierki w odpowiedniej kolejności sortowania (
o_/zNS{z
), mamy prostokąt podobny do tego w pytaniu, ale z pustymi ciągami zamiast kropek. Wykonanie transpozycji macierzy (C
), po której następują dwa sumy (ss
), daje końcowy ciąg znaków.Weryfikacja:
źródło
Perl 5 - 62
61 kod + 1 flaga.
Najpierw podziel dane wejściowe na tablicę znaków -
/./g
.Dodaj indeks występowania do każdej litery, pozostawiając liczby w zmiennych
$a
.. za$z
pomocąmap++$$_.$_
. Teraz tablica jest:Następnie przekonwertuj go na klucz sortowania konkatenujący: współczynnik
$_/$$1
, licznik remisów~$_
i wyłącznik remisów wartości ASCII$_
. Spowoduje to (tutaj z dodanymi spacjami dla przejrzystości).Można to sortować według kolejności leksykograficznej (domyślnej). Na koniec wyodrębnij ostatni znak i wydrukuj:
print map/(.$)/
źródło
Python 3.x - 124 bajty
źródło
Mathematica,
123119118 bajtówDefiniuje nazwaną funkcję
f
. Nie golfowany:Korzystanie z wbudowanych typów wymiernych wydawało się dobrym pomysłem. Oczywiście nie jest to nigdzie blisko CJam. Zasadniczo reprezentuję siatkę pokazaną w wyzwaniu jako listę par. Pierwszą rzeczą w parze jest kod znaku, a drugą jego pozycja jako ułamek mniejszy lub równy 1 (ostatnia kolumna to 1). Po upewnieniu się, że poszczególne postacie są już we właściwej kolejności, muszę tylko posortować to stabilnie według wspomnianej frakcji, aby uzyskać pożądany wynik.
źródło
Pyth 45
47 48 51Niemal na pewno można by dalej grać w golfa;)
Działa poprzez budowanie listy list, gdzie każda wewnętrzna lista jest rzędem pustych ciągów i nazwą cukierka. Ta lista jest transponowana, a następnie łączone listy wewnętrzne, a następnie dołączane są te listy.
Dzięki @isaacg za przypomnienie mi o sumie!
źródło
s
na liście ciągów działa jakoj""
.APL: 38
Wyjaśnienie:
Można przetestować na tryapl.org
źródło
R - 166 znaków
wersja bez golfa
Wyjaśnienie:
order
jest stabilny w sortowaniu, więc zachowa najczęstszą / leksykalną kolejność nazewnictwa, gdy remis w indeksie, szczególnie ważny w przypadku ostatnich cukierków)Matrycowa natura problemu sprawiła, że pomyślałem, że R może mieć na to szansę, ale najlepszą dosłowną interpretacją algorytmu, jaką mogłem zrobić, było 211 znaków:
bez golfa:
źródło
Pyth, 29 bajtów
To jest bezpośrednie tłumaczenie mojej odpowiedzi CJam w Pyth
Wypróbuj online tutaj
Za tym rozwiązaniem kryje się dość długa historia, a @isaacg bardzo mi pomógł w zrozumieniu tego nowego języka.
Idealnie jest to dokładne tłumaczenie słowa do słowa mojego kodu CJam ( 17 bajtów ):
co znaczy:
Ale niestety Python nic nie zwraca
+=
wywołaniu, więc nie był to prawidłowy kod Pythona, dlatego też jest to niepoprawny kod Pythona, tak jak w Pyth, lambda może być tylko instrukcją return.Potem przejrzałem różne metody i w końcu odkryłem, że Python
list.append
zwracaNone
wartość, której mogę użyć. Tworzenie kodu ( 19 bajtów ):co znaczy:
Niestety, obsługa
a
(append) została usunięta z Pytha, a wersja, która ją obsługuje, nie obsługujeo
.Aktualizacja:
a
obsługa Pythona została teraz ponownie dodana, aby powyższy 19-bajtowy kod działał w kompilatorze online. Ale ponieważ jest to nowa funkcja, która została dodana po OP, nie przedstawiam jej jako mojego wyniku i nie pozwalam na kod 29-bajtowy jako rozwiązanie.Dlatego musiałem polegać na surowym Pythonie, tworząc kod
źródło