Dlaczego liczba 6174 jest tak interesująca? Zgodnie z definicją Wikipedii
- Weź dowolny czterocyfrowy numer, używając co najmniej dwóch różnych cyfr. (Zera wiodące są dozwolone.)
- Ułóż cyfry w kolejności rosnącej, a następnie malejącej, aby uzyskać dwie czterocyfrowe liczby, dodając w razie potrzeby zera na początku.
- Odejmij mniejszą liczbę od większej liczby.
- Wróć do kroku 2.
Powyższy proces, znany jako rutyna Kaprekara, zawsze osiągnie 6174 w maksymalnie 7 iteracjach. Po osiągnięciu 6174 proces będzie go nadal uzyskiwał.
Napisz program, który uruchamia procedurę Kaprekara względem podanej czterocyfrowej liczby (patrz definicja powyżej), wypisując każdy krok procedury.
Zasady:
- Zgłoszenia muszą być kompletnymi programami.
- Wejście należy odczytać ze standardowego wejścia. Przesyłanie z echa jest prawidłowe.
- Dane wejściowe powinny mieć postać liczbową.
- Wymagane jest wydrukowanie zer wiodących. (Zobacz przykłady poniżej.)
- W ostatnim wierszu należy podać, ile iteracji było potrzebnych. Wymagana jest interpunkcja.
Przykłady:
> 2607
7620 - 0267 = 7353
7533 - 3357 = 4176
7641 - 1467 = 6174
Iterations: 3.
> 1211
2111 - 1112 = 0999
9990 - 0999 = 8991
9981 - 1899 = 8082
8820 - 0288 = 8532
8532 - 2358 = 6174
Iterations: 5.
> 6174
7641 - 1467 = 6174
Iterations: 1.
Każdy język programowania jest mile widziany. Dodatkowe punkty dla ezoterycznych + mała nagroda.
Aktualizacja 1 : Istnieje już podobne pytanie .
Aktualizacja 2 : Dodano przykład dla 6174 jako danych wejściowych. Dzięki Peter Taylor za powiadomienie.
code-golf
repeated-transformation
sequence
Łunohodow
źródło
źródło
Odpowiedzi:
Perl -
147143134130129126129128126EDYCJA: Teraz jest zgodny ze skrzynką 6174, kosztem kilku znaków ... uciekaj
echo -n <number> | perl kaprekar.pl
EDYCJA: W końcu z powrotem do miejsca, w którym byłem wcześniej: D
źródło
Ruby 1.9, 122 znaków
Przykładowe wywołanie:
Policzyłem
-ln
flagę jako 4 znaki (różnica między normalnym wywołaniemruby kaprekar.rb
aruby -ln kaprekar.rb
).źródło
ruby -lp kaprekar.rb
. Wpisano liczbę i wcisnął <Enter>, ale wynikiem jest sama wprowadzona liczba. Najwyraźniej czegoś mi brakuje ... Proszę doradzić, jak korzystać ze skryptu.6174
jako dane wejściowe, co niestety zwiększa to rozwiązanie do 128 znaków.echo 1234 | ruby kaprekar.rb
podnosi ostrzeżenie i kończy się błędemundefined method 'chars' for nil:NilClass (NoMethodError)
. Wykonanieecho 1234 | ruby -lp kaprekar.rb
powoduje tylko ostrzeżenie i działa zgodnie z oczekiwaniami. Dane wyjściowe nie są zgodne z oczekiwaniami, ponieważ zawierają komunikat ostrzegawczykaprekar.rb:3: warning: regex literal in condition
Python, 141 znaków
źródło
;
s.while n-6174
. Brak spacji międzyprint
i cytatem.Golfscript, 74 znaki
źródło
Haskell,
197192182181 znakówźródło
r
is
zapisuje 2 znaki. Również „000” jest zbędne. „0” wystarczy. Daje nam to 188 znaków. Dziwię się,interact
że tu nie pomaga. Zwykle tak jest.show x++s
zshows x s
zysków 2 więcej bajtów. 186 teraz.|k>0
) można się pozbyćf
. Dalsza zmiana nazwyg
pozwala%
nam uzyskać 182 znaki.> <> -
268308Niewiele pretenduje do golfa, ale pisanie było fajne. :)
Uruchom z./fish.py kaprekar.fish -v <number>
EDYCJA: Teraz pobiera dane wejściowe z STDIN.
źródło
JavaScript,
189182165 znakówPodziękowania dla DocMax:
Oryginalny:
Nie golfowany:
źródło
n != 6174
na,n-6174
ponieważ zwróci zero, co jest fałszem (przynajmniej w C i Pythonie).while(n.length<4)
jewhile(!n[3])
.n+'\n'
jest dodawany, aby uniknąć warunkowego i dodatkowego\n
, c) używa temp, aby uniknąć sekwencji łączenia-podziału-łączenia, d) wykorzystuje fakt, że wystarczy tylko dodać jedno „0” dla dopełnienia:for(n=prompt(i=0,o=e='');n-6174;i++,o+=(n=(b=n.split(e).sort(),a=b.join(e),b).reverse().join(e))+' - '+a+' = '+(n=('0'+(n-a)).slice(-4))+'\n');alert(o+"Iterations: "+i+'.')
powinno to być 172 znaki.i
wynosi 0 (+4), ale połączyłem to zi++
. Niestety, powoduje to błąd o jeden błąd, więc zmieniłem przyrost na zmniejszenie, a następnie na końcu użyłem trochę sztuczek (-1). Następnie zmieniłemi=0,o=e=''
nai=o=e=''
(-2), sformatowałemfor
pętlę, aby uniknąć dodatkowych nawiasów (-1), rozszerzyłem(b=...,a=...,b)
bit (-2) i zakradłem sięa=b.join
doreverse()
wywołania (-1). A więc 169, nieźle!PowerShell, 125
128130131Przechodzi wszystkie przypadki testowe z pytania.
źródło
JavaScript, 260 bajtów
źródło
Clojure, 256 znaków
źródło
Scala 2.9, 194 znaków
Wykorzystuje cechę aplikacji ze Scali 2.9.
Edycja: daje poprawne wyjście dla początkowego wejścia 6174.
źródło
PHP, 215
259276postacieNie golfowany:
źródło
abs
,max
orazmin
funkcje, ponieważ ten rodzaj będzie zawsze oznacza, że$b
jest większy niż$a
. To może uratować cię 20ish postaci. Myślę też, że umieszczenie sortowania wewnątrz pętli u góry oznacza, że musisz go tylko raz umieścić w kodzie, co pozwoli Ci zaoszczędzić kolejne 9.<?function k($c){echo"> $c\n";$n=str_split(str_pad($c,4,0,0));for(;$k-6174;$z++){sort($n);$a=join($n);$b=strrev($a);$k=str_pad($b-$a,4,0,0);echo"$b - $a = $k\n";$n=str_split($k);}echo"Iterations: $z\n";}
Możesz zapisać 12 znaków, zmieniającfor
instrukcję, wywołując ją jako funkcję i używającjoin
zamiast niejimplode
.CoffeeScript,
233225 znakówWypróbuj tutaj lub z instrukcjami tutaj .
źródło
0
(zgodnie z sugestią) lub kliknięcie przycisku Anuluj powoduje, że Safari zawiesza się.Scala 276
Scala 283
diff:
źródło
GAWK - 152 znaki
To jest wersja GNU awk. Może nie działać z innymi wersjami nie-GNU.
źródło
awk: calling undefined function asort
. Wersja Awk to 20070501 działająca na OSX 10.6.7. Nie zapomnij.
o liczbie powtórzeń.9992 - 2999 = 6993
Ruby, 179 znaków, ale i tak publikowanie
źródło
PERL
źródło
K, 104
Przypadki testowe
źródło
Matematyka,
314291 znakówTo jest program, kaprekar.m: -
Ustawianie ścieżki przed uruchomieniem: -
Uruchamianie programu: -
źródło
PHP , 160 bajtów
Wypróbuj online!
Kompletny program, wejście jest
STDIN
uruchomione zphp -nF
.Wydajność
źródło
Rdza - 375 bajtów
Przedstawiam to jako możliwą „górną granicę”, wzywam każdego do znalezienia języka, w którym rozsądna implementacja tego jest dłuższa - ponieważ w tym nie ma nic zbędnego, ale także nic nawet oczywistego, co by go znacznie zmniejszyło. Rdza polega na tym, że do odczytania ze standardowego wejścia i przetworzenia na liczbę całkowitą potrzeba około 120 znaków. „Och, ale potem użyj reprezentacji ciągu” ... ale jestem w 99% pewien, że byłoby to jeszcze dłuższe
źródło
Flaga Perl 6- n, 105 bajtów
Wypróbuj online!
W końcu muszę użyć mojej
{}...*
sztuczki, ponieważ musimy mieć co najmniej jedną iterację dla 6174. Nie jestem pewien, dlaczego potrzebuję dodatkowego owijania.&{ }
wokół sekwencji, co jest trochę do bani.Wyjaśnienie:
źródło