> #!/usr/bin/env Rscript > > #' --- > #' title: "Lösungsversuch zum Scripting-Contestaufgabe von inne zum Thema Kaprekar-Konstante" > #' author: "tegula" > #' date: "07 11 2022" > #' output: html_document > #' --- > > #' ------------------------ > #' ------------------------ > > # Aufgabenstellung ( https://debianforum.de/forum/viewtopic.php?p=1313040#p1313040 ): "Hallo, auf Intagram habe ich von der Kaprekar-Konstante gehört, und fand es eine schöne Aufgabe ein Skript zu schreiben, das die Behauptung, es gäbe die Kaprekar-Konstante für alle vierstelligen Zahlen prüft. Darum wollte ich diese Aufgabe hier vorstellen. Interessant ist das vor allem, wenn man vorher die Kaprekar-Konstanten noch nicht kannte. Behauptung ist also, dass die Kaprekar-Konstante für alle vierstelligen Zahlen 6174 ist. Um die Kaprekar-Konstante zu berechnen nimmt man eine vierstellige Zahl z.B. 2134 und sortiert die einzelnen Ziffern einmal absteigend, so dass daraus die größt mögliche Zahl entsteht und einmal aufsteigend so dass daraus die kleinstmögliche Zahl entsteht. Also hier 4321 und 1234. Aus diesen Zahlen errechnet man die Differenz, in dem man die keinere Zahl von der größeren Zahl subtrahiert. 4321-1234=3087 Ist das Ergebnis wie hier nicht 6174, nimmt man die Differenz/Das Erbeniss, füllt ggf. führenen Nullen an, damit wieder vier Stellen vorhanden sind und berechnet mit dieser Zahl nochmal neu. Das macht man solange, bis das Ergebnis 6174 ist. PS: Es gibt Ausnahmen, wo diese Behauptung nicht zutrifft. Für dreistellige Zahlen ist die Kaprekar-Konstante übrigens 495 und für zweistellige Zahlen gibt es eine Kaprekar-Konstanten-Folge die immer 81, 63, 27, 45, 9, 81, ... ist. Einstellige Zahlen zeigen nochmal warum es Ausnahmen gibt, wo diese Behauptung nicht zutrifft. Hier ist der Wikipedia Auszug dazu: https://de.wikipedia.org/wiki/Kaprekar-Konstante " > > ## Zu überprüfende Behauptung: "[D]ie Kaprekar-Konstante [ist] für alle vierstelligen Zahlen 6174". > > #' ------------------------ > #' ------------------------ > > # Zusätzliche R-Packages laden > library(tidyverse) ?? Attaching packages ?????????????????????????????????????? tidyverse 1.3.0 ?? ? ggplot2 3.3.3 ? purrr 0.3.4 ? tibble 3.0.6 ? dplyr 1.0.4 ? tidyr 1.1.2 ? stringr 1.4.0 ? readr 1.4.0 ? forcats 0.5.1 ?? Conflicts ????????????????????????????????????????? tidyverse_conflicts() ?? ? dplyr::filter() masks stats::filter() ? dplyr::lag() masks stats::lag() Warnmeldungen: 1: replacing previous import ?lifecycle::last_warnings? by ?rlang::last_warnings? when loading ?tibble? 2: replacing previous import ?lifecycle::last_warnings? by ?rlang::last_warnings? when loading ?pillar? 3: replacing previous import ?lifecycle::last_warnings? by ?rlang::last_warnings? when loading ?hms? > library(magrittr) Attache Paket: ?magrittr? The following object is masked from ?package:purrr?: set_names The following object is masked from ?package:tidyr?: extract > > #' ------------------------ > #' ------------------------ > > # Funktion definieren: Ziffern absteigend sortieren (-> größte Zahl) > sort_digits_decr <- function(x) { + x %>% + as.character() %>% + str_pad(width = 4, pad="0") %>% + str_split(pattern = "", simplify = TRUE) %>% + str_sort(decreasing = TRUE) %>% + str_c(collapse = "") %>% + as.integer() %>% + return() + } > > #' ------------------------ > #' ------------------------ > > # Funktion definieren: Ziffern aufsteigenden sortieren (--> kleinste Zahl) > sort_digits_incr <- function(x) { + x %>% + as.character() %>% + str_pad(width = 4, pad="0") %>% + str_split(pattern = "", simplify = TRUE) %>% + str_sort(decreasing = FALSE) %>% + str_c(collapse = "") %>% + as.integer() %>% + return() + } > #sort_digits_incr(93) > > > #' ------------------------ > #' ------------------------ > > # Funktion definieren: Berechnen der Kaprekar-Konstante > > kaprekar <- function(x) { + # Kontrollieren, ob es sich um eine vierstellige Zahl handelt. Falls nein: NA (fehlenden Wert) zurückgeben. + if (x < 1000 | x > 9999) { + return(NA) + } + # Die aufsteigende Sortierung (kleinste Zahl) von der absteigenden Sortiertung (größte Zahl) abziehen, bis entweder 6174 (Kaprekar-Konstante für vierstellige Zahl) oder 7 Rechneschritte (maximal Anzahl an Rechenschritten für eine vierstellige Zahl) erreicht ist. + input = x + for (i in 1:7) { + if (input == 6174) { + break + } + else { + input = sort_digits_decr(input) - sort_digits_incr(input) + } + } + return (input) + } > > > #' ------------------------ > #' ------------------------ > > > # Alle Vierstelligen Zahlen: > numbers <- seq(from = 1000, + to = 9999, + by = 1) > > # Vierstellige Schnapszahlen: > repdigits <- c(1111, + 2222, + 3333, + 4444, + 5555, + 6666, + 7777, + 8888, + 9999) > ### Vierstelligen Zahlen _ohne_ Schnapszahlen: > numbers_without_repdigits <- numbers[!numbers %in% repdigits] > > #' ------------------------ > #' ------------------------ > > > # Vermutung überprüfen: Für alle vierstelligen Zahlen, deren Ziffern nicht identisch sind (d.h. die keine Schnapszahlen sind), beträgt die Kaprekar-Konstante 6174. > sapply(X = numbers_without_repdigits, + FUN = kaprekar) %>% + summary() Min. 1st Qu. Median Mean 3rd Qu. Max. 6174 6174 6174 6174 6174 6174 > > # Für diejenige vierstelligen Zahlen, deren Ziffern identisch sind (d. h die Schnapszahlen sind), beträgt die Kaprekar-Konstante 0. > sapply(X = repdigits, + FUN = kaprekar) %>% + summary() Min. 1st Qu. Median Mean 3rd Qu. Max. 0 0 0 0 0 0 > > #' ------------------------ > #' ------------------------ > > > # SCHLUSSFOLGERUNG: Folgende Vermutungen haben sich bestätigt. > > ## 1.) Für alle vierstelligen Zahlen, deren Ziffern nicht identisch sind (d.h. die keine Schnapszahlen sind), beträgt die Kaprekar-Konstante 6174. > > ## 2.) Für diejenige vierstelligen Zahlen, deren Ziffern identisch sind (d. h die Schnapszahlen sind), beträgt die Kaprekar-Konstante 0. > > #' ------------------------ > #' ------------------------ > > # [ENDE] >