Suggerimenti per giocare a golf in Go


25

Quali consigli generali hai per giocare a golf in Go? Sono nuovo di Code Golf e cerco idee che possano essere applicate a problemi di code golf in generale che siano almeno in qualche modo specifici di Go.

Si prega di tenere un suggerimento per risposta.


3
Potremmo voler creare il Gotag, ma poi Go viene utilizzato anche per giocare a golf qui?
Ottimizzatore

@Optimizer ho usato per
cat

3
Dovrebbe rinominare il titolo in "Tips for Go-lfing"
Uriel

Risposte:


12

Ispirato dalla risposta di @ EMBLEM qui .

Puoi inserire le funzioni di un pacchetto nello spazio dei nomi globale quando le importi in questo modo:

package main

import ."fmt"

func main() {
    Printf("Hello World!")
}

9

Puoi nominare i pacchetti come preferisci quando li importi.

package main

import f "fmt"

func main() {
    f.Printf("Hello World\n")
}

L'ho imparato qui .


3
Puoi anche fare import ."fmt"e poi Printlne le altre fmtfunzioni si trovano nello spazio dei nomi globale. Inoltre, non hai bisogno di punti e virgola. Sempre, a meno che tu non abbia più dichiarazioni su una riga
cat

Si noti che in Golang, le parentesi graffe devono andare sulla stessa riga, a causa dell'inserimento automatico del punto e virgola. Maggiori informazioni: golang.org/doc/faq#semicolons .
gatto

7

I valori restituiti con nome possono salvare alcuni byte. Per esempio:

func x()string{
r:="" //Do stuff
return r}

È possibile salvare 3 byte con

func x()(r string){
//Do stuff
return}

È più utile se è necessario dichiarare più variabili all'inizio della funzione.


7

Se è necessario confrontare molti valori diversi con uno singolo, potrebbe essere più efficiente in termini di spazio utilizzare un switchcon un singolo caso.

if x==1||x==2||x==3||x==4{}
switch x{case 1,2,3,4:}

2

Dichiarazione di più variabili:

i,s:=0,""

var(i int;s string)

Int dalla conversione di stringhe: (limitato ma a volte utile)

n:=byte("9"[0])-48 // actual type is uint8

n,_:=strconv.Atoi("9")

E viceversa

s:=string(9+48)

s:=strconv.Itoa(9)

fmt.Sprintrischia di salvare byte strconv.Atoi, perché probabilmente lo hai fmtgià importato .
EMBLEMA

@EMBLEM Penso che strconvfosse lì solo per mostrare quale sarebbe stato il codice golf nel codice normale.
Benny Jobigan,

2

Il compilatore Go ha predefiniti printe printlnfunzioni che non richiedono l'importazione di fmt, quindi invece di questo.

package main
import."fmt"
func main(){Printf(`Hello World
`)}

Puoi scrivere questo.

package main
func main(){print(`Hello World
`)}

Si noti che ciò genera STDERR.


1

Molte cose nel ciclo for range sono opzionali.

Versione standard:

for i,v:=range a{
// Do stuff
}

Se i, vè già stato definito e può essere sovrascritto:

for i,v=range a{
// Do stuff
}

Se non ti interessa il valore:

for i:=range a{
// Do stuff
}

Se non ti interessa il valore ed iè già stato definito:

for i=range a{
// Do stuff
}

Se non ti interessa l'indice o il valore:

for range a{
// Do stuff
}

Se vuoi un ciclo infinito:

for{
// Do stuff
}

1

Hai bisogno di una stringa per contenere una nuova riga? Non scrivere \n, crea una stringa non elaborata con backquotes e inserisci una nuova riga letterale.

s:="\n" // 7 bytes
s:=`
` // 6 bytes

0

È possibile inserire un numero qualsiasi di parentesi graffe di apertura su una riga, ma una riga che contiene parentesi graffe di apertura può contenere al massimo una parentesi graffa di chiusura.

Corretta:

func main(){if true{switch{case 1==1:for{break
}}}}

Anche corretto:

func main(){if true{switch{case 1==1:for{break}
}}}

Anche corretto:

func main(){if true{switch{case 1==1:for{
break}}}}

non corretto:

func main() {
    if true{for{break}}
}

0

Go ha diverse precedenza degli operatori per le operazioni di bit, <<, >>, &, ecc di solito hanno la precedenza inferiore rispetto +e -nella maggior parte delle lingue, ma in Go hanno la stessa precedenza *e /.

Precedence    Operator
5             *  /  %  <<  >>  &  &^
4             +  -  |  ^
3             ==  !=  <  <=  >  >=
2             &&
1             ||

Questo potrebbe essere usato per salvare alcune parentesi.

La maggior parte delle lingue:

(a&b)*c

Partire:

a&b*c

0

Sfruttate appieno le funzioni di prima classe di Go assegnando nomi di funzioni di libreria lunghe a variabili di una lettera.

import."strings"
r:=Replace
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.