Pull to refresh
123
0
Ivan Kochurkin @KvanTTT

Software Developer at JetBrains (Kotlin Compiler)

Send message

Вроде я уже когда-то давно читал о такой змейке.

Интересно, что у них самый большой субпиксель используется для синего цвета. Это обуславливается как-то через восприятие цвета?

KataGo может играть на среднем железе, причем играет на уровне средних топов только лишь на одних предсказаниях нейросети (это вообще без использования перебора с помощью Монте-Карло). Что касается обучения - в описании написано следующее:

If tuned well, a training run using only a single top-end consumer GPU could possibly train a bot from scratch to superhuman strength within a few months.

Это выглядит подъемно.

Но по идее последняя версия gpt-4o может "думать", итеративно отвечать на вопрос. Но не понятно, можно ли использовать это свойство для перебора позиций, типа симуляции Monte Carlo tree search.

Другие, но есть много общего, все-таки это родственные игры. Есть обстоятельства, которые облегчают: отсутсвие Ко, а есть те, которые осложняют: в точках обычно строятся цепи намного длинней.

В целом KataGO действительно можно попробовать адаптировать под Точки, с учетом того, что это самообучающаяся нейросеть. Из этого может получиться что-то толковое.

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

Субъективные и стереотипные пункты: разные айтишник бывают.

Алгоритм давно известен - это элементарный перебор позиций на несколько ходов вперёд.

Это не элементарный перебор, потому что дерево растёт экспоненциально - нужно быстро и хорошо выбирать нужные ходы на каждом шаге. Особенно это актуально для таких игр как Го, в которых ИИ значительно продвинулся именно благодаря нейросетями. И стокфиш после этого тоже продвинулся.

Быстродействие процессоров подтянулось, что позволило полностью просчитывать партии. 

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

Мне нравится пример из мира шахмат: компьютерные программы постепенно побеждали лучших шахматистов мира. Но если взять в одну команду лучшего шахматиста и компьютер, то с таким тандемом справится или играть на равных практически не реально.

А мне не нравится этот пример. Современные программы и так побеждают любых шахматистов и без помощи ассистента. Т.е. человек тут скорей мешает, чем помогает. С натяжкой подходит игра Го (Бадук), потому что там намного больше комбинаций, и она более абстрактная.

Это только гипотеза, экспериментально излучение Хокинга не подтверждено, т.к. все обнаруженные черные дыры очень большие.

которых на самом деле не существует

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

Скорей это просто неудобно, т.к. при этом полностью блокируется рабочий аккаунт, который потом восстанавливается не полностью корректно. Ну и РФ, разумеется, работать нельзя. Но чтобы настоятельно не рекомендовали - нет такого.

Ну это просто пользовательская issue, в реальности такого конечно не произойдет :)

В том-то и дело, что компилятор может, а Вы почему-то нет.

Так если компилятор может, значит это формально правильно. И складывается впечатление, что это у вас недостаточное понимание предмета обсуждения.

Если есть ограничение: можно читать, но нельзя писать, как Вы их собираетесь туда записывать? Например, в списке есть 2 арбуза, как Вы собираетесь туда записывать 3 апельсина? А ведь это и нужно сделать по идее, если Вы их хотите суммировать.

Я не собираюсь туда записыват - я получаю read-only коллекцию в виде объектов, а дальше если в коде будет вызов метода записи, то код просто не скомпилится:

val oranges = listOf<Orange>(Orange(), Orange())
val objects: List<Any> = oranges
objects.add(Watermelon()) // Compilation error

То же самое, если суммировать две коллекции из разных объектов.

Никакой List<Any> в Яве невозможен. Возможен List<String> или List<Integer>, что вполне логично: разные типы не должны смешиваться.

К вашему сведению, выше написан код на Kotlin, там такое можно. В Java List не является read-only, а значит там написать такое нельзя и система типов в Java более ограниченная. Но можно сделать так:

import java.util.ArrayList;
import java.util.List;

public class Test {
    class Watermelon {}

    class Orange {}

    void test() {
        List<Object> objects = new ArrayList<>();
        objects.add(new Watermelon());
        objects.add(new Orange());
    }
}

Гипероператоры - это вполне конкретные математические действия над числами. Действие гипероператора можно показать на практике с предметами, так почему Вы считаете, что он не имеет связи с реальностью?

То же самое можно сказать про объекты - это конктреные действия над типами. Логика такая: при сложении коллекций разных типов дженерик аргумент реузьтирующей коллекции будет иметь наиболее общий тип, и она будет только для чтения.

В реальной жизни нет применения пентации и гипероператоров более высокой степени. А числа - это тоже абстрация, как и объекты.

Разница большая. Мы здесь общаемся на русском языке, поэтому применять более примитивный английский язык по меньшей мере странно. В английском языке fruit имеет значения фрукт, плод, результат, ягода. Это свидетельствует только о том, что большинство англичан не понимают, чем различаются фрукт, плод и ягода, а у нас это в базовой школе проходят. И откуда знать читателям, какое из этих значений Вы имели в виду? Вы бы ещё на арабском написали...

Потому что английский - это стандарт для международного общения, на нем больше всего инфы почти обо всем и почти все языки программирования основаны на нем. Общаемся на русском, а код - на английском. Арабский тут вообще не тему - из распространенного на нем только арабские цифры.

Самое главное, Вы забыли рассказать, с какой целью Вы их суммировали? ;)

Специально для невнимательных цитирую себя же:

Практичное реальное применение конкретной задачи с объектами выше - собратить статистику по всем существующим объектам в текущий момент работы приложения. Это используется при анализе потребления памяти.

  1. Если даже компилятор может вывести типы, то и человек может. Абстратные классы - это уже нереальные объекты, их даже создать нельзя. Стоит их запретить?

  2. Не противоречит он логике системе типов. Во многих языках программирования объект является базовым классов для любых других классов. Т.е. с точки зрения компилятора что Any (любой объект), что Fruit являются базовыми классами для Orange, что для Watermelon. У Fruit может быть чуть больше общих методов и свойств, но и у Any они тоже есть.

    Поэтому контейнеры, разрешающие запись, желательно делать инвариантными.

    Ну вы опять не разобрались в ситуации детально и что-то процитировали. В коде выше:

    val objects = oranges + watermelons

    Результирующая коллекция objects является read-only списком, т.е. она не разрешает запись, но разрешает чтение. Здесь нет никакого противоречия.

    Можно даже упростить до такого:

    val objects: List<Any> = oranges

    И будет objects из которого можно читать объекты, но в него нельзя писать, иначе можно поломать типы.

  3. Какую связь с реальностью имееют дробные производные или гипероператор? В математике вообще ничего нельзя пощупать. Практичное реальное применение конкретной задачи - с объектами выше - собратить статистику по всем существующим объектам в текущий момент работы приложения. Это используется при анализе потребления памяти.

  4. Какая разница что в русском они не являются синонимами? Я писал код на английском, с английскими комментами, а там fruit может обозначать и фрукт и плод. Главное, что и апельсин и арбуз можно назвать плодом - это абстракция.

  1. Вы думали, что я не замечу, что у Вас в коде есть переменная fruits? Т.е. фрукты? Это ведь значит, что по факту Вы суммируете не апельсины и арбузы, а фрукты ;)

Ок, так сойдет?

class Orange
class Watermelon

val oranges = listOf(Orange(), Orange())
val watermelons = listOf(Watermelon(), Watermelon(), Watermelon())

fun main() {
    // Compiler infers the most common type that is `Any` (object)
    val objects = oranges + watermelons
}

Если что - такое сложение позволяет сделать такая возможность, как ковариантность типов. В данном случае не важно, что суммируется: плоды или объекты, потому что с точки зрения компилятора суммируются коллекции разных типов. Причем выше в комментариях я специально написал такое:// But actually it's possible to concatenate objects of any type.

  1. В языках программирования логика есть. А вот в головах некоторых программистов её нету, поэтому они в состоянии написать абсолютно бредовый код, который даже будет работать, только не будет иметь никакой связи с реальностью.

Во-первых, как выше уже писал, ковариантность (и контрвариантность) - это важное понятие в языках программирования, которое позволяет сделать код более обобщенным и без лишнего дублирования. Во-вторых, а вы знаете, что в математике куча теорий, которые не имеют связи с реальностью, например, дробные производные, да и комплексные числа - это абстрактное понятие. У математиков тоже логики нет, и они придумывают что-то не связанное с реальностью?

Ну, и к Вашему сведению, арбуз не фрукт, а ложная ягода или плод, поэтому Ваш код тоже бредовый с точки зрения реальности. И язык программирования тут абсолютно не при чём. Назовите переменную как-то по-другому

Я в курсе, но в данном случае это не важно. К тому же если вы попытаетесь перевести слово "плод", то один из вариантов переводов будет "fruit". Т.е. это у вас бредовое утверждение, без углубления в вопрос.

А вот вопрос "сколько будет, если сложить 3 апельсина и 2 арбуза" глупый, потому что не логичный.

Логичный, вот вам пример сложения 3 апельсинов и 2 арбузов например на языке Котлин:

abstract class Fruit(val color: String)

class Orange : Fruit("Orange")
class Watermelon : Fruit("Green")

val oranges = listOf(Orange(), Orange(), Orange())
val watermelons = listOf(Watermelon(), Watermelon())

fun main() {
    // Kotlin infers the most common type that is `List<Fruit>`
    // But actually it's possible to concatenate objects of any type
    val fruits = oranges + watermelons
    // Now we can use common features like `color`
    fruits.forEach { println(it.color) }
    // And prints the size
    println(fruits.size) // Prints `5`
}

Т.е. ответ: "5 плодов" или хотя бы "5 объектов" - абсолютно логичный. Или по вашему в языках программирования нет логики?

И это не глупый вопрос, поскольку для требуется использовать такую операцию как сложение, которая может определяться по-разному, и понимание типов. Т.е. для этого применимо то же самое, что и для вопроса "может ли Земля вращаться вокруг Солнца", а именно: "логично представить все возможные варианты и просчитать, насколько они соответствуют реальности".

1
23 ...

Information

Rating
5,821-st
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity