1
0
Fork 0

Add /r/dailyprogrammer Challenge #287 [Easy]

This commit is contained in:
Nguyễn Gia Phong 2016-10-12 22:16:44 +07:00
parent 9d40b667d4
commit cf7269205b
4 changed files with 281 additions and 0 deletions

64
daily/287easy/README.md Normal file
View File

@ -0,0 +1,64 @@
# [[2016-10-10] Challenge #287 [Easy] Kaprekar's Routine](https://www.reddit.com/r/dailyprogrammer/comments/56tbds/20161010_challenge_287_easy_kaprekars_routine/)
## Description
Write a function that, given a 4-digit number, returns the largest digit in
that number. Numbers between 0 and 999 are counted as 4-digit numbers with
leading 0's.
largest_digit(1234) -> 4
largest_digit(3253) -> 5
largest_digit(9800) -> 9
largest_digit(3333) -> 3
largest_digit(120) -> 2
In the last example, given an input of `120`, we treat it as the 4-digit number
`0120`.
*Today's challenge is really more of a warmup for the bonuses. If you were able
to complete it, I highly recommend giving the bonuses a shot!*
## Bonus 1
Write a function that, given a 4-digit number, performs the "descending digits"
operation. This operation returns a number with the same 4 digits sorted in
descending order.
desc_digits(1234) -> 4321
desc_digits(3253) -> 5332
desc_digits(9800) -> 9800
desc_digits(3333) -> 3333
desc_digits(120) -> 2100
## Bonus 2
Write a function that counts the number of iterations in Kaprekar's Routine,
which is as follows.
Given a 4-digit number *that has at least two different digits*, take that
number's descending digits, and subtract that number's ascending digits. For
example, given `6589`, you should take `9865 - 5689`, which is `4176`. Repeat
this process with `4176` and you'll get `7641 - 1467`, which is `6174`.
Once you get to 6174 you'll stay there if you repeat the process. In this case
we applied the process 2 times before reaching 6174, so our output for `6589`
is `2`.
kaprekar(6589) -> 2
kaprekar(5455) -> 5
kaprekar(6174) -> 0
Numbers like 3333 would immediately go to 0 under this routine, but since we
require at least two different digits in the input, all numbers will eventually
reach 6174, which is known as Kaprekar's Constant. Watch
[this video](https://www.youtube.com/watch?v=d8TRcZklX_Q) if you're still
unclear on how Kaprekar's Routine works.
What is the largest number of iterations for Kaprekar's Routine to reach 6174?
That is, what's the largest possible output for your `kaprekar` function, given
a valid input? Post the answer along with your solution.
*Thanks to [/u/BinaryLinux](https://www.reddit.com/u/BinaryLinux) and
[/u/Racoonie](https://www.reddit.com/u/Racoonie) for posting the idea behind
this challenge in
[/r/daliyprogrammer_ideas](https://www.reddit.com/r/daliyprogrammer_ideas)!*

79
daily/287easy/kaprekar.c Normal file
View File

@ -0,0 +1,79 @@
#include <stdio.h>
char a[4];
char largest_digit(short n)
{
char m = n / 1000;
if (m < n % 1000 / 100)
m = n % 1000 / 100;
if (m < n % 100 / 10)
m = n % 100 / 10;
return (m < n % 10) ? n % 10 : m;
}
void sort_digits(short n)
{
char i, j;
a[0] = n / 1000;
a[1] = n % 1000 / 100;
a[2] = n % 100 / 10;
a[3] = n % 10;
for (i = 0; i < 3; i++)
for (j = i + 1; j < 4; j++)
if (a[i] < a[j]) {
a[i] += a[j];
a[j] = a[i] - a[j];
a[i] -= a[j];
}
}
short desc_digits(short n)
{
sort_digits(n);
return a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3];
}
short asc_digits(short n)
{
sort_digits(n);
return a[3] * 1000 + a[2] * 100 + a[1] * 10 + a[0];
}
unsigned long long kaprekar(short n)
{
char i;
for (i = 0; n ^ 6174; i++)
n = desc_digits(n) - asc_digits(n);
return i;
}
int main()
{
printf("largest_digit(1234) -> %hhd\n", largest_digit(1234));
printf("largest_digit(3253) -> %hhd\n", largest_digit(3253));
printf("largest_digit(9800) -> %hhd\n", largest_digit(9800));
printf("largest_digit(3333) -> %hhd\n", largest_digit(3333));
printf("largest_digit(120) -> %hhd\n\n", largest_digit(120));
printf("desc_digits(1234) -> %hd\n", desc_digits(1234));
printf("desc_digits(3253) -> %hd\n", desc_digits(3253));
printf("desc_digits(9800) -> %hd\n", desc_digits(9800));
printf("desc_digits(3333) -> %hd\n", desc_digits(3333));
printf("desc_digits(120) -> %hd\n\n", desc_digits(120));
printf("kaprekar(6589) -> %lld\n", kaprekar(6589));
printf("kaprekar(5455) -> %lld\n", kaprekar(5455));
printf("kaprekar(6174) -> %lld\n", kaprekar(6174));
return 0;
}

View File

@ -0,0 +1,98 @@
type
aos = array[0 .. 3] of shortint;
function largest_digit(n: smallint): shortint;
var
m: shortint;
begin
m := n div 1000;
if m < n mod 1000 div 100 then
m := n mod 1000 div 100;
if m < n mod 100 div 10 then
m := n mod 100 div 10;
if m < n mod 10 then
exit(n mod 10)
else
exit(m)
end;
function sorted_digits(n: smallint): aos;
var
a: aos;
i, j: shortint;
begin
a[0] := n div 1000;
a[1] := n mod 1000 div 100;
a[2] := n mod 100 div 10;
a[3] := n mod 10;
for i := 0 to 2 do
for j := i + 1 to 3 do
if a[i] < a[j] then
begin
inc(a[i], a[j]);
a[j] := a[i] - a[j];
dec(a[i], a[j])
end;
exit(a)
end;
function desc_digits(n: smallint): smallint;
var
a: aos;
begin
a := sorted_digits(n);
exit(a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3])
end;
function asc_digits(n: smallint): smallint;
var
a: aos;
begin
a := sorted_digits(n);
exit(a[3] * 1000 + a[2] * 100 + a[1] * 10 + a[0])
end;
function kaprekar(n: smallint): qword;
var
i: shortint = 0;
begin
while n <> 6174 do
begin
n := desc_digits(n) - asc_digits(n);
inc(i)
end;
exit(i)
end;
begin
writeln('largest_digit(1234) -> ', largest_digit(1234));
writeln('largest_digit(3253) -> ', largest_digit(3253));
writeln('largest_digit(9800) -> ', largest_digit(9800));
writeln('largest_digit(3333) -> ', largest_digit(3333));
writeln('largest_digit(120) -> ', largest_digit(120));
writeln;
writeln('desc_digits(1234) -> ', desc_digits(1234));
writeln('desc_digits(3253) -> ', desc_digits(3253));
writeln('desc_digits(9800) -> ', desc_digits(9800));
writeln('desc_digits(3333) -> ', desc_digits(3333));
writeln('desc_digits(120) -> ', desc_digits(120));
writeln;
writeln('kaprekar(6589) -> ', kaprekar(6589));
writeln('kaprekar(5455) -> ', kaprekar(5455));
writeln('kaprekar(6174) -> ', kaprekar(6174))
end.

40
daily/287easy/kaprekar.py Executable file
View File

@ -0,0 +1,40 @@
#!/usr/bin/env python3
def largest_digit(n):
return int(max(str(n)))
def desc_digits(n):
return int(''.join(sorted('{:04}'.format(n), reverse=True)))
def asc_digits(n):
return int(''.join(sorted('{:04}'.format(n))))
def kaprekar(n):
i = 0
while n != 6174:
n = desc_digits(n) - asc_digits(n)
i += 1
return i
if __name__ == '__main__':
print('largest_digit(1234) -> {}'.format(largest_digit(1234)))
print('largest_digit(3253) -> {}'.format(largest_digit(3253)))
print('largest_digit(9800) -> {}'.format(largest_digit(9800)))
print('largest_digit(3333) -> {}'.format(largest_digit(3333)))
print('largest_digit(120) -> {}\n'.format(largest_digit(120)))
print('desc_digits(1234) -> {}'.format(desc_digits(1234)))
print('desc_digits(3253) -> {}'.format(desc_digits(3253)))
print('desc_digits(9800) -> {}'.format(desc_digits(9800)))
print('desc_digits(3333) -> {}'.format(desc_digits(3333)))
print('desc_digits(120) -> {}\n'.format(desc_digits(120)))
print('kaprekar(6589) -> {}'.format(kaprekar(6589)))
print('kaprekar(5455) -> {}'.format(kaprekar(5455)))
print('kaprekar(6174) -> {}'.format(kaprekar(6174)))