Советы по игре в гольф на ходу


25

Какие общие советы у вас есть для игры в гольф на Го? Я новичок в Code Golfing и ищу идеи, которые можно применить к задачам Code Golf в целом, которые, по крайней мере, несколько специфичны для Go.

Пожалуйста, придерживайтесь одного совета за ответ.


3
Мы могли бы захотеть создать Goтег, но тогда, Go даже используется для игры в гольф здесь?
Оптимизатор

@ Оптимизатор, который я имел обыкновение
кошка

3
Следует переименовать заголовок в «Советы для игры в гольф»
Уриэль,

Ответы:


12

Вдохновленный ответом @ EMBLEM здесь .

Вы можете поместить функции пакета в глобальное пространство имен при их импорте следующим образом:

package main

import ."fmt"

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

9

При импорте вы можете называть пакеты как угодно.

package main

import f "fmt"

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

Узнал это здесь .


3
Вы также можете сделать import ."fmt"и тогда, Printlnи остальные fmtфункции в глобальном пространстве имен. Кроме того, вам не нужны точки с запятой. Когда-либо, если у вас нет нескольких утверждений в строке
кошка

Обратите внимание, что в Golang фигурные скобки должны идти на одной строке из-за автоматической вставки точек с запятой. Дополнительная информация: golang.org/doc/faq#semicolons .
кот

7

Именованные возвращаемые значения могут сохранить несколько байтов. Например:

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

Вы можете сохранить 3 байта с

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

Это более полезно, если вам нужно объявить несколько переменных в начале вашей функции.


7

Если вам нужно сравнить много разных значений с одним, может быть более эффективно использовать единицу switchс одним регистром.

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

2

Объявление нескольких переменных:

i,s:=0,""

var(i int;s string)

Int из строки: (ограниченно, но иногда полезно)

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

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

Наоборот

s:=string(9+48)

s:=strconv.Itoa(9)

fmt.Sprintможет сэкономить байты strconv.Atoi, потому что вы, вероятно, fmtуже импортировали .
ЭМБЛЕМА

@EMBLEM Я думаю, что это strconvбыло просто для того, чтобы показать, каким будет гольф-код в нормальном коде.
Бенни Джобиган

2

Компилятор Go имеет предопределенные функции printи printlnфункции, которые не требуют импорта fmt, поэтому вместо этого.

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

Вы можете написать это.

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

Обратите внимание, что это выводит на STDERR.


1

Многое в цикле for является необязательным.

Стандартная версия:

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

Если i, vуже определены и могут быть перезаписаны:

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

Если вас не волнует ценность:

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

Если вы не заботитесь о ценности и iуже определены:

for i=range a{
// Do stuff
}

Если вас не волнует индекс или значение:

for range a{
// Do stuff
}

Если вы хотите бесконечный цикл:

for{
// Do stuff
}

1

Нужна строка для перевода строки? Не пишите \n, создайте необработанную строку с обратными кавычками и вставьте в нее буквальный символ новой строки.

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

0

Вы можете поместить любое количество открывающих скобок в одну строку, но строка, содержащая открывающие скобки, может содержать не более одной закрывающей скобки.

Правильный:

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

Также исправьте:

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

Также исправьте:

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

Неправильно:

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

0

Go имеет различный приоритет оператора для битовых операций, <<, >>, &и т.д. , как правило , имеют более низкий приоритет , чем +и -в большинстве языков, но в Go они имеют одинаковый приоритет , как *и /.

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

Это может быть использовано для сохранения некоторых скобок.

Большинство языков:

(a&b)*c

Идти:

a&b*c

0

Полностью используйте первоклассные функции Go, присваивая длинные имена библиотечных функций однобуквенным переменным.

import."strings"
r:=Replace
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.