Martin Puppe

Notizen

Knobeln mit Clojure

| Comments

Das ZEITmagazin enthält regelmäßig unter der Überschrift “Logelei” ein Logikrätsel. Neulich hatte ich Ausgabe Nummer 14/2016 vor mir liegen. Der vollständige Text ist hier zu finden. Ich fasse die wesentlichen Punkte zusammen. Gesucht wird die Kombination für ein Zahlenschloss. Das Zahlenschoss hat sechs Ziffern. Die gesuchte Zahl muss die folgenden Bedingungen erfüllen:

  1. Die Zahl ist durch 4 teilbar.
  2. Die Zahl ist rückwärts ebenfalls durch 4 teilbar.
  3. Die Zahl ist durch 7 teilbar.
  4. Die Zahl ist nicht durch 11 teilbar.
  5. Die Quersumme der Zahl beträgt 32.
  6. Jede Ziffer kommt in der Zahl entweder doppelt oder gar nicht vor.

Nun habe ich erst versucht das Rätsel nur mit Papier und Stift zu lösen. Leider ist Zahlentheorie nicht meine Stärke und mein Wissen erschöpfte sich im konkreten Fall in dem Fakt, dass es reicht die letzten beiden Ziffern einer Zahl zu betrachten, um zu überprüfen, ob sie durch 4 teilbar ist. Also habe ich stattdessen meinen Laptop zur Hand genommen und eine Clojure-REPL geöffnet. Ich habe mir die nötigen Funktionen definiert und schließlich alles zusammengestöpselt. So war das Rätsel trotz Brute-Force-Ansatz relativ schnell gelöst.

Heute habe ich alles noch mal ordentlich aufgeschrieben.Zusätzlich habe ich noch ein paar Tests geschrieben. Den gesamten Quellcode habe ich auf Github veröffentlicht. Bitte schön!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
(ns zahlenschloss.core
  (:gen-class))

(defn teilbar?
  "Gibt `true` zurück, genau dann wenn `n` durch `x` teilbar ist."
  [x n]
  (= 0 (mod n x)))

(doseq [x [4 7 11]]
  (intern *ns*
          (symbol (str "teilbar" x "?"))
          (partial teilbar? x)))


(defn ziffern
  "Nimmt eine Zahl `n` und gibt die Folge der Ziffern der Zahl zurück."
  [n]
  (loop [n n
         ziffern (list)]
    (if (= n 0)
      ziffern
      (recur (int (/ n 10)) (conj ziffern (mod n 10))))))

; http://stackoverflow.com/a/5058544
(defn- exp [x n]
  "Berechnet x hoch n."
  (reduce * (repeat n x)))

(defn wert
  "Nimmt eine Folge von Ziffern und berechnet ihren Zahlenwert."
  [ziffern]
  (loop [summe 0
         faktor (exp 10 (dec (count ziffern)))
         [ziffer & ziffern] ziffern]
    (if ziffer
      (recur
        (+ summe (* ziffer faktor))
        (/ faktor 10)
        ziffern)
      summe)))

(defn links-auffuellen
  "Nimmt eine Folge von Ziffern und füllt sie, falls nötig, links mit
  Nullen auf, sodass das Ergebnis aus mindestens sechs Ziffern besteht."
  [ziffern]
  (loop [laenge (count ziffern)
         ziffern ziffern]
    (if (>= laenge 6)
      ziffern
      (recur
        (inc laenge)
        (conj ziffern 0)))))

(defn rueckwaerts
  "Nimmt eine Zahl und dreht die Folge ihrer Ziffern um. Dabei wird
  angenommen, dass die Zahl mindestens sechsstellig ist. Das Ergebnis
  ist daher mindestens auch sechsstellig."
  [n]
  (wert (reverse (links-auffuellen (ziffern n)))))

(defn quersumme
  "Berechnet die Quersumme der Zahl `n`."
  [n]
  (apply + (ziffern n)))

(defn zaehle-ziffern
  "Zählt, wie oft die einzelnen Ziffern in der Zahl `n` vorkommen. Es
  wird angenommen, dass `n` mindestens sechsstellig ist."
  [n]
  (reduce
    (fn [m ziffer]
      (assoc m ziffer (inc (get m ziffer 0))))
    {}
    (links-auffuellen (ziffern n))))

(defn doppelt-oder-gar-nicht?
  "Gibt `true` zurück, genau dann wenn jede Ziffer in der Zahl doppelt
  oder gar nicht vorkommt. Es wird angenommen, dass `n` mindestens
  sechsstellig ist."
  [n]
  (if (some #(not= % 2) (vals (zaehle-ziffern n)))
    false
    true))

(defn -main
  [& args]
  (println "Mögliche Lösung(en):")
  (apply
    println
    (->> (range 0 1000000)
         ; Die Zahl ist durch 4 teilbar.
         (filter teilbar4?)
         ; Die Zahl ist rückwärts ebenfalls durch 4 teilbar.
         (filter #(teilbar4? (rueckwaerts %)))
         ; Die Zahl ist durch 7 teilbar.
         (filter teilbar7?)
         ; Die Zahl ist nicht durch 11 teilbar.
         (filter (complement teilbar11?))
         ; Die Quersumme der Zahl beträgt 32.
         (filter #(= 32 (quersumme %)))
         ; Jede Ziffer kommt entweder doppelt oder gar nicht vor.
         (filter doppelt-oder-gar-nicht?)
         ; Wir geben maximal 10 Zahlen aus.
         (take 10))))

Fundstücke 44/2015

| Comments

Automatic Face Recognition and Surveillance
“We need limitations on how our images can be collected without our knowledge or consent, and on how they can be used. The technologies aren’t going away, and we can’t uninvent these capabilities. But we can ensure that they’re used ethically and responsibly, and not just as a mechanism to increase police and corporate power over us.”

Schaffen wir das?
‘Die Formel “nach Maßgabe der Möglichkeiten” ist also, als verfassungsrechtliche Formel, die Verweisung entweder auf ein intellektuelles Nichts oder auf nichts als die politische Willkür. Und sonst wirklich nichts!’

Hardcore History 56 Kings of Kings
Eine neue Folge von Dan Carlins “Hardcore History”.

Frazey Ford - Done
Neulich bei detektor.fm entdeckt.

Fundstücke 39/2015

| Comments

How to Write a Git Commit Message
Ein paar gute Hinweise.

What Happens Next Will Amaze You
“State surveillance is driven by fear. And corporate surveillance is driven by money. The two kinds of surveillance are as intimately connected as tango partners. They move in lockstep, eyes rapt, searching each other’s souls. The information they collect is complementary. By defending its own worst practices, each side enables the other. Today I want to talk about the corporate side of this partnership.”

Zitat am Freitag: Was wirklich gegen Erkältung hilft
tl;dr: Ausreichend schlafen beugt Erkältungen vor.

Fundstücke 38/2015

| Comments

Why Futurism Has a Cultural Blindspot
‘“Futurology is almost always wrong,” the historian Judith Flanders suggested to me, “because it rarely takes into account behavioral changes.” And, she says, we look at the wrong things: “Transport to work, rather than the shape of work; technology itself, rather than how our behavior is changed by the very changes that technology brings.” It turns out that predicting who we will be is harder than predicting what we will be able to do.’

Inside Amazon: Wrestling Big Ideas in a Bruising Workplace
Ich werde mich in Zukunft vermehrt nach Alternativen zu Amazon umsehen.

Alternativlos, Folge 35
“In Alternativlos Folge 35 reden wir über Diskurs- und Debattenkultur und die Facebook-Löschdebatte.”

Aynotchesh Yererfu by The Budos Band

Fundstücke 37/2015

| Comments

The Inspection Paradox is Everywhere
Viele schöne Beispiele zu einem statistischen Paradoxon.

“Und wenn du einfach unter einem Männernamen schreibst?”
Die Autorin bezieht sich auf einen Artikel, den ich hier vor ein paar Wochen auch schon mal verlinkt hatte.

TSA Master Keys
Unter anderem deswegen sind staatlich vorgeschriebene Backdoors eine sehr, sehr dumme Idee.

The Bottom Of The Well
Stellvertretend für viele spannende Episoden des Podcasts “Planet Money”.

WR470 Nachgefragt: Kurdistan
Holger Klein spricht mit Enno Lenze über dessen jüngste Reise nach Kurdistan.

Caravan

Fundstücke 35/2015

| Comments

Momo
Der Roman ist 1973 erschienen, also bin ich mit meiner Empfehlung etwas spät dran. Das Buch hat aber nichts von seiner Aktualität verloren, eher im Gegenteil. Man findet das Werk zwar meist in der Kinder- und Jugendbuchabteilung, aber gerade auch für Erwachsene gibt es hier viele Denkanstöße. Was ist Zeit und wie gehen wir damit um?

Momo, Dogen. and the Commodification of Time
“This essay will explore the deep resonances between Ende’s view of time in Momo and the Buddhist perspective on time, particularly as expressed by the Japanese Zen master Dogen (1200 - 1253). These resonances are of more than literary or historical interest: understanding what Ende and Dogen have to say about time gives us important insight into how we experience time today.”

The Cat Empire Live at AB - Ancienne Belgique (Full concert)

Fundstücke 34/2015

| Comments

Reportage: Drei Brüder aus Syrien in der Trierer Aufnahmeeinrichtung für Asylbegehrende
Ich finde den Artikel aus zwei Gründen bemerkenswert: die Reportage ist ein positives Beispiel für Lokaljournalismus, und hier wird mit Flüchtlingen statt nur über sie gesprochen.

The Architecture of Open Source Applications: ZeroMQ
Dieses Kapitel aus The Architecture of Open Source Applications gibt einen guten Überblick über ZeroMQ. Das war für mich ganz hilfreich, weil ich ZeroMQ eventuell bald für ein Projekt einsetzen werde. Übrigens kann ich die ganze Reihe empfehlen. Ich habe zwar bisher nur einzelne Kapitel gelesen, die waren aber allesamt sehr lehrreich.

Waterboarding für den gemeingefährlichen Irren! Deutsche Journalisten über Claus Weselsky
Erschreckend.

Web Design: The First 100 Years
“The Internet is full of projects big and small whose defining trait is that they came out of nowhere and captured people’s imaginations. It’s also full of awesome cat videos. The key part of this vision is that the Internet succeeds by remaining open and participatory. No one acts as gatekeeper, and it is not just a channel for mindless consumption.” (Weitere Vorträge von Maciej Cegłowski)

Confronting New Madrid
Maciej Cegłowski ist durch die New Madrid Seismic Zone gereist und schreibt darüber.

Fundstücke 33/2015

| Comments

With Windows 10, Microsoft sells you out
“[…] your interest in how your computer works and Microsoft’s interest are no longer aligned. While you will want your computer to do things quickly and efficiently and unobtrusively, Microsoft will want it to do those things slowly and clunkily and painfully; because every delay, every useless dialog box you have to click through, is another opportunity for them to show you an ad. And while you will want your computer to keep your secrets secret, you won’t be able to trust Microsoft to want the same thing anymore, because suddenly all those secrets are worth money to them. They can use them to match you up even more exquisitely with advertisers, who have become Microsoft’s real customers for Windows.”

Fix Windows 10
Immerhin erlaubt Windows 10 recht genau einzustellen, welche Daten an Microsoft gesendet werden. Hier wird das ausführlich mit Screenshots erklärt.

Documentation at scale: The principles
“1. Acknowledge that brute force doesn’t work. 2. Make documentation a first class citizen. 3. Make documentation executable. 4. Track the intent. 5. Measure it.”

Ein Abgrund von Landesverrat
Bundesrichter Thomas Fischer schreibt in seiner Kolumne über den Fall #landesverrat. Dabei kommt seine Meinung sehr deutlich durch. Auch wenn man diese nicht vollständig teilt, ist der Artikel sehr interessant zu lesen.

Lee Fields and the Expressions - “Faithful Man” (Live at WFUV)

Fundstücke 32/2015

| Comments

Homme de Plume: What I Learned Sending My Novel Out Under a Male Name
“Total data: George sent out 50 queries, and had his manuscript requested 17 times. He is eight and a half times better than me at writing the same book. Fully a third of the agents who saw his query wanted to see more, where my numbers never did shift from one in 25.”

Beyond PEP 8 – Best practices for beautiful intelligible code - PyCon 2015
Aufschlussreicher Vortrag, der aufzeigt wie man besser verständlichen Python-Code schreiben kann. Die ersten ca. 20 Minuten hätte man zwar durchaus etwas kürzen können, aber danach wird es richtig interessant.

Deap Vally - Baby I Call Hell

Fundstücke 31/2015

| Comments

Nach mehrwöchiger Pause gibt es nun neue Fundstücke von mir.

Are You Living in a Computer Simulation?
“This paper argues that at least one of the following propositions is true: (1) the human species is very likely to go extinct before reaching a “posthuman” stage; (2) any posthuman civilization is extremely unlikely to run a significant number of simulations of their evolutionary history (or variations thereof); (3) we are almost certainly living in a computer simulation. It follows that the belief that there is a significant chance that we will one day become posthumans who run ancestor-simulations is false, unless we are currently living in a simulation. A number of other consequences of this result are also discussed.”

Encryption’s holy grail is getting closer, one way or another
“The ultimate goal – encryption’s holy grail, some have called it – is something called fully homomorphic encryption, where the entire system works on encrypted data, and returns an encrypted result. The only point in the process where data would be decrypted would be when the user wanted to see the result, and that would presumably happen in the application or client software, not in the database server in the cloud.”

What is the Truck Factor of Popular GitHub Applications? A First Assessment (PDF)
Leider hängt Software oft von einzelnen Entwicklern ab. Was passiert, wenn diesen etwas zustößt? Bei freier Software hat man immerhin noch den Quellcode.

Moving Fast With High Code Quality
In dem Artikel wird beschrieben, wie die Leute bei Quora für gute Code-Qualität sorgen.

So ein Europäer will ich gar nicht sein
“Das Europa 2015 ringt mir keinen Pathos mehr ab. Es steht nur noch für die Herrschaft der Buchhalter, für die Ablehnung demokratischer Instrumente wie Abstimmungen, für das Mobben legitimer Regierungen, das Europa 2015 steht für tausende ersoffene Flüchtlinge im Mittelmeer, Überwachung, Militarisierung, Freihandel zugunsten der globalisierten Konzerne, […]” Ich selbst bin ähnlich enttäuscht von Europa.

Einfach. Gut. Leben.
Ich finde die Idee des Minimalismus sehr ansprechend. Mittlerweile überlege ich mir jede Anschaffung drei mal. Zeug und Konsum machen nicht glücklich.

ident.me: Your Address as a Service
Mit curl ident.me ; echo kann man sich ganz einfach seine öffentliche IP-Adresse anzeigen lassen.

Jon Spencer Blues Explosion - Get Your Pants On (Live on KEXP)