Wskazówki dotyczące gry w golfa w Go


25

Jakie masz ogólne wskazówki na temat gry w golfa w Go? Jestem nowy w Code Golfing i szukam pomysłów, które można zastosować do problemów z golfem w kodzie, które są przynajmniej nieco specyficzne dla Go.

Proszę zachować jedną wskazówkę na odpowiedź.


3
Możemy chcieć stworzyć Gotag, ale czy Go jest tu nawet używany do gry w golfa?
Optymalizator

@Optimizer Kiedyś
kot

3
Powinny zmienić nazwę tytułu na „Tips for Go-lfing”
Uriel

Odpowiedzi:


12

Zainspirowany odpowiedzią @ EMBLEM tutaj .

Możesz zaimportować funkcje pakietu do globalnej przestrzeni nazw podczas importowania:

package main

import ."fmt"

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

9

Podczas importowania możesz nazwać paczki, jak chcesz.

package main

import f "fmt"

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

Nauczyłem się tego tutaj .


3
Możesz także zrobić, import ."fmt"a Printlnpozostałe fmtfunkcje znajdują się w globalnej przestrzeni nazw. Nie potrzebujesz też średników. Zawsze, chyba że masz wiele wypowiedzi w wierszu
kot

Zauważ, że w Golang nawiasy klamrowe muszą iść w tym samym wierszu z powodu automatycznego wstawiania średnika. Więcej informacji: golang.org/doc/faq#semicolons .
kot

7

Nazwane wartości zwracane mogą zaoszczędzić kilka bajtów. Na przykład:

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

Możesz zapisać 3 bajty za pomocą

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

Jest to bardziej przydatne, jeśli musisz zadeklarować wiele zmiennych na początku swojej funkcji.


7

Jeśli musisz porównać wiele różnych wartości do jednej, może być bardziej zajmujące miejsce użycie switchpojedynczego przypadku.

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

2

Deklarowanie wielu zmiennych:

i,s:=0,""

var(i int;s string)

Konwersja tekstu z ciągu: (ograniczona, ale czasem pomocna)

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

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

I wzajemnie

s:=string(9+48)

s:=strconv.Itoa(9)

fmt.Sprintprawdopodobnie zaoszczędzi bajty strconv.Atoi, ponieważ prawdopodobnie fmtjuż zaimportowałeś .
EMBLEM

@EMBLEM Myślę, że strconvbył tam tylko po to, aby pokazać, jaki byłby kod golfowy w normalnym kodzie.
Benny Jobigan,

2

Kompilator Go ma predefiniowane funkcje printi printlnfunkcje, które nie wymagają importowania fmt, więc zamiast tego.

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

Możesz to napisać.

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

Zauważ, że dane wyjściowe do STDERR.


1

Wiele rzeczy w pętli dla zakresu jest opcjonalne.

Wersja standardowa:

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

W przypadku i, vzostała już zdefiniowana i może być zastąpiony:

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

Jeśli nie zależy ci na wartości:

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

Jeśli nie zależy ci na wartości i izostało już zdefiniowane:

for i=range a{
// Do stuff
}

Jeśli nie zależy ci na indeksie lub wartości:

for range a{
// Do stuff
}

Jeśli chcesz mieć nieskończoną pętlę:

for{
// Do stuff
}

1

Potrzebujesz ciągu znaków, który zawiera nowy wiersz? Nie pisz \n, twórz nieprzetworzony ciąg z cudzysłowami i wstaw w nim dosłowny znak nowej linii.

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

0

Możesz umieścić dowolną liczbę nawiasów otwierających w jednym wierszu, ale linia zawierająca nawiasy otwierające może zawierać maksymalnie jeden nawias zamykający.

Poprawny:

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

Popraw także:

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

Popraw także:

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

Błędny:

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

0

Go ma inny priorytet operatora dla operacji bitowych <<, >>, &, itd. Zazwyczaj mają niższy priorytet niż +i -w większości języków, ale idź mają ten sam priorytet jak *i /.

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

Można to wykorzystać do zapisania niektórych nawiasów.

Większość języków:

(a&b)*c

Udać się:

a&b*c

0

W pełni wykorzystaj pierwszorzędne funkcje Go, przypisując długie nazwy funkcji bibliotecznych zmiennym jednoliterowym.

import."strings"
r:=Replace
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.