2009-08-19 15 views
5

Próbuję utworzyć łatwy skrypt w Pythonie, który pobiera liczbę i zapisuje zmienną, sortując cyfry w porządku rosnącym i malejącym i zapisując obie w osobnych zmiennych. Implementacja Kaprekar's constant.Jak posortować cyfry w liczbie?

To prawdopodobnie całkiem nieobliczalne pytanie. Ale jestem nowy w tym i nie mogłem znaleźć niczego w Google, które mogłoby mi pomóc. Witryna, którą znalazłem, próbowała wyjaśnić sposób korzystania z list, ale nie wyszło zbyt dobrze.

+2

Jeśli jest to kwestia pracy domowej (który go brzmi jak), powinieneś być na tyle uczciwy, aby oznaczyć go jako taki, a także wyjaśnić, co próbowałem do tej pory i gdzie się nie udało. – balpha

+0

To nie jest praca domowa.Znalazłem artykuł na Wikipedii: http://pl.wikipedia.org/wiki/6174 i chcę zrobić mały skrypt, który oblicza go automatycznie. Szkoda, że ​​nie mam szkoły, w której mogłabym nauczyć się Pythona lub przynajmniej bardziej wydajnego programowania, ale utknąłem z Google (nie na tym, że się skarżyłem) i cokolwiek zdołam wydusić z dokumentacji Pythona. Jeśli był to projekt domowy, oznaczałbym go jako jeden. Ale tak nie jest. – bleakgadfly

+1

@DreamCodeR: Jasne, proszę, nie obrażaj się. – balpha

Odpowiedz

11

Sortuj cyfry w wstępujących i zstępujących zamówienia:

ascending = "".join(sorted(str(number))) 

descending = "".join(sorted(str(number), reverse=True)) 

tak:

>>> number = 5896 
>>> ascending = "".join(sorted(str(number))) 
>>> 
>>> descending = "".join(sorted(str(number), reverse=True)) 
>>> ascending 
'5689' 
>>> descending 
'9865' 

A jeśli trzeba je mieć numery ponownie (nie tylko struny), Call int() na nich:

>>> int(ascending) 
5689 
>>> int(descending) 
9865 
+5

ah, ale uwielbiam python. –

+0

'malejąco = rosnąco [:: - 1]' –

+0

przy okazji, timsort to O (n) w takich przypadkach –

3
>>> x = [4,5,81,5,28958,28] # first list 
>>> print sorted(x) 
[4, 5, 5, 28, 81, 28958] 
>>> x 
[4, 5, 81, 5, 28958, 28] 
>>> x.sort() # sort the list in place 
>>> x 
[4, 5, 5, 28, 81, 28958] 
>>> x.append(1) # add to the list 
>>> x 
[4, 5, 5, 28, 81, 28958, 1] 
>>> sorted(x) 
[1, 4, 5, 5, 28, 81, 28958] 

Tyle inni zwrócili uwagę, można sortować Szereg przodu jak:

>>> int(''.join(sorted(str(2314)))) 
1234 

to dość dużo najbardziej standardowy sposób.

Odwrócić numer? Nie działa dobrze w liczbie z końcowymi zerami.

>>> y = int(''.join(sorted(str(2314)))) 
>>> y 
1234 
>>> int(str(y)[::-1]) 
4321 

[::-1] notacja wskazuje, że iterowalny ma być wykonywany w odwrotnej kolejności.

+0

+1. Aby uzyskać kolejność malejącą, użyj argumentu kluczowego "odwróć": x.sort (odwrócony = prawda), posortowany (..., odwrócony = prawdziwy) –

+0

Jedynym problemem jest to, że mam jedną dużą liczbę, np. 5896, które należy posortować jako 5689 i 9865. Jest to tylko jedna duża liczba. – bleakgadfly

+0

Chcesz posortować cyfry liczb? – hughdbrown

1

Nie znam składni Pythona, ale myślę ogólnie, chciałbym przekonwertować Wprowadź ciąg znaków do tablicy znaków, dokonują sortowania w tablicy znaków, a na koniec wypróżniają ją.

2

Jak Mark Rushakoff już wspomniał (ale nie rozwiązał) w swojej odpowiedzi, str(n) nie obsługuje liczbowych n z wiodącymi zerami, które są potrzebne do Kaprekar's operation. Odpowiedź hughdbrown podobnie nie działa z zerami wiodącymi.

Jednym ze sposobów upewnienia się, że masz czteroznakowy ciąg, jest użycie metody łańcuchowej zfill. Na przykład:

>>> n = 2 
>>> str(n) 
'2' 
>>> str(n).zfill(4) 
'0002' 

Należy również pamiętać, że w wersjach Pythona przed 3, zerem w numerycznej dosłownym wskazanym ósemkowym:

>>> str(0043) 
'35' 
>>> str(0378) 
    File "<stdin>", line 1 
    str(0378) 
     ^
SyntaxError: invalid token 

W Pythonie 3, 0043 nie jest ważny literał literalny w ogóle.

0

Oto odpowiedź na pytanie tytułowe w Perlu, z tendencją do sortowania 4-cyfrowych liczb dla algorytmu Kaprekar. W tym przykładzie zastąp "przesunięcie" liczbą do posortowania. sortuje to cyfry w numerze 4-cyfrowy z wiodącymi 0 w ($ ASC jest posortowana w porządku rosnącym, $ grudnia jest malejąca), i wysyła numer z wiodącymi 0 na:

my $num = sprintf("%04d", shift); 
my $asc = sprintf("%04d", join('', sort {$a <=> $b} split('', $num))); 
my $dec = sprintf("%04d", join('', sort {$b <=> $a} split('', $num))); 
Powiązane problemy