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.

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

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]

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.