Поради щодо гольфу на <всіх мовах>


81

Мета цієї публікації - зібрати всі поради щодо гольфу, які можна легко застосувати, <all languages>а не конкретні.

Лише опублікуйте відповіді, що її логіка може бути застосована до більшості мов

Будь ласка, одна порада на відповідь


5
"Більшість" за якою метрикою?
перестали повертати проти годинника,

2
@leftaroundabout за метрикою того самого слова
ajax333221

8
Проблема полягає в тому, що багато мов є (часто недовговічними) експериментальними з дуже нетиповими парадигмами, для яких типові вирази програмування взагалі не мають сенсу. Тож "більшість усіх мов" практично неможливо виконати. Ви повинні якось обмежити це, наприклад, "більшість мов, які регулярно використовуються на codegolf.SE". На даний момент відповіді виглядають дуже схоже на "більшість віддалених С-похідних мов", але ті, хоч і переважна більшість усіх написаних кодів , написаних на них, не є більшістю мов .
перестали повертати проти годинника,

3
Я думаю, що ми всі знаємо, що вони приблизно означають. Мова йде про переважно незалежні від мови оптимізації, тобто ті, які не тільки корисні в Brainfuck, але, можливо, і Python, C, Java та Fortran одразу. Загальні ідеї, які можна застосувати на багатьох мовах, які працюють аналогічно. Я не думаю, що в підказах та питаннях CW є потреба бути такою точною та конкретною . Це про те, щоб допомогти іншим займатися гольфом, а не про те, щоб їх дурити.
Джої

14
Сподіваємось, ніхто не створює мову під назвою <all languages>...
mbomb007

Відповіді:


72

Об’єднати петлі

Зазвичай ви можете об'єднати дві послідовні петлі або дві вкладені петлі в одну.

Перед:

for (i=0; i<a; i++) foo();
for (i=0; i<b; i++) bar();

Після:

for (i=0; i<a+b; i++) i<a?foo():bar();

угорен петлі все одно не однакові. @Gaffi має рацію.
kaoD

5
@kaoD, в обох випадках fooназивається aраз, barназивається bраз. Це тому, що в режимі "після" цикл виконує a+bрази, перший aдзвінок foo, наступний виклик bar.
ugoren

Я дивлюся на це ще раз (набагато, набагато пізніше), і зараз не розумію власного питання. Я, можливо, раніше не розумів потрійну операцію? Те, як я це бачу зараз, має сенс.
Гаффі

1
Вуп, я читав це дуже пізно вночі. Ти правий!
kaoD

3
Дуже схожий: for(y=0;y<Y;++y)for(x=0;x<X;++x)часто може стати for(i=0;i<X*Y;++i)з xзаміненим i%Xі yзаміненим на i/X.
Лін

62

Відзначимо лише очевидне:

Поставте під сумнів свій вибір алгоритму та спробуйте щось зовсім нове.

При гольфі (особливо складніші проблеми, що призводять до більш тривалих програм), занадто часто ви можете дотримуватися шляху, який ви вибрали вперше, не намагаючись інших основних варіантів. Звичайно, ви можете мікро-гольф одночасно або кілька рядків або частина загальної ідеї, але часто не намагаєтесь зовсім інше рішення.

Це було особливо помітно в Hitting 495 (Kaprekar), де відхилення від власне алгоритму та пошук шаблонів, до яких можна застосувати, щоб дійти до того ж результату, було коротше у багатьох мовах (тільки не J).

Мінус полягає в тому, що ви, можливо, вирішуєте одне і те ж саме півдесятка разів. Але він працює насправді на всіх мовах, окрім HQ9 + (де пошук іншого способу виходу Hello World був би трохи марним).


12
+1 Окрім того, що корисно для гри в гольф, це хороша вправа для будь-якого програміста у багатьох ситуаціях реального світу!
Гаффі

52

Використовуйте тестові розробки

Якщо код повинен працювати з різними вхідними даними, тоді пишіть вичерпні тести і полегшуйте їх виконання дуже швидко. Це дозволяє спробувати ризиковані перетворення одного кроку дитини за один раз. Тоді гольф стає схожим на рефакторинг із збоченим наміром.


4
Я використовую спінофф цього методу. Оскільки проблеми самі по собі зазвичай досить прості, я пишу програму, яка виконує цю роботу. Зазвичай це "читабельний гольф", так що це лаконічно, але нові рядки тощо. Я копіюю цей файл на нове місце і гольфую його, раз у раз перевіряючи, що програми повертають однакові значення для деяких вибраних даних. Якщо я коли-небудь помиляюся, залишаючи мене зі зламаною програмою, без пам’яті про те, що я змінив, і не розумію свого гольф-куска, у мене є щось «специфікація», збережене як опорне джерело.
shiona

2
Мені подобається цей метод, і це є однією з причин того, що я схильний включати комплексні набори тестів для всіх проблем, про які пишу.
Joey

@RubberDuck Принцип « Не повторюй себе» часто суворо дотримується.
Джонатан Фрех

48

Спробуйте зменшити логічні твердження

Наприклад, якщо Aі Bє булевими, і ваша мова певною мірою розглядає булеві, як числа, A and (not B)і A>Bє рівнозначними. Наприклад в Python

if A and not B:
    foo()

те саме, що:

if A>B:
    foo()

3
Я б ніколи про це не думав.
cjfaure

27
B>A or foo()Це був би ще коротший спосіб висловити це, скористайтеся лінивою оцінкою булевих виразів, щоб переконатися, що вона обчислює лише речі, коли це потрібно.
скрагар

5
@scragar: Правильно, але це не суть цієї поради. (Хоча це цінна незалежна порада.)
Wrzlprmft

3
@scragar, B>A or fooоцінимо, fooякщо B==Aце не те, що ми хочемо. (Так?)
msh210

2
Крім того, якщо у вас давно є умови (скажімо, з параметрами 5/6), ви можете використовувати таблицю Truth і карту Карно, щоб знайти для неї найкоротший булевий вираз
Katenkyo

33

Ініціалізуйте змінні за допомогою значень, які ви вже маєте.

Замість того x=1, спробуйте шукати щось, що вже дорівнює 1.
Наприклад, зворотне значення функції: printf("..");x=0;-> x=!printf("..");. Найпростіше з 0, тому що ви завжди можете заперечувати, або коли все, що вам потрібно, це правильне значення істини (і байдуже, чи це 1 або 19).


4
в C ви можете використовувати argc з main як 1. див. codegolf.stackexchange.com/questions/1034/reinvent-the-for-loop/…
std''OrgnlDave

1
@ std''OrgnlDave, правда, але це питання стосується речей, спільних для всіх мов.
угорен

33

Використовуйте одинарний ~для x+1іx-1

Ця хитрість застосовується до мов, які мають оператора унарного побітового заперечення ~та одинарного оператора регулярного заперечення -.

Якщо ваша програма випадково містить вираз -x-1, ви можете замінити його, ~xщоб зберегти байти. Це трапляється не надто часто, але дивіться, що станеться, якщо ми заперечуємо ( -) обидва вирази: x+1дорівнює -~x! Аналогічно x-1дорівнює ~-x. (Подумайте, у який бік вказує тильда: праворуч +, ліворуч -.)

Це корисно, тому що в усіх мовах, які я можу подумати, що у цих операторів вони є вищими, ніж більшість операторів. Це дозволяє заощадити на дужках. Подивіться, як ми тут зберігаємо чотири байти:

(x+1)*(y-1)     ==>    -~x*~-y

30

Видавіть пробіл

Знайте правила пробілів у вашій мові. Деякі розділові знаки або інші символи можуть не потребувати жодного навколишнього пробілу. Розглянемо цю функцію оболонки Борна :

f () { echo a; echo b; }

У оболонці Борна ();є метахарактеристиками та не потребують навколишнього пробілу. Однак {}це слова та потрібні пробіли, якщо вони не поруч із метахарактеристиками. Ми можемо відіграти 4 місця поруч ();, але повинні зберігати простір між {і echo.

f(){ echo a;echo b;}

В Common Lisp і PicoLisp , ()є метасимволу. Розглянемо цей код, щоб знайти середнє значення двох чисел:

(/ (+ a b) 2)

Ми можемо відіграти в гольф 2 місця.

(/(+ a b)2)

Деякі мови мають дивні та тонкі правила для пробілів. Розглянемо цю програму Ruby, яка друкує суму і добуток рядка цілих чисел.

#!ruby -an
i=$F.map &:to_i
puts"#{i.reduce &:+} #{i.reduce &:*}"

Кожному &потрібен простір перед собою. У Ruby i=$F.map &:to_iозначає, i=$F.map(&:to_i)де &передається параметр блоку. Але, i=$F.map&:to_iозначає, i=$F.map.&(:to_i)де &знаходиться двійковий оператор.

Ця дивацтво трапляється в таких мовах, як Perl чи Ruby, які використовують неоднозначні розділові знаки. Якщо ви сумніваєтесь, використовуйте REPL або пишіть короткі програми, щоб перевірити правила пробілів.


1
Чому повинен бути пробіл між "{" та "echo", але не між ";" і "відлуння"?
Райан

3
Я використав терміни з посібника для OpenBSD sh (1), де сказано, що "{" - це зарезервоване слово і ";" є мета-персонажем. Через це "{echo" - це одне слово, але "; echo" - це два слова. Інші посібники можуть пояснити це по-різному. Також оболонка Z zsh має різні правила.
kernigh

28

присвоїти функціям нові імена, якщо вони використовуються кілька разів

x = SomeLongFunctionName
x(somedata)
x(somemoredata)
etc

Тільки якщо ми використовуємо достатньо дзвінків x.
elipszilon

28

Одні букви змінних імен

У вас їх 52; використовуйте їх усіх! Не бійтеся спробувати різні підходи та порівнювати довжину. Знати мову та наявні конкретні ярлики / функції бібліотеки.


8
26 для мов, що не залежать від регістру. :-)
Гаффі

12
Часто $і _може використовуватися як ідентифікатори.
Гріффін

4
@Gaffi: І більш ніж достатньо для мов, які дозволяють ідентифікатори Unicode, якщо завдання не обмежує вас ASCII або рахує байти, а не символи.
хаммар

Якщо ви підраховуєте байти замість unicode, то використання розширеного ascii може бути способом видавити ще ~ 120 ідентифікаторів, якщо вони вам потрібні (не те, що для сценарію для гольфу вам все одно потрібно більше 26)
scragar

2
@- дійсне ім'я змінної в T-SQL, використовуйте його замість @a.
BradC

25

Використовуйте умовний оператор.

Умовний оператор

bool ? condition_true : condition_false

є більш вигідним, характерним, ніж твердження IF .

if(a>b){r=a;}else{r=b;}

можна записати як

r=a>b?a:b;

25
Мови, які не мають терміналу, можуть використовувати a&&b||cнатомість. Трохи довше, але все ж коротше ніж if.
Майкл Коль

Знову ж таки, деякі не можуть використовувати жоден варіант (VBA приходить на думку), але обидва все ще є гарними пропозиціями. :-)
Гаффі

1
Гаффі: VBA має Iff, хоча це функція, тому підлягає оцінці всіх аргументів.
Джої

Використання ternar в, якщо заяви також можуть бути дуже кориснимиif(a ? b : c)
Jojodmo

4
@MichaelKohl зауважте, що a&&b||cможе повернутися, cколи aє правдою iff bfalse, маленький
крайній

24

Напишіть пояснення свого коду

Написання пояснення змушує вас знову ретельно переглянути кожну частину свого коду та зробити свої думки та вибір у написанні певного уривку явним. Роблячи це, ви можете виявити, що можливі різні підходи, які можуть зберегти деякі байти, або що ви підсвідомо зробили припущення, які не обов'язково виконують.

Ця порада схожа на запитання щодо вибору алгоритму та спробуйте щось зовсім нове ; однак я виявив, що крок фактичного запису того, як повинна працювати кожна частина, іноді є вирішальним для усвідомлення альтернатив.

Як бонус, відповіді, включаючи пояснення, цікавіші для інших користувачів і, отже, більше шансів на їх отримання.


23

Двічі перевірити кількість персонажів

Здається, що це не монітор, але, будьте обережні, ви зможете "врятувати" кілька символів, насправді нічого не роблячи!

Якщо ви використовуєте Windows, ви можете вводити \r\nзамість цього просто, \rабо \nколи натискаєте кнопку Return, додаючи додатковий байт на рядок! Поверніть контрольні символи лише для того, щоб перевірити, чи не робите ви цього.

У «Блокноті ++» ви можете конвертувати всі \r\nзакінчення рядків, просто \rперейшовши на Edit > EOL Conversion > UNIX/OSX Format.

Крім того, переконайтеся, що ви не включаєте жодної пробільної сторінки у свій список символів! Подача рядків у нижньому рядку у вашому коді також є несуттєвою, тому їх також не потрібно буде рахувати.


Я не думаю, що я жодного разу не бачив випадків, коли це насправді було перераховано ...
Яків

4
У мене просто була ця проблема (отже, чому я її додаю).
Шон Латем

21

Прочитайте уважно питання

Код гольфу - це настільки ж розуміння питання (що задається, а що не задається, навіть якщо це мається на увазі в будь-яких інших умовах), як продукування коду, який (може) задовольняє лише те, що задається.

Будь-який вхід, окрім того, що явно запитується, не потрібно обробляти. Якщо є кілька тестових випадків і немає загальних вимог, ваш код може працювати лише в тих випадках. І т.д.


15
Я думаю, що кращим заголовком тут буде "Не обробляти непотрібні крайові справи". Фраза "Спробуйте знайти лазівки" містить у собі способи уникнути виконання того, що визначено шляхом майстерного переосмислення правил, тоді як те, що ви пропонуєте, - лише корисна порада не надмірно реалізовувати своє рішення.
Джонатан Ван Матре

1
Так, але майстерне переосмислення правил також є частиною кодового гольфу! (0 чарівних рішень тощо)
Tobia

8
Хоча це / має бути іншою відповіддю. Існує принципова різниця між, наприклад, реалізацією рішення, яке працює лише для ints, оскільки ОР не потребує плаваючої підтримки, і відповіддю, що друкує текст "будь-який прайм більше 100", оскільки "ви не сказали, що це потрібно бути фактичним простим числом ".
Джонатан Ван Матре

Я думаю, що деякі ОП включають повідомлення "Тестові випадки, які можуть бути змінені; ваш код все ще повинен працювати після зміни", і дійсно їх змінити, якщо вони побачать лише одну відповідь, що жорстко кодує тестові шкали.
Ерік Аутгольфер

20

Використовуйте побітові операції для перевірки чисел між 0 і будь-якими 2 n -1

Це може бути трохи кращого випадку, але це може стати в нагоді іноді. Він спирається на те, що всі числа, до яких застосовується m = 2 n -1, мають найправіші n бітів, встановлених на 1.

Отже, 7 10 == 00000111 2 , 15 10 == 00001111 2 , 31 10 == 00011111 2 тощо.

Хитрість полягає x&~m. Це повертає істину , коли xце НЕ від 0 до m(включно), і брехня в іншому випадку. Це економить 6 байт від наступного найкоротшого еквівалентного виразу:, x>=0&&x<=mале, очевидно, працює лише тоді, коли mзадовольняє 2 n -1.


18

Використовуйте параметри функції замість нових змінних


1
Ну, наприклад, у C ваша основна функція завжди передає кількість аргументів, що надходять до програми (що становить 1 - назва програми - за замовчуванням), тому main(i){...тепер у вас є змінна зі значенням 1 без необхідності робити будь-які завдання. Там збереглися 2 символи ..
Гриффін

6
Я думаю, що це досить специфічно для C. Скриптові мови не потребують декларацій, і в більшості складених мов визначення змінної не довше, ніж визначення параметра.
ugoren

в java, коли потрібен масив всередині функції, яка має той самий тип, як один параметр, ви можете заощадити кілька байтів, поставивши цей параметр як останній і зробити його параметром vararg; (використано для того, щоб стригти деякі байти функції, щоб знайти найдовше слово в реченні)
masterX244

18

Більше / Менше, ніж для збереження цифри:

//use:
if(n>9){A}else{B}
//instead of:
if(n<10){B}else{A}

Просто не забудьте поміняти код з ifна, elseі вони зроблять точно те ж саме (або переключать сторони нерівності)!

Примітка: це можна застосувати з будь-якою потужністю 10 та їх мінусами:...-100, -10, 10, 100...

(посилання на джерело)


Я не впевнений, що розумію суть цього. З чого це зменшується?
Гаффі

@Gaffi ви збережете одного персонажа, і вони роблять точно так само
ajax333221

проти якої альтернативи? Вибачте, не намагаючись бути впертим, я просто не розумію. (newb, тут, мабуть ...)
Gaffi

1
А, бачу. Працює на будь-якому цілому переході від 9 до 10, 99 до 100 і т. Д. Вибачте, що у мене так багато часу! (Я кажу лише цілим числом, тому що я бачу проблему з n = 9.5 ...)
Gaffi

8
Також у деяких мовах (якщо вони підтримуються), якщо ваші цифри досить великі / маленькі, наукові позначення можуть насправді заощадити натомість: if(n>99999)vsif(n<1e5)
scragar

16

Використовуйте> і <замість> = і <=

Під час перевірки твердо закодованих цілих значень використовуйте, >а не <замість >=і, <=де це можливо. Наприклад, використовуючи

if(x>24&&x<51)

На 2 байти коротше, ніж використання

if(x>=25&&x<=50)

3
Пов’язано. Якщо ви впевнені, що результат не може бути негативним, його можна використовувати <1замість ==0нульової перевірки (або >0замість !=0дзеркальної перевірки).
Kevin Cruijssen

1
Чи не слід додати примітку про xціле число?
Zacharý

15

Уникайте передчасних розривів циклу

Якщо бігати через цикл для перевірки наявності 1 або більше екземплярів булевої перевірки, можливо, для ефективнішої програми вийде цикл на перше справжнє значення. Однак усунення розриву та циклічного перегляду всіх ітерацій дозволяє скоротити код.

int main() {
bool m = false;
int n = 1000;
for (int i = 0; i < n; i++) {
if (i >= 100) {
m = true;
break; // remove this line
}
} 
return 0;
}

5
Крім того, можна спростити ifзаяву проти в цих випадках: m|=i>=100. (І ви можете також спростити i>=100до i>99цього в цьому випадку, але це тут не дуже актуально)
marinus

15

використовувати -замість!=

для числових порівнянь:

Якщо дорівнює Ь, a-bпризводить 0, що falsy. Ніщо інше, ніж 0правдоподібне; тож
якщо використовується в булевому контексті, a-b<=>a!=b

Якщо ви використовуєте його з if/elseабо з потрійним оператором, це також може заощадити один байт для рівності:
a==b?c:d<=>a-b?d:c


12

Розділіть рядки для довгих масивів

У більшості мов є спосіб розділити рядок на масив рядків навколо якогось маркера. Це неминуче буде коротше, ніж лінійка масиву, як тільки довжина досягне порогу, що залежить від мови, оскільки додаткові накладні витрати на рядок будуть однією копією однозначного маркера, а не (принаймні) двома розділовими рядками.

Наприклад, у GolfScript

["Foo""Bar""Baz""Quux"]  # 23 chars

стає

"Foo
Bar
Baz
Quux"n/  # 20 chars

Для деяких мов поріг такий же низький, як одна рядок. Наприклад, на Java,

new String[]{"Foo"}  // 19 chars

стає

"Foo".split("~")  // 16 chars

6
Помітним винятком є рубін, який забезпечує масив через рядки литералов , які автоматично розбивається на просторах за рахунок двох байт: %w{Foo Bar Baz Quux}.
Мартін Ендер

1
Perl надає щось подібне: qw(Foo Bar Baz Quux)стає списком рядків.
BenGoldberg

12

Зрозумійте, що робили інші люди

Крім того, що цікаво, якщо ви вивчаєте код інших людей, ви можете іноді виявити хороший алгоритм, про який ви не думали, або хитрість (іноді очевидний), яку ви не помічаєте.

Іноді існує відповідь, що можна перекласти на іншу мову та скористатися смаком іншої мови.


10

знати пріоритет свого оператора

Щоразу, коли ви поєднуєте декілька виразів, перевірте таблицю пріоритетності оператора на свою мову, щоб побачити, чи можете ви упорядкувати матеріали для збереження дужок.

Приклади:

  • На всіх мовах, які я знаю, бітові оператори мають вищий пріоритет перед булевими операторами: (a&b)&&cне потребує дужок: так a&b&&cсамо, як (a*b)+cі не.
  • a+(b<<c)можна переписати як a+b*2**c.
    Це нічого не економить для цього прикладу, але це буде, якщо cце мале ціле буквальне значення (<14).
  • Бітові операції мають нижчий пріоритет, ніж більшість арифметичних операцій, тому якщо ваша мова неявно передає булеві значення до int, ви можете зберегти байт за a<b&&c<dдопомогою a<b&c<d(якщо вам не потрібна оцінка короткого замикання)

7

Більш короткі петлі

Якщо у вас є Xоператори {всередині }циклу for-loop, ви можете перемістити X-1оператори (всередині )циклу for-loop після другої крапки for(blah;blah;HERE)з комою, щоб зберегти 3 байти. (відокремте висловлювання за допомогою коми ,)

Замість

for(int i=0;i<9;){s+=s.length();println(i++);}

ви можете перемістити одне із висловлювань у (дужки for-loop, )поки не залишаєте інше

for(int i=0;i<9;println(i++))s+=s.length();

і збережіть 3 байти (збережено ще 1 байт завдяки @ETHProductions)


Простіше кажучи,

замість

for(blah;blah;){blah 1;blah 2;...;blah X}

перемістіть заяви, щоб ви закінчилися цим

for(blah;blah;blah 2,...,blah X)blah 1;

і збережіть 3 байти


@ETHproductions Спасибі за підказку про гольф :)
Kritixi Lithos

А якщо forостаточне твердження, то ;стає необов’язковим
elipszilon

7

Використовуйте одинарний ~для a-b-1іa+b+1

Окрім пропозицій @Lynn щодо x+1-~x; і x-1~-x , ви також можете грати в гольф a-b-1і a+b+1.

a-b-1    // 5 bytes
a+~b     // 4 bytes

a+b+1    // 5 bytes
a-~b     // 4 bytes

Це може виглядати як підказка, яку ви не будете використовувати все так часто, начебто як ~xзамість -x-1цього не буває часто, але я використовував її достатньо разів, щоб побачити це як корисну пораду тут. Особливо при індексації масивів ви можете використовувати ці вище в деяких випадках.


6

Стискати або / і прожилки

Простий трюк, який я придумав, намагаючись стиснути довгу смугу умов, пов'язаних ланцюжками «ands» (або ors, у цьому випадку просто замінити «all» на «any»).

Наприклад:

if a>0 and a<10 and a+b==4 and a+3<1:

Стає

if all([a>0,a<10,a+b==4,a+3<1]):

Це класно, мені доведеться спробувати!
стокастик

4
На яких мовах є all(array-of-Booleans)вбудований?
Пітер Тейлор

3
Рубі це має. [a>0,a<10,a+b==4,a+3<1].all?
kernigh

4
Хоча якби це Python, ви б використовували щось на кшталтif 10>a>0 and a+b==4>1>a+3:
Sp3000

@PeterTaylor Haskell теж
гордий haskeller

6

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

Не забудьте знати, які оптимізації гарантовані компілятором і на яких рівнях оптимізації, і використовуйте їх у вільному доступі. І навіть якщо продуктивність не викликає занепокоєння , ви все одно можете протестувати з оптимізаціями, а потім знизити лише один символ, оскільки ваш код все ще технічно дійсний без прапора компілятора.

Розглянемо наступну функцію Haskell для обчислення 2 ^ n (ігноруючи той факт, що Haskell вже має вбудований оператор експоненції або три) (23 символи):

p 0=1;p x=p(x-1)+p(x-1)

Проблема в тому - це жахливо повільно, він працює в експоненційному часі. Це може зробити ваш код нестабільним або зняти будь-які обмеження продуктивності, задані запитанням. Ви можете спокуситись використовувати тимчасову змінну або негайно викликаний функціональний буквал, щоб уникнути повторних викликів функції (25 символів):

p 0=1;p x=(\y->y+y)$p$x-1

Але компілятор вже може це зробити для вас, вам просто потрібно встановити -Oяк прапор компілятора! Замість того, щоб витрачати кілька зайвих символів на сайті, щоб усунути загальні подвиражения вручну, просто скажіть компілятору зробити основні оптимізації для вас на загальну суму один або два символи у всій програмі.


@ETHproductions так, вибачте, я це зробив
Джон Дворак

Чи не повинен бути перший приклад p(x-1)*2?
Cyoce

5

Можливо, дещо очевидно, але ...

Скористайтеся зворотними значеннями оператора

Майте на увазі, що оператор присвоєння повертає значення!

Наприклад, якщо ви хочете додати y до x, а потім перевірити, чи х більше, ніж щось, ви можете зробити

if(25<x+=y)

замість

x+=y;if(x>25)

Або, можливо, ви хочете знайти довжину струни після її обрізки:

strlen(s=trim(s))

Швидше ніж

s=trim(s);strlen(s)

Якою мовою ви можете виконувати призначення всередині дзвінка? чи це ключове слово arg?
кіт

2
Я думаю, що призначення - це вирази (з новим значенням призначеної змінної як значення їх вираження) принаймні на C, C ++, C # та Java. a = (b=c)+1;встановлює bна c, а потім встановлює aна b+1.
Лінн

@Lynn Спробуйте a=1+b=c. І ви можете додати PHP та JavaScript до свого списку.
Тит

2
Рубі робить це найкраще. Це дає =оператору більший пріоритет зліва, ніж праворуч, тому 1+x=2він дійсний і оцінюється до3
Cyoce

@Cyoce afaik - це так у всіх мовах, де призначення є виразом.
Тит

5

Використовувати мовну версію / компілятор / динаміки середовища / нові функції

Це особливо корисно для , але може бути застосовано до інших проблем. Іноді помилка компілятора може переграти байт, помилка впровадження може допомогти вам зберегти кілька символів, або дійсно кровоточача функція може покращити ваш рахунок.


4

Поєднайте декілька / вкладених, якщо перевірки використовують І / Або, коли це можливо.

тобто:

if (a && (b || c)) {

}

замість:

if (a) {
    if (b) {
        //Do Stuff
    } elseif (c) {
        //Do same stuff
    }
}

5
Також використовуйте bitty conditionals ( &, `|), щоб видалити більше символів.
FUZxxl

2
Хоча використання побітових &варіантів замість &&видалення 1 символу в деяких випадках це заплутує пріоритет оператора, і вам доведеться поставити круглі дужки, щоб він працював. Використовуйте його з розумом.
DollarAkshay

4

Знайдіть кращі способи ініціалізації своїх змінних

Деякі інші відповіді вже майже згадують про це, але в багатьох (строго набраних?) Мовах коротше ініціалізувати xяк порожній рядок, як:

x:=""

або xяк порожня руна (char), як:

x:=''

ніж

var x string

і

var x rune

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.