Другие примеры волшебных вычислений

Судя по вашему скриншоту и выводу, в начале пути к файлу есть невидимый символ. Это приведет к тому, что .NET не сможет распознать, что это абсолютный путь, и автоматически это сделает его самим абсолютным путем.

Если вы используете этот код, вы заметите, что вставленный ? вызывает проблему здесь:

System.IO.FileInfo fi = new System.IO.FileInfo(@"?D:\some_file.ext");

, который выводит: C:\Users\...\ConsoleApp8\bin\Debug\netcoreapp2.2\?D:\some_file.ext.

Вместо:

System.IO.FileInfo fi = new System.IO.FileInfo(@"D:\some_file.ext");

Который выводит: D:\some_file.ext.

Если вы поместите свой код в HEX-редактор, вы увидите, что перед D: действительно есть символ.

13
задан Community 23 May 2017 в 10:27
поделиться

5 ответов

Взломы Битового жонглирования имеют много прохладных приемов.

Хотя часть его датирована теперь, мне внушили страх некоторые приемы в "Дзэн Оптимизации кода" Michael Abrash. Реализация Игры Жизни является ошеломляющей.

3
ответ дан 1 December 2019 в 22:58
поделиться

Существует книга, которая собирает многие из тех 'волшебных приемов', и это может быть интересно для Вас: Восхищение Хакера.

У Вас есть, например, много приемов как взломы битового жонглирования и т.д.... (у Вас есть несколько алгоритмов квадратного корня, например, что Вы видите на книжной версии Google),

5
ответ дан 1 December 2019 в 22:58
поделиться

Не точно математический взлом, но мне нравится этот о Римских цифрах в Java6:

public class Example {
    public static void main(String[] args) {
        System.out.println(
            MCMLXXVII + XXIV
        );
    }
}

даст Вам ожидаемый результат (1977 + 24 = 2001), из-за переписать правила:
class Transform extends TreeTranslator, внутренний класс компилятора Java.

Transform посещения все операторы в исходном коде и замены каждая переменная, имя которой соответствует Римской цифре международному литералу того же числового значения.

public class Transform extends TreeTranslator {
    @Override
    public void visitIdent(JCIdent tree) {
        String name = tree.getName().toString();
        if (isRoman(name)) {
            result = make.Literal(numberize(name));
            result.pos = tree.pos;
        } else {
            super.visitIdent(tree);
        }
    }
}
5
ответ дан 1 December 2019 в 22:58
поделиться

Я - большой поклонник Строки Bresenham, но укомплектовываю вращающее устройство CORDIC, включенное все виды пиксельных придирок для меня, когда центральные процессоры были медленнее.

4
ответ дан 1 December 2019 в 22:58
поделиться

Я всегда впечатлялся из двух классических 'волшебных' алгоритмов, которые имеют отношение к датам:

Некоторый (непротестированный) код следует:

import math

def dayOfWeek(dayOfMonth, month, year):
    yearOfCentury = year%100
    century = year // 100

    h = int(dayOfMonth + math.floor(26.0*(month + 1)/10) + yearOfCentury \
         + math.floor(float(yearOfCentury)/4) + math.floor(float(century)/4) \
         + 5*century) % 7
    return ['Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'][h]

def easter(year):
    a = year%19
    b = year%4
    c = year%7
    k = int(math.floor(float(year)/100))
    p = int(math.floor((13 + 8.0*k)/25))
    q = int(math.floor(float(k)/4))
    M = (15 - p + k - q)%30
    N = (4 + k - q)%7
    d = (19*a + M)%30
    e = (2*b + 4*c + 6*d + N)%7
    day1 =  22 + d + e 
    if day1 <= 31: return "March %d"%day1
    day2 = d + e - 9
    if day2 == 26: return "April 19"
    if day2 == 25 and (11*M + 11)%30 < 19: return "April 18"
    return "April %d"%day2  

print dayOfWeek(2, 12, 2008)  # 'Tuesday'
print easter(2008)            # 'March 23'
3
ответ дан 1 December 2019 в 22:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: