Code Golfing Thread

ComFreek

Mod | @comfreek
Moderator
Ziel: Lösen diverser Codegolfing Challence aus reinem Spaß. Codegolfing ist der Wettbewerb für ein gegebenes Problem den kürzesten Code in einer frei gewählten Programmiersprache aufzustellen. Bei Interesse kann das hier in einem kleinen Rahmen erfolgen, für mehr Wettbewerb und Regeln siehe Code Golf Stack Exchange.

Challenges als auch Antworten werden hier gepostet. Bei Antworten bitte immer den Bytecount hinzuschreiben.

Kurze Regeln: Im Allgemeinen ist viel Freiheit erlaubt. Ihr könnt Eingaben von stdin lesen oder auch nur eine Funktion programmieren, die Eingaben als Argumente nimmt. Außerdem seid ihr auch frei im Format eurer Ausgaben.
 
Challenge Primzahlzwillinge: Schreibe ein Programm, welches eine Zahl n als Eingabe nimmt und alle Primzahlzwillinge <= n ausgibt. Inspiriert von Primzahlzwillinge.

Einreichung (Primzahlzwillinge; JavaScript):

  • 109 Byte
    Javascript:
    n=>(p=m=>!/^.?$|^(..+?)\1+$/.test('.'.repeat(m)),[...Array(n).keys()].filter(i=>p(i)&p(i+2)).map(i=>[i,i+2]))

    Beispielaufruf: (Code von oben)(30)
    Beispielausgabe:
    Code:
    [ [ 3, 5 ], [ 5, 7 ], [ 11, 13 ], [ 17, 19 ], [ 29, 31 ] ]
  • 106 Byte
    Javascript:
    n=>(p=m=>!/^.?$|^(..+?)\1+$/.test(Array(m+1)),[...Array(n).keys()].filter(i=>p(i)&p(i+2)).map(i=>[i,i+2]))
  • 97 Byte
    Javascript:
    function*_(n){p=m=>!/^.?$|^(..+?)\1+$/.test(Array(m+1));for(;n--;)if(p(n,x=n+2)&p(x))yield [n,x]}
    (nun mittels Generatorfunktion, Beispielaufruf: [..._(1000)])
  • 93 Byte
    Javascript:
    function*_(n){for(p=m=>!/^.?$|^(..+?)\1+$/.test(Array(m+1));x=n+2;n--)yield p(n)&p(x)&&[n,x]}
    (nun auch mit "unnützen" Ausgabewerten 0)
Primzahltest via Regex, siehe How to determine if a number is a prime with regex?.

Fun Fact: Der letzte Code braucht für 10.000 weniger als 30 Sekunden! Ich hätte gedacht, der reguläre Ausdruck sei noch ineffizienter :)
 
Zuletzt bearbeitet:
Da hast du gut vorgelegt!

Aber noch bin ich nicht auf den Kopf gefallen :giggle:

Python:
print([(i-2,i) for i in range(5,10001) if all([i*(i-2)%d for d in range(2,i-2)])])
Knapp 5s mit Python3 und mit PyPy3 sogar <1s. Insgesamt 83 Bytes.

Wir sollten das regelmäßig machen :LOL:
 
Challenge Messauswertung: Lies eine Logdatei wie in diesem Thread beschrieben ein und ermittle den Druckmittelwert von Station 05. Damit alle Teilnehmer die gleichen Ergebnisse erhalten, habe ich hier eine beispielhafte Logdatei generiert:
Code:
Datum------Uhrzeit---------Nr-Druck-Strom-Leistung
2016-05-21 05:42:59.897815 13 04.96 00.82 55.98
2016-05-24 14:43:58.068466 07 04.47 00.00 54.16
2016-05-28 13:44:34.824482 02 06.51 00.00 54.94
2016-05-30 22:44:36.492921 09 03.54 00.00 52.99
2016-06-02 14:45:02.093729 06 05.18 00.00 54.96
2016-06-04 09:45:27.301655 11 06.80 00.00 53.57
2016-06-06 07:46:24.834020 03 04.92 00.00 51.08
2016-06-08 06:46:48.414982 02 04.96 07.49 54.79
2016-06-12 05:47:34.694913 02 04.53 00.00 54.62
2016-06-16 00:47:56.315593 00 04.27 00.00 54.62
2016-06-16 05:48:52.394188 03 02.88 00.00 54.26
2016-06-19 14:48:52.958023 11 04.38 00.00 54.43
2016-06-21 08:49:42.078513 01 06.38 00.00 52.99
2016-06-24 16:49:43.041838 14 05.06 00.00 53.22
2016-06-27 09:50:00.833437 02 06.34 12.66 58.11
2016-06-29 00:50:44.059865 13 06.77 00.00 50.02
2016-06-30 18:50:56.284409 09 07.38 00.00 53.90
2016-07-04 00:51:43.573669 05 07.39 00.00 53.45
2016-07-04 11:51:56.599016 14 03.91 00.00 50.03
2016-07-04 20:51:57.969873 00 05.54 00.00 53.81
2016-07-07 17:52:32.546396 00 05.88 00.00 54.39
2016-07-08 14:52:36.308476 11 03.04 00.00 50.44
2016-07-11 23:52:52.884925 09 03.01 00.00 50.72
2016-07-15 13:53:07.486127 06 04.69 00.00 51.69
2016-07-18 06:53:21.004295 08 06.72 00.00 51.24
2016-07-21 12:54:20.639632 05 03.64 00.00 54.52
2016-07-22 01:55:15.699746 01 07.10 00.00 52.24
2016-07-25 22:55:59.593023 02 02.52 00.00 54.47
2016-07-28 14:56:42.424944 11 06.91 00.00 54.73
2016-07-31 22:57:37.496629 07 05.08 00.00 51.56
2016-08-04 07:58:19.236272 04 03.45 00.00 51.21
2016-08-07 15:58:54.922266 11 02.51 00.00 51.75
2016-08-11 00:59:25.707322 01 05.46 00.00 51.34
2016-08-11 19:59:36.733083 14 07.07 00.00 53.49
2016-08-14 20:59:51.989213 02 07.20 17.81 57.94
2016-08-16 09:00:29.398881 11 02.95 00.00 50.67
2016-08-18 12:00:31.473299 12 07.48 00.00 52.26
2016-08-19 01:00:39.035462 15 03.34 09.81 51.49
2016-08-22 08:01:03.923808 16 03.46 00.00 51.33
2016-08-23 21:01:08.047652 06 03.14 00.00 52.94
2016-08-24 20:01:42.605901 00 06.49 00.00 53.02
2016-08-28 16:02:38.160831 12 05.27 00.00 52.28
2016-08-30 17:03:09.735771 09 07.10 00.00 50.56
2016-09-03 05:03:19.667328 05 05.59 00.00 53.34
2016-09-06 20:03:20.840405 09 04.40 00.00 52.48
2016-09-10 11:04:17.005519 13 05.16 00.00 50.44
2016-09-12 18:04:24.953988 14 06.15 00.00 52.14
2016-09-13 01:05:20.601668 14 05.29 00.00 52.70
2016-09-15 19:06:03.907929 12 03.33 00.00 53.18
2016-09-16 04:06:12.037073 05 06.01 00.00 51.91
2016-09-19 07:07:01.173157 02 04.25 00.00 53.61
2016-09-19 10:07:49.520562 03 05.36 00.00 50.85
2016-09-21 07:08:23.502745 05 06.07 07.91 54.52
2016-09-22 10:09:20.729331 13 06.36 00.00 53.53
2016-09-23 01:09:45.901284 01 06.78 00.00 54.85
2016-09-23 17:10:22.118569 03 02.70 00.00 53.82
2016-09-24 13:10:53.980526 03 02.97 00.00 52.80
2016-09-27 02:11:43.556597 08 03.43 00.00 51.54
2016-09-29 01:12:23.861967 14 05.23 13.43 55.18
2016-10-02 12:13:20.554152 00 04.45 00.00 52.92
2016-10-03 03:14:02.163317 03 03.53 00.00 50.27
2016-10-05 16:14:35.120039 12 04.79 00.00 54.14
2016-10-09 03:14:53.963905 16 02.73 00.00 52.24
2016-10-10 16:15:45.606085 05 04.03 00.00 50.50
2016-10-12 18:16:29.651193 13 04.25 00.00 51.00
2016-10-14 07:16:43.405289 15 07.06 00.00 51.42
2016-10-14 12:17:41.025764 03 07.41 00.00 50.73
2016-10-15 23:18:25.543549 05 05.71 00.00 52.68
2016-10-17 17:18:31.675149 12 04.94 00.00 53.16
2016-10-20 11:19:31.100542 16 07.39 00.00 51.84
2016-10-21 06:20:20.829873 03 05.04 00.00 51.70
2016-10-21 11:20:54.674980 04 02.68 00.00 51.31
2016-10-24 22:21:52.690722 15 05.08 00.00 51.01
2016-10-25 23:22:25.759642 06 07.42 00.00 52.20
2016-10-28 11:22:54.516931 11 06.36 00.00 52.93
2016-10-30 00:23:05.628808 06 04.37 00.00 52.34
2016-11-02 21:23:51.171232 12 06.89 00.00 50.65
2016-11-04 23:24:15.718996 03 04.19 00.00 51.43
2016-11-05 02:24:41.769716 05 05.98 00.00 50.46
2016-11-05 19:24:55.463206 06 02.71 00.00 51.04
2016-11-08 12:25:02.403345 01 04.25 12.34 51.47
2016-11-11 20:25:33.606656 15 03.63 00.00 53.06
2016-11-13 00:25:38.713054 14 07.16 00.00 52.61
2016-11-14 09:25:51.391558 14 07.38 00.00 50.68
2016-11-15 12:25:56.935682 10 06.17 00.00 50.19
2016-11-16 15:26:35.981186 04 03.90 14.65 54.61
2016-11-19 18:27:25.222644 07 04.71 00.00 54.36
2016-11-21 17:27:35.446746 07 06.48 00.00 50.20
2016-11-25 07:28:04.459409 16 07.04 00.00 51.85
2016-11-27 16:28:07.483744 08 05.66 12.16 55.26
2016-11-29 23:28:46.470272 15 04.09 00.00 52.48
2016-12-03 20:29:41.236984 03 04.09 00.00 50.90
2016-12-06 17:29:59.636820 01 05.67 04.08 50.45
2016-12-07 04:30:35.728201 06 05.21 00.00 54.94
2016-12-08 18:31:18.926407 15 03.18 01.92 57.59
2016-12-10 06:32:14.973201 03 04.04 00.00 53.68
2016-12-10 07:32:30.616333 02 05.74 00.00 52.02
2016-12-14 02:33:00.924929 08 04.53 00.00 50.25
2016-12-15 12:33:46.677096 10 06.19 00.00 50.91
2016-12-15 19:34:04.213845 09 06.97 00.00 52.88
Für Sprachen ohne einfachen Dateisystemzugriff (looking at you JavaScript) ist es in Ordnung, wenn die Textdaten aus einem Textfeld (o.ä.) gelesen werden.

Mein Code:
Python:
l=[float(p[3]) for p in [l.split() for l in open('data.txt')][1:] if p[2]=='05']
print(sum(l)/len(l))
Insgesamt 101 Zeichen. Als Ergebnis erhalte ich 5.5525.

Fröhliches Golfen :D
 
88 Zeichen:
Javascript:
s=>{p=parseFloat;m=s.match(/(?<=05) ..\.../g);return m.reduce((x,y)=>x+p(y),0)/m.length}

Die Eingabe ist als String via Funktionsargument.
Hier die Eingabe übrigens als String für die Devkonsole:
Javascript:
s = "Datum------Uhrzeit---------Nr-Druck-Strom-Leistung\n2016-05-21 05:42:59.897815 13 04.96 00.82 55.98\n2016-05-24 14:43:58.068466 07 04.47 00.00 54.16\n2016-05-28 13:44:34.824482 02 06.51 00.00 54.94\n2016-05-30 22:44:36.492921 09 03.54 00.00 52.99\n2016-06-02 14:45:02.093729 06 05.18 00.00 54.96\n2016-06-04 09:45:27.301655 11 06.80 00.00 53.57\n2016-06-06 07:46:24.834020 03 04.92 00.00 51.08\n2016-06-08 06:46:48.414982 02 04.96 07.49 54.79\n2016-06-12 05:47:34.694913 02 04.53 00.00 54.62\n2016-06-16 00:47:56.315593 00 04.27 00.00 54.62\n2016-06-16 05:48:52.394188 03 02.88 00.00 54.26\n2016-06-19 14:48:52.958023 11 04.38 00.00 54.43\n2016-06-21 08:49:42.078513 01 06.38 00.00 52.99\n2016-06-24 16:49:43.041838 14 05.06 00.00 53.22\n2016-06-27 09:50:00.833437 02 06.34 12.66 58.11\n2016-06-29 00:50:44.059865 13 06.77 00.00 50.02\n2016-06-30 18:50:56.284409 09 07.38 00.00 53.90\n2016-07-04 00:51:43.573669 05 07.39 00.00 53.45\n2016-07-04 11:51:56.599016 14 03.91 00.00 50.03\n2016-07-04 20:51:57.969873 00 05.54 00.00 53.81\n2016-07-07 17:52:32.546396 00 05.88 00.00 54.39\n2016-07-08 14:52:36.308476 11 03.04 00.00 50.44\n2016-07-11 23:52:52.884925 09 03.01 00.00 50.72\n2016-07-15 13:53:07.486127 06 04.69 00.00 51.69\n2016-07-18 06:53:21.004295 08 06.72 00.00 51.24\n2016-07-21 12:54:20.639632 05 03.64 00.00 54.52\n2016-07-22 01:55:15.699746 01 07.10 00.00 52.24\n2016-07-25 22:55:59.593023 02 02.52 00.00 54.47\n2016-07-28 14:56:42.424944 11 06.91 00.00 54.73\n2016-07-31 22:57:37.496629 07 05.08 00.00 51.56\n2016-08-04 07:58:19.236272 04 03.45 00.00 51.21\n2016-08-07 15:58:54.922266 11 02.51 00.00 51.75\n2016-08-11 00:59:25.707322 01 05.46 00.00 51.34\n2016-08-11 19:59:36.733083 14 07.07 00.00 53.49\n2016-08-14 20:59:51.989213 02 07.20 17.81 57.94\n2016-08-16 09:00:29.398881 11 02.95 00.00 50.67\n2016-08-18 12:00:31.473299 12 07.48 00.00 52.26\n2016-08-19 01:00:39.035462 15 03.34 09.81 51.49\n2016-08-22 08:01:03.923808 16 03.46 00.00 51.33\n2016-08-23 21:01:08.047652 06 03.14 00.00 52.94\n2016-08-24 20:01:42.605901 00 06.49 00.00 53.02\n2016-08-28 16:02:38.160831 12 05.27 00.00 52.28\n2016-08-30 17:03:09.735771 09 07.10 00.00 50.56\n2016-09-03 05:03:19.667328 05 05.59 00.00 53.34\n2016-09-06 20:03:20.840405 09 04.40 00.00 52.48\n2016-09-10 11:04:17.005519 13 05.16 00.00 50.44\n2016-09-12 18:04:24.953988 14 06.15 00.00 52.14\n2016-09-13 01:05:20.601668 14 05.29 00.00 52.70\n2016-09-15 19:06:03.907929 12 03.33 00.00 53.18\n2016-09-16 04:06:12.037073 05 06.01 00.00 51.91\n2016-09-19 07:07:01.173157 02 04.25 00.00 53.61\n2016-09-19 10:07:49.520562 03 05.36 00.00 50.85\n2016-09-21 07:08:23.502745 05 06.07 07.91 54.52\n2016-09-22 10:09:20.729331 13 06.36 00.00 53.53\n2016-09-23 01:09:45.901284 01 06.78 00.00 54.85\n2016-09-23 17:10:22.118569 03 02.70 00.00 53.82\n2016-09-24 13:10:53.980526 03 02.97 00.00 52.80\n2016-09-27 02:11:43.556597 08 03.43 00.00 51.54\n2016-09-29 01:12:23.861967 14 05.23 13.43 55.18\n2016-10-02 12:13:20.554152 00 04.45 00.00 52.92\n2016-10-03 03:14:02.163317 03 03.53 00.00 50.27\n2016-10-05 16:14:35.120039 12 04.79 00.00 54.14\n2016-10-09 03:14:53.963905 16 02.73 00.00 52.24\n2016-10-10 16:15:45.606085 05 04.03 00.00 50.50\n2016-10-12 18:16:29.651193 13 04.25 00.00 51.00\n2016-10-14 07:16:43.405289 15 07.06 00.00 51.42\n2016-10-14 12:17:41.025764 03 07.41 00.00 50.73\n2016-10-15 23:18:25.543549 05 05.71 00.00 52.68\n2016-10-17 17:18:31.675149 12 04.94 00.00 53.16\n2016-10-20 11:19:31.100542 16 07.39 00.00 51.84\n2016-10-21 06:20:20.829873 03 05.04 00.00 51.70\n2016-10-21 11:20:54.674980 04 02.68 00.00 51.31\n2016-10-24 22:21:52.690722 15 05.08 00.00 51.01\n2016-10-25 23:22:25.759642 06 07.42 00.00 52.20\n2016-10-28 11:22:54.516931 11 06.36 00.00 52.93\n2016-10-30 00:23:05.628808 06 04.37 00.00 52.34\n2016-11-02 21:23:51.171232 12 06.89 00.00 50.65\n2016-11-04 23:24:15.718996 03 04.19 00.00 51.43\n2016-11-05 02:24:41.769716 05 05.98 00.00 50.46\n2016-11-05 19:24:55.463206 06 02.71 00.00 51.04\n2016-11-08 12:25:02.403345 01 04.25 12.34 51.47\n2016-11-11 20:25:33.606656 15 03.63 00.00 53.06\n2016-11-13 00:25:38.713054 14 07.16 00.00 52.61\n2016-11-14 09:25:51.391558 14 07.38 00.00 50.68\n2016-11-15 12:25:56.935682 10 06.17 00.00 50.19\n2016-11-16 15:26:35.981186 04 03.90 14.65 54.61\n2016-11-19 18:27:25.222644 07 04.71 00.00 54.36\n2016-11-21 17:27:35.446746 07 06.48 00.00 50.20\n2016-11-25 07:28:04.459409 16 07.04 00.00 51.85\n2016-11-27 16:28:07.483744 08 05.66 12.16 55.26\n2016-11-29 23:28:46.470272 15 04.09 00.00 52.48\n2016-12-03 20:29:41.236984 03 04.09 00.00 50.90\n2016-12-06 17:29:59.636820 01 05.67 04.08 50.45\n2016-12-07 04:30:35.728201 06 05.21 00.00 54.94\n2016-12-08 18:31:18.926407 15 03.18 01.92 57.59\n2016-12-10 06:32:14.973201 03 04.04 00.00 53.68\n2016-12-10 07:32:30.616333 02 05.74 00.00 52.02\n2016-12-14 02:33:00.924929 08 04.53 00.00 50.25\n2016-12-15 12:33:46.677096 10 06.19 00.00 50.91\n2016-12-15 19:34:04.213845 09 06.97 00.00 52.88"
 
Zuletzt bearbeitet:
mal schnell, ungetestet

C#:
Console.Write((System.IO.File.ReadAllLines("datei").Select(x => x.Split(' ')).Where(x => x[2] == "5").Sum(x => Convert.ToDecimal(x[3])) / (decimal)System.IO.File.ReadAllLines("datei").Select(x => x.Split(' ')).Where(x => x[2] == "5").Count()));

oder
C#:
IEnumerable<decimal> station5 = System.IO.File.ReadAllLines("datei").Select(x => x.Split(' ')).Where(x => x[2] == "5").Select(x => Convert.ToDecimal(x[3]));
Console.Write((station5.Sum() / (decimal)station5.Count()));
 
Zuletzt bearbeitet:
Challenge Verschiedene Arrayindizes: Schreibe ein probabilistisches Programm, welches eine Ganzzahl X > 0 als Eingabe nimmt und zwei verschiedene Zahlen 0 <= a, b < X ausgibt. Für jede fixe Eingabe X muss die Ausgabe (als Zufallsvariable betrachtet) uniform in M(X) = X × X \ diag(X) = X × X \ {(x, x) : x in X} sein.

Diese Challenge wurde von dem Thread RandomArrayGenerator inspiriert. Praktische Relevanz hat sie, wann immer man zwei "zufällig" verschiedene Arrayindizes benötigt für ein Array der Länge X.

Es ist in Ordnung, wenn das Programm nur probabilistisch terminiert, d.h. die Programmlaufzeit i.Allg. unbeschränkt, aber im Erwartungswert beschränkt ist.

Einreichung "Rejection Sampling" (JavaScript, 75 Bytes)
Live auf Edit fiddle - JSFiddle - Code Playground:
Javascript:
X=>{m=Math;r=_=>m.floor(m.random()*X);for(;a=r(),b=r(),a==b;);return[a,b];}

Laufzeit ist nur im Erwartungswert beschränkt.
 
Eine schöne Aufgabe hast du da rausgesucht :)

Mir war von Anfang an klar, dass ich Python extrem biegen müsste, um deine 75 Bytes zu schlagen. Meine ersten Ideen mündeten in den Ausschnitt hier:
Python:
import random
random.choice([(i,j) for i in range(X) for j in range(X) if i != j])

Das sind 83 Bytes. Uff.
Und dabei kam ich mir so cool vor als mir die Idee kam random.choice zu benutzen :ROFLMAO:

Aber gut, back to the drawing board. Nach einiger Zeit ist es mir gelungen etwas die Mathe-Muskeln spielen zu lassen. Deshalb hier meine

Einreichung "Verschiedene Arrayindizes" (Python, 73 Bytes)
Python:
import random
Y=X-1;random.choice([(x//Y,(x+1)*Y%X) for x in range(X*Y)])

Aber ich muss schon sagen, das war eine harte Nuss. Spaß hat's aber allemal gemacht!

Gruß Technipion
 
Zuletzt bearbeitet:
Die Formel x//Y verstehe ich ja noch (hatte ich im verlinkten Thread auch hergeleitet), aber wie kommst du auf (x+1)*Y%X?
 
Zurück