Jako informatycy prawdopodobnie wszyscy znacie podstawowe operacje na listach pop i push . Są to proste operacje, które modyfikują listę elementów. Czy słyszałeś jednak o flopie operacji ? (jak w flip- flopie )? To całkiem proste. Biorąc pod uwagę liczbę n , odwróć pierwsze n elementów listy. Oto przykład:
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> a.flop(4)
[4, 3, 2, 1, 5, 6, 7, 8, 9, 10]
Fajną rzeczą w operacji flop jest to, że możesz jej używać do robienia fajnych rzeczy na liście, takich jak sortowanie . Z flopami zrobimy coś podobnego:
Biorąc pod uwagę listę liczb całkowitych, „Neighbor it”. Innymi słowy, posortuj go tak, aby każdy zduplikowany element pojawiał się kolejno.
Można to zrobić za pomocą klap! Na przykład weź następującą listę:
>>> a = [3, 2, 1, 4, 3, 3, 2]
>>> a.flop(4)
[4, 1, 2, 3, 3, 3, 2]
>>> a.flop(3)
[2, 1, 4, 3, 3, 3, 2]
>>> a.flop(6)
[3, 3, 3, 4, 1, 2, 2]
To prowadzi nas do zdefiniowania dzisiejszego wyzwania:
Biorąc pod uwagę listę liczb całkowitych, wypisz dowolny zestaw klap, które spowodują, że lista będzie sąsiadować.
Korzystając z ostatniej listy jako przykładu, powinieneś wypisać:
4
3
6
ponieważ wyrzucenie listy o 4, następnie o 3, a następnie o 6 spowoduje wyświetlenie listy sąsiadów. Pamiętaj, że nie musisz drukować najkrótszej możliwej listy klap sąsiadujących z listą. Jeśli wydrukowałeś:
4
4
4
3
1
1
6
2
2
zamiast tego nadal byłby to prawidłowy wynik. Jednak nigdy nie można wypisać liczby większej niż długość listy. Wynika to z faktu, że w przypadku listy a = [1, 2, 3]
dzwonienie a.flop(4)
jest bezsensowne.
Oto kilka przykładów:
#Input:
[2, 6, 0, 3, 1, 5, 5, 0, 5, 1]
#Output
[3, 7, 8, 6, 9]
#Input
[1, 2]
#Output
<any list of integers under 3, including an empty list>
#Input
[2, 6, 0, 2, 1, 4, 5, 1, 3, 2, 1, 5, 6, 4, 4, 1, 4, 6, 6, 0]
#Output
[3, 19, 17, 7, 2, 4, 11, 15, 2, 7, 13, 4, 14, 2]
#Input
[1, 1, 1, 1, 2, 2, 2, -1, 4]
#Output
[]
#Input
[4, 4, 8, 8, 15, 16, 16, 23, 23, 42, 42, 15]
#Output
[12, 7]
Należy pamiętać, że w każdym z tych przykładów podany wynik to tylko jeden potencjalny prawidłowy wynik. Jak powiedziałem wcześniej, każdy zestaw flopów, który sąsiaduje z podaną listą, jest prawidłowym wyjściem . Możesz użyć tego skryptu Pythona, aby sprawdzić, czy dana lista klap poprawnie sąsiaduje z listą.
Możesz pobierać dane wejściowe i wyjściowe w dowolnym rozsądnym formacie. Na przykład poprawne są argumenty funkcji / wartość zwracana, STDIN / STDOUT, odczyt / zapis pliku itp. Jak zwykle jest to gra w golfa , więc stwórz możliwie najkrótszy program i baw się dobrze! :)
źródło
Odpowiedzi:
Haskell ,
9871 bajtówWypróbuj online!
Wyjaśnienie
Dla listy długości
n
ta metoda daje2*n
klapy. Działa, patrząc na ostatni element listy, szukając tego samego elementu na liście przed i odwracając go do drugiej do ostatniej pozycji. Następnie lista z usuniętym ostatnim elementem jest rekurencyjnie „sąsiadowana”.Dla listy
[1,2,3,1,2]
algorytm działa w następujący sposób:Wszystko razem daje klapy
[2,4,0,3,1,2,0,1,0,0]
i listę sąsiadów[3,1,1,2,2]
.źródło
Wolfram Language (Mathematica) , 71 bajtów
Wypróbuj online!
Jak to działa
Biorąc pod uwagę tablicę długości
n
, generuje sekwencję4n
klap, które sortują tablicę w kolejności rosnącej: w szczególności umieszczanie duplikatów elementów obok siebie.Chodzi o to, że aby posortować tablicę, przesuwamy jej największy element na koniec, a następnie sortujemy pierwsze
n-1
elementy tablicy. Aby uniknąć implementacji operacji flop, przesuwamy największy element na koniec w sposób, który nie zakłóca pozostałych elementów:Ogólnie rzecz biorąc, jeśli największy element jest na swoim miejscu
i
, sekwencja klap, która przesuwa go do końca, toi, n, n-1, i-1
.źródło
i, n
. Dlaczego więc robiszn-1, i-1
? Nie ma potrzeby stabilnego sortowania.Python 2 , 69 bajtów
Wypróbuj online!
źródło
Galaretka ,
1917 bajtówSortuje listę.
Wypróbuj online!
źródło
ỤŒ¿’Æ!‘ṚĖµUż’ṚF
odwrotne sortowanie, ponieważŒ¿
jest moduloL!
.[4, 3, 2, 1, 3]
. Bummer.Ụ>Ṫ$ƤSạỤĖµUż’ṚF
oszczędzając 2 bajty, zastępując łącze pomocnicze.Czysty , 88 bajtów
Myślę, że jest prawdopodobnie krótszy ze strażnikami, ale jeszcze go nie znalazłem.
Wypróbuj online!
Jako funkcja dosłowna. Działa tak samo jak odpowiedź Haskell Laikoni , ale grał nieco inaczej w golfa i oczywiście w innym języku.
źródło
JavaScript, 150 bajtów
Wypróbuj online!
JavaScript, 151 bajtów
Wypróbuj online!
Oba zasadniczo sortują tablicę, przewracając maksymalną liczbę na początek, a następnie przewracając ją do tyłu, powtarzając to z pozostałą tablicą. Pierwszy wykorzystuje redukcję, drugi używa pętli for.
Nie golfowany:
źródło
Perl 5.10 (lub wyższy), 66 bajtów
Obejmuje
+3
dla-n
The,use 5.10.0
aby doprowadzić język do poziomu perl 5.10 jest uważany za darmowyUruchom z wejściem jako jedną linię na STDIN:
Sortuje listę, wielokrotnie znajdując inwersję, przewracając ją do przodu, a następnie przewracając i odwracając wszystko z powrotem do swojej starej pozycji.
Zaskakująco trudno było znaleźć się w tym samym parku, co Python :-)
źródło
C (gcc) ,
165160 bajtówźródło