Tipps zum Golfen in Nim

11

Welche allgemeinen Tipps haben Sie zum Golfen in Nim ? Ich suche nach Ideen, die auf Code-Golf-Probleme angewendet werden können und die zumindest auch etwas spezifisch für Nim sind (zB "Kommentare entfernen" ist keine Antwort).

Bitte posten Sie einen Tipp pro Antwort.

Trichoplax
quelle

Antworten:

7

Flexible Anrufsyntax

Nim ist ziemlich flexibel, wenn es um die Syntax von Funktionsaufrufen geht. Hier sind beispielsweise einige Möglichkeiten, eine Funktion mit einem Argument aufzurufen:

ord(c)
ord c
c.ord

Und Möglichkeiten, eine Funktion mit zwei Argumenten aufzurufen:

max(a,b)
a.max(b)
a.max b

Wählen Sie die Golfversion, die für Ihre Situation am besten geeignet ist, insbesondere in Bezug auf den Vorrang. Vergleichen Sie zum Beispiel:

abs(n)+2
n.abs+2
(abs n)+2

Im Gegensatz zu:

abs(n+2)
(n+2).abs
abs n+2
Sp3000
quelle
Beachten Sie, dass max a,bsogar (manchmal) funktioniert.
Kupfer
7

Verwenden Sie das futureModul

Das futureModul enthält zwei Hauptfunktionen zum Speichern von Bytes: Lambdas und Listenverständnis. Lambdas sind äußerst nützlich.

Zum Beispiel:

proc f(s:any):any=s&", world!"

kann dazu verkürzt werden:

import future
s=>s&", world!"

das spart ein Byte. Beachten Sie jedoch, dass Lambdas nicht außerhalb einer Parameterliste verwendet werden können. Um Ihren Code zu testen, müssen Sie Folgendes tun:

import future
proc test(f: string -> string) = echo f "Hello"
test(s=>s&", world!")

Mit dem futureModul können auch Listenverständnisse verwendet werden. Dieser Code gibt beispielsweise eine seq ( @[...]) aller Quadrate aus, die kleiner als 100 sind und durch 4 teilbar sind:

import future
echo lc[x*x|(x<-1..9,x*x mod 4==0),int]
Kupfer
quelle
Für einen faireren Vergleich sollte beachtet werden, dass Sie manchmal anyanstelle von verwenden können string(ich gehe davon aus, dass Sie den längsten Typnamen gewählt haben), dies spart jedoch trotzdem.
Sp3000
@ Sp3000 Ich wusste nicht, dass du es benutzen kannst any, danke für den Tipp! Sie sollten das als Antwort posten.
Kupfer
Für einen noch besseren Vergleich können Sie das tun proc(s:any):any=s&", world!", indem Sie das <space>ffür einen anonymenproc
Sp3000
6

Nicht signierte Operatoren

Wenn Sie mit nichtnegativen Ganzzahlen arbeiten, ist es manchmal besser, vorzeichenlose Operatoren zu verwenden. Verwenden Sie nach Möglichkeit /%und %%anstelle von divund mod.

Sp3000
quelle