101

Re: OFF: Прошу подключиться к решению загадки… — II

6+3-9
Секунд десять думал...

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

102

Re: OFF: Прошу подключиться к решению загадки… — II

9+3-4=8
Решал на бумажке...

103

Re: OFF: Прошу подключиться к решению загадки… — II

ypppu пишет:

9+3-4=8
Решал на бумажке...

Это решение лучше .

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

104

Re: OFF: Прошу подключиться к решению загадки… — II

8+3-11=0
Какая-то детская задача.

105

Re: OFF: Прошу подключиться к решению загадки… — II

The gray Cardinal
Мне кажется, ты неверно решил. У девятки должен быть хвостик, то есть 9 это просто перевернутая 6.

autoit@conference.jabber.ru - Конференция скриптового языка AutoIt на jabber.ru

106

Re: OFF: Прошу подключиться к решению загадки… — II

Malcev пишет:

8+3-11=0
Какая-то детская задача.

Задача устарела. Раньше не было электронного табло, зато были конверты.

107

Re: OFF: Прошу подключиться к решению загадки… — II

офф: ну вот...опять ответы подсмотрели

The gray Cardinal пишет:

Секунд десять думал...

Дружище, так это рекорд!
http://math.all-tests.ru/node/468

108 (изменено: Rumata, 2013-01-16 16:52:02)

Re: OFF: Прошу подключиться к решению загадки… — II

The gray Cardinal пишет:

6+3-9

Как верно было упомянуто, с учетом правил начертания индексов на конвертах некорректно. Однако, математически верно, да и в условиях задачи не было ни слова про "конвертное начертание".

(картинка с википедии)
http://upload.wikimedia.org/wikipedia/commons/thumb/7/76/Russian_postal_codes.png/210px-Russian_postal_codes.png

( 2 * b ) || ! ( 2 * b )

109

Re: OFF: Прошу подключиться к решению загадки… — II

Простенькая задачка.
Подсчитать количество битов (1) в 32 битном знаковом числе.

( 2 * b ) || ! ( 2 * b )

110

Re: OFF: Прошу подключиться к решению загадки… — II

Наверное, есть вариант хитрее, чем сдвигать поразрядно число на один бит вправо и сравнивать оставшееся с нулём?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

111 (изменено: Rumata, 2013-01-16 20:28:10)

Re: OFF: Прошу подключиться к решению загадки… — II

teadrinker, я же говорю - простая задача. Кстати, перед тем как написать ее сам вспоминал ее решение.

Всем, возможно имеет смысл использовать кнопку

+ открыть спойлер
( 2 * b ) || ! ( 2 * b )

112

Re: OFF: Прошу подключиться к решению загадки… — II

Загадка...
Почему на украинских деньгах Ярослав Мудрый выглядит здоровым, а на наших 1000 руб с повреждённым глазом?
P. S.: Ответ я сам не знаю.

Post's attachments

ym.zip 361.06 kb, 32 downloads since 2013-01-17 

You don't have the permssions to download the attachments of this post.

113

Re: OFF: Прошу подключиться к решению загадки… — II

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

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

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

( 2 * b ) || ! ( 2 * b )

114

Re: OFF: Прошу подключиться к решению загадки… — II

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

115

Re: OFF: Прошу подключиться к решению загадки… — II

ypppu пишет:

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

Ну вот, сейчас придёт Aскет, и скажет, что известно кто .

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

116

Re: OFF: Прошу подключиться к решению загадки… — II

Да, масоны совсем обнаглели. Вон, у них даже равносторонние треугольники с углами 120, 30, 30

autoit@conference.jabber.ru - Конференция скриптового языка AutoIt на jabber.ru

117

Re: OFF: Прошу подключиться к решению загадки… — II

А чем ym.zip открывать то: ни проводник, ни WinRAR его не берут.

Забыл пароль и потерял e-mail.

118

Re: OFF: Прошу подключиться к решению загадки… — II

…ни WinRAR его не берут.

WinRAR — открывает.

119

Re: OFF: Прошу подключиться к решению загадки… — II

alexii пишет:

WinRAR — открывает.

У меня извлекает только через восстановление архива. Уже второй раз сталкиваюсь, что с аттача нормально не скачивается.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

120

Re: OFF: Прошу подключиться к решению загадки… — II

Мой WinRAR 2005 г. Может в новых версиях утеряна совместимость?

121

Re: OFF: Прошу подключиться к решению загадки… — II

teadrinker пишет:

У меня извлекает только через восстановление архива.

У меня та же байда. WinRAR 3.80.

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

122

Re: OFF: Прошу подключиться к решению загадки… — II

ypppu пишет:

Мой WinRAR 2005 г.

У меня тоже.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

123

Re: OFF: Прошу подключиться к решению загадки… — II

Хотя не, вру. WinRAR 3.10 (2002 г).

124

Re: OFF: Прошу подключиться к решению загадки… — II

Скорее всего, всё-таки скачивается повреждённый файл.

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

125

Re: OFF: Прошу подключиться к решению загадки… — II

>kaster
>120,30,30

Ну так это я тебя проверял на внимательность и знание википедии.
Естественно что подразумевалось 60.

У нас, у долбомасонских слявянских этимологов, так принято, всех проверять.

126

Re: OFF: Прошу подключиться к решению загадки… — II

Aскет пишет:

Естественно что подразумевалось 60.

Еще раз изложи остатки своих мыслей, только теперь правильно

autoit@conference.jabber.ru - Конференция скриптового языка AutoIt на jabber.ru

127

Re: OFF: Прошу подключиться к решению загадки… — II

http://img12.imageshack.us/img12/7442/image00120130118161924.png

http://img84.imageshack.us/img84/6374/image00120130118161958.png

А вот извлечь из него изображения действительно не получается.

128

Re: OFF: Прошу подключиться к решению загадки… — II

Я ym.zip открывал без проблем функционалом самой винды (6.1.7600, Microsoft Windows 7 Enterprise), прямо из этого зипа как из папки запускаю просмотр - все ОК (только что еще раз скачал и проверил).

WBR. Roman

129

Re: OFF: Прошу подключиться к решению загадки… — II

Я ym.zip открывал без проблем функционалом самой винды (6.1.7600, Microsoft Windows 7 Enterprise),

Ну-ка, ну-ка… Под Server 2008 R2 — увы.

130

Re: OFF: Прошу подключиться к решению загадки… — II

За очередными забыли простую задачку.

Rumata пишет:

Простенькая задачка.
Подсчитать количество битов (1) в 32 битном знаковом числе.

( 2 * b ) || ! ( 2 * b )

131

Re: OFF: Прошу подключиться к решению загадки… — II

То есть, сколько знаков в числе, состоящем из 32 знаков?

132

Re: OFF: Прошу подключиться к решению загадки… — II

Нет, сколько из них установлены в 1.

133

Re: OFF: Прошу подключиться к решению загадки… — II

Раз речь о битах, надо понимать, что число - в двоичной системе, так? Но ведь 32 знаками можно записать много  разных чисел:
00000000000000000000000000000000
00000000000000000000000000000001
00000000000000000000000000000010
. . .
11111111111111111111111111111101
11111111111111111111111111111110
11111111111111111111111111111111
То есть 32-битное число может содержать от 0 до 32 знаков.

134 (изменено: kaster, 2013-01-19 00:39:59)

Re: OFF: Прошу подключиться к решению загадки… — II

ypppu пишет:

То есть 32-битное число может содержать от 0 до 32 знаков.

Так тебя и просят найти количество этих битов в положении 1, для любого наперед заданного числа.

Меня смущает другое – не сказано какое число, целое или с плавающей точкой. Если для первого случая все просто и понятно, то для второго я пока в раздумьях.

autoit@conference.jabber.ru - Конференция скриптового языка AutoIt на jabber.ru

135 (изменено: ypppu, 2013-01-19 09:57:44)

Re: OFF: Прошу подключиться к решению загадки… — II

kaster пишет:

для любого наперед заданного числа

Теперь ясно.

Добавлено: А ещё наверно число задаётся в десятичной системе, о чём явно не указано.

136 (изменено: Rumata, 2013-01-19 01:42:05)

Re: OFF: Прошу подключиться к решению загадки… — II

kaster пишет:

Меня смущает другое – не сказано какое число, целое или с плавающей точкой.

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

( 2 * b ) || ! ( 2 * b )

137

Re: OFF: Прошу подключиться к решению загадки… — II

..А ведь есть и отрицательные и даже дробные числа при записи в 2х СС.

138

Re: OFF: Прошу подключиться к решению загадки… — II

Aскет пишет:

..А ведь есть и отрицательные и даже дробные числа при записи в 2х СС.

Коллега, я уже уточнил

32-битное знаковое целое число

То есть целое - не дробное. Знаковое - число со знаком, то есть и положительные, и отрицательные.
Надо посчитать количество битов (1).

( 2 * b ) || ! ( 2 * b )

139 (изменено: kaster, 2013-01-19 03:48:00)

Re: OFF: Прошу подключиться к решению загадки… — II

#!/bin/env python
def bits_calc(n):
    n_in = n
    if n < -2**31 or n > 2**31-1:
        ans = -1
        binrep = 'Number is out of range'
    else:
        if n == 0:
            ans = 0
            binrep = '0'*32
        else:
            sign = '0'
            ans = 0
            binrep = ''
            if n < 0:
                sign = '1'
                n += 2**31
                ans += 1
            while True:
                intp, resp = n//2, n % 2
                binrep = str(resp) + binrep
                if resp == 1:
                    ans += 1
                if intp < 2:
                    binrep = str(intp) + binrep
                    ans += 1
                    break
                n = intp
            binrep = sign + binrep.zfill(31)
    return ans, binrep

n = 2**32
onebitnum, binaryrepresentation = bits_calc(n)
print 'Binary representation of %d: %s\nNumber of one bits: %d' % (n, binaryrepresentation, onebitnum)
n = -128
onebitnum, binaryrepresentation = bits_calc(n)
print 'Binary representation of %d: %s\nNumber of one bits: %d' % (n, binaryrepresentation, onebitnum)
Rumata пишет:

Когда писал, предполагал, что если речь идет о битах, то априори подразумеваются  целые числа

Я не совсем понял этот момент. По твоему нецелые числа состоят не из битов?

autoit@conference.jabber.ru - Конференция скриптового языка AutoIt на jabber.ru

140

Re: OFF: Прошу подключиться к решению загадки… — II

kaster пишет:
Rumata пишет:

Когда писал, предполагал, что если речь идет о битах, то априори подразумеваются  целые числа

Я не совсем понял этот момент. По твоему нецелые числа состоят не из битов?

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

( 2 * b ) || ! ( 2 * b )

141

Re: OFF: Прошу подключиться к решению загадки… — II

kaster пишет:
            print 'Zero/0 has two representations:'
            print 'positive:\t' + '0'*32
            print 'negative:\t' + '1'*32
            print '-'*48
            print 'Number of 1 bits: Either 0 or 32'

Положительный и отрицательный нули, вроде бы, имеют место для машинного представления вещественных чисел. Для представления отрицательных целых чисел обычно используется дополнительный код и в нём нет места для ещё одного нуля, а 111…1 — это минус 1.

Мне кажется, Rumata зря уточнил, что число знаковое, т.к. это ни на что влиять не должно (по крайней мере для битовых операций).
На 32 битах тоже, может быть не стоило бы зацикливаться, а сказать, что длина машинного слова фиксирована и известна. Хотя для некоторых решений это существенно, но, возможно, и их можно было бы обобщить на произвольную длину, хотя я этого сделать не берусь, т.к. сам их плохо (совсем не) понимаю и сомневаюсь, что участники этого форума найдут их самостоятельно.

142 (изменено: Rumata, 2013-01-19 03:15:39)

Re: OFF: Прошу подключиться к решению загадки… — II

32 бит (битов) - уже давно "стандарт" представления целых чисел для большинства языков программирования. Не все языки понимают числа выше чем 2^32 как целое. Например, JavaScript.

Знаковое - тоже укладывается в этот стандарт. Дополнительно, снимается вопрос об отрицательных числах. Предполагаю, что для отрицательных чисел требуются некоторые преобразования. Но не факт.

( 2 * b ) || ! ( 2 * b )

143 (изменено: kaster, 2013-01-19 03:34:38)

Re: OFF: Прошу подключиться к решению загадки… — II

Да, я намудрил с отрицательными числами. Это неправильно, что числа разного знака но одного модуля имеют практически одинаковое бинарное представлением, за исключением самого левого бита. И да, для предотвращения двоякости в представлении нуля, надо действительно использовать Two's complement а не Ones' complement. Пределы я тоже использовал от Two's complement. Код подправлю чуть позже.

autoit@conference.jabber.ru - Конференция скриптового языка AutoIt на jabber.ru

144

Re: OFF: Прошу подключиться к решению загадки… — II

По рабоче-крестьянски:

Option Explicit

Dim strVar, strHexVar, strBinVar
Dim dictHex2Bin
Dim i


strVar = 2^31 - 1

Set dictHex2Bin = WScript.CreateObject("Scripting.Dictionary")

With dictHex2Bin
    .Add "0", "0000"
    .Add "1", "0001"
    .Add "2", "0010"
    .Add "3", "0011"
    .Add "4", "0100"
    .Add "5", "0101"
    .Add "6", "0110"
    .Add "7", "0111"
    .Add "8", "1000"
    .Add "9", "1001"
    .Add "A", "1010"
    .Add "B", "1011"
    .Add "C", "1100"
    .Add "D", "1101"
    .Add "E", "1110"
    .Add "F", "1111"
End With

strHexVar = Hex(strVar)

strBinVar = ""

For i = 1 To Len(strHexVar)
    strBinVar = strBinVar & dictHex2Bin.Item(Mid(strHexVar, i, 1))
Next

WScript.Echo Len(strBinVar) - Len(Replace(strBinVar, "1", ""))

WScript.Quit 0

145

Re: OFF: Прошу подключиться к решению загадки… — II

Ну, вот решение (на авторство не претендую), не зависящее от длины машинного слова и (без)знаковости аргумента (если используется дополнительный код):

+ открыть спойлер
function OnesCount(n) {
  var s = 0;
  while (n != 0) {
    n = n & (n - 1);
    s++;
  }
  return s;
}

(Хотя, конечно, ответ для каждого отрицательного числа, в отличии от положительных, зависит от количества выделяемых под запоминание числа разрядов, например, для -1 ответ как раз будет равен разрядности.)

146 (изменено: kaster, 2013-01-19 03:49:17)

Re: OFF: Прошу подключиться к решению загадки… — II

#!/bin/env python
def bits_calc(n):
    n_in = n
    if n < -2**31 or n > 2**31-1:
        ans = -1
        binrep = 'Number is out of range'
    else:
        if n == 0:
            ans = 0
            binrep = '0'*32
        else:
            sign = '0'
            ans = 0
            binrep = ''
            if n < 0:
                sign = '1'
                n += 2**31
                ans += 1
            while True:
                intp, resp = n//2, n % 2
                binrep = str(resp) + binrep
                if resp == 1:
                    ans += 1
                if intp < 2:
                    binrep = str(intp) + binrep
                    ans += 1
                    break
                n = intp
            binrep = sign + binrep.zfill(31)
    return ans, binrep

n = 2**32
onebitnum, binaryrepresentation = bits_calc(n)
print 'Binary representation of %d: %s\nNumber of one bits: %d' % (n, binaryrepresentation, onebitnum)
n = -128
onebitnum, binaryrepresentation = bits_calc(n)
print 'Binary representation of %d: %s\nNumber of one bits: %d' % (n, binaryrepresentation, onebitnum)
autoit@conference.jabber.ru - Конференция скриптового языка AutoIt на jabber.ru

147

Re: OFF: Прошу подключиться к решению загадки… — II

Заметил, что вопрос появился почти одновременно с этой темой.

Я в школе считал вот так

+ открыть спойлер

http://devices.narod.ru/7.2.files/image001.gif

И лучше выдумать не мог. (c)

148

Re: OFF: Прошу подключиться к решению загадки… — II

ypppu пишет:

Заметил, что вопрос появился почти одновременно с этой темой.

Я точно не автор той темы . Просто совпадение.

ypppu пишет:

Я в школе считал вот так

Это перевод в двоичную систему. Или обобщая - в любую другую позиционную систему счисления. Алгоритм един.

wisgest пишет:
    n = n & (n - 1);

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

( 2 * b ) || ! ( 2 * b )

149

Re: OFF: Прошу подключиться к решению загадки… — II

Rumata пишет:

Это перевод в двоичную систему.

ypppu пишет:

Я в школе считал вот так

Память имеет свойство искажаться...
На самом деле я считал вот так:

+ открыть спойлер

http://dpk-info.ucoz.ru/_pu/0/68929.jpg

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

150 (изменено: wisgest, 2013-01-19 11:50:34)

Re: OFF: Прошу подключиться к решению загадки… — II

Rumata пишет:
wisgest пишет:
    n = n & (n - 1);

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

— убирается последний 1:

X…Z10…0 - 1 == X…Z01…1
X…Z10…0 & X…Z01…1 == X…Z00…0

Насчёт «существенно быстрее» на самом деле не уверен: если 1 мало, то да, а если много — нет, а в среднем, может быть раза в два.

151 (изменено: Rumata, 2013-01-19 14:00:20)

Re: OFF: Прошу подключиться к решению загадки… — II

Уточню. Существенно быстрее для неотрицательных чисел. Цикл выполняется ровно M раз, где M - количество взведенных битов (1). В худшем случае (для N = -1) будет выполнено 32 итерации. Видимо можно улучшить этот алгоритм, например, взятием дополнения числа ~N, подсчетом его битов в M, а потом для отрицательных чисел вернуть 32 - M.

Дополнение. Улучшить можно лишь так, чтобы худший результат не превышал 16 итераций.

( 2 * b ) || ! ( 2 * b )

152 (изменено: wisgest, 2013-01-19 20:37:55)

Re: OFF: Прошу подключиться к решению загадки… — II

Почему 16, а не 31? На самом деле отрицательные числа не намного хуже (и о том, является число с 1 в старшем разряде знаковым отрицательным или беззнаковым положительным, можно особо не задумываться, по крайней мнре если использовать сдвиг, а не деление) , например -2147483648 требует лишь одной итерации.

153

Re: OFF: Прошу подключиться к решению загадки… — II

Я сейчас говорю не о целесообразности такой оптимизации. Это просто академический интерес. Трата времени в свое удовольствие (=

wisgest
Самое большое 32-битное положительное число - 0x7FFFFFFF (31 бит)
Самое большое 32-битное отрицательное число - 0xFFFFFFFF (или -1, 32 бита)

В обоих случаях быстрее и проще посчитать количество битов инвертировал каждый бит:
~0x7FFFFFFF = 0x80000000 (M = 1 бит)
~0xFFFFFFFF = 0x00000000 (M = 0 бит)
затем 32 - M - реальное число бит в исходном числе.

Для чисел вида 0xFFFF0000 и 0x0000FFFF решением является результат 16. Это максимальное количество итераций если попытаться оптимизировать вычисления в цикле. Однако мои оценки для JScript практически не дают существенного выигрыша. Для других языков не проверял.

( 2 * b ) || ! ( 2 * b )

154 (изменено: Rumata, 2013-01-21 15:02:47)

Re: OFF: Прошу подключиться к решению загадки… — II

Идея, основанная на серии последовательных сдвигов и суммировании соседних битов, не требует циклов. Алгоритм прост и его легко адаптировать на любом другом языке программирования.

x >>> y - операция логического сдвига. Значение в x сдвигается на y битов вправо. Освобожденное пространство заполняется нулями.


function bitCount(a)
{
    a = (a & 0x55555555) + ((a >>>  1) & 0x55555555);
    a = (a & 0x33333333) + ((a >>>  2) & 0x33333333);
    a = (a & 0x0F0F0F0F) + ((a >>>  4) & 0x0F0F0F0F);
    a = (a & 0x00FF00FF) + ((a >>>  8) & 0x00FF00FF);
    a = (a & 0x0000FFFF) + ((a >>> 16) & 0x0000FFFF);

    return a;
};
( 2 * b ) || ! ( 2 * b )

155 (изменено: Александр_, 2013-02-28 03:33:24)

Re: OFF: Прошу подключиться к решению загадки… — II

Rumata пишет:

Подсчитать количество битов (1) в 32 битном знаковом числе.
...
Идея, основанная на серии последовательных сдвигов и суммировании соседних битов, не требует циклов. Алгоритм прост и его легко адаптировать на любом другом языке программирования.

x >>> y - операция логического сдвига. Значение в x сдвигается на y битов вправо. Освобожденное пространство заполняется нулями.


function bitCount(a)
{
    a = (a & 0x55555555) + ((a >>>  1) & 0x55555555);
    a = (a & 0x33333333) + ((a >>>  2) & 0x33333333);
    a = (a & 0x0F0F0F0F) + ((a >>>  4) & 0x0F0F0F0F);
    a = (a & 0x00FF00FF) + ((a >>>  8) & 0x00FF00FF);
    a = (a & 0x0000FFFF) + ((a >>> 16) & 0x0000FFFF);
    return a;
};

Совсем я заскучал, поэтому напишу подробное решение.

+ подробное объяснение в картинках

Начну с обозначения - сдвиг вправо принято обозначать ">>" или "shr". Насчёт не требует циклов- это да, но он ведь рекурсивный . Дальше идея алгоритма известна почти всем - разделяй и властвуй. Т.е. в этом случае - сумма битов в двойном слове равна сумме битов в младшем и старшем слове. А сумма битов в слове равна сумме битов в его байтах, сумма битов в байте равна сумме битов в его тетрадах, а сумма битов в тетраде равна сумме битов в парах и, наконец, сумма битов в паре равна сумме одиночных битов. В первой строчке суммируются биты, во второй пары битов, затем тетрады, байты и слова. Пусть a = 1985927312, тогда первое слагаемое в первой строке (a & 0x55555555):
http://s40.radikal.ru/i087/1302/c8/6011f57f9fb3.png
Второе слагаемое получается точно так же, только сначала число сдвигается на 1 разряд вправо ((a >>  1) & 0x55555555):
http://s019.radikal.ru/i620/1302/d3/d18954967530.png
Само сложение:
http://s004.radikal.ru/i205/1302/29/ab12616ac529.png
Далее(вторая строка) таким же образом находим сумму в каждой тетраде(a & 0x33333333):
http://s019.radikal.ru/i627/1302/15/1ed8e5677b75.png
((a >>  2) & 0x33333333):
http://s51.radikal.ru/i134/1302/64/8389c8b99e9b.png
и их сумма(в нижней строке перевод каждой тетрады в десятичное число):
http://s51.radikal.ru/i134/1302/56/d0da577ebaac.png
Дальше тетрады объединяются в байты, затем байты в слова и слова в двойное слово. Я думаю расписывать это нет смысла.

+ другие вариации этого решения

Можно так же предложить вариации с другим способом разделения битов. Самым быстрым мне видится вариант с использованием 3-битовых полей:

a = 1985927312; // наше число
n = (a>>1) & 0xDB6DB6DB;
a = a - n;
n = (a>>1) & 0xDB6DB6DB;
a = a - n;
a = ((a + (a>>3)) & 0xC71C71C7) % 63;

Тут используется тот факт, что сумма битов в 3-битовом блоке равна x-x/2-x/4(деление целочисленное). На мой взгляд решение очень красивое . К сожалению для 64 бит этот вариант не подойдёт, максимум 62. Разумеется можно оптимизировать изначальный вариант, заменив последние преобразование на взятие остатка.
Ещё можно заранее проинициализировать память и брать значения сумм оттуда. Это банально, но эффективно(хотя хрен его знает, битовые операции гораздо шустрее чем адресация).

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

156

Re: OFF: Прошу подключиться к решению загадки… — II

сумма битов в слове равна сумме битов в его байтах, сумма битов в байте равна сумме битов в его тетрадах, а сумма битов в тетраде равна сумме битов в парах и, наконец, сумма битов в паре равна сумме одиночных битов

Тоже, для разнообразия, приведу

+ объяснение без картинок

А теперь рассмотрим пары бит (двухбитовое число, двоичное представление):


0 = 00
1 = 01
2 = 10
3 = 11

Видно, что 1 и 2 - состоят из 1 бита, 3 - 2 битов. В общем случае, одним арифметическим выражением, записать количество битов в зависимости от числа (двухбитового) можно так:

n = n & 1 + n >>> 1

Аналогично, для 4-битового числа (выражение в псевдокоде и битовое представление в комментарии):


n = n & 5 + (n >>> 1) & 5 // xxxx & 0101 + (xxxx >>> 1) & 0101
n = n & 3 + (n >>> 2) & 3 // xxxx & 0011 + (xxxx >>> 2) & 0011

Для 8-, 16-, 32- и более битных чисел, аналогично, увеличивается лишь количество используемых "магических чисел", значения которые должны покрывать заданную разрядную сетку.

Этот алгоритм в неявное форме содержит в себе цикл. Но количество итераций фиксировано (в данном случае - 5) и этот цикл "раскрученный".

Другой вариант решения
Тут используется тот факт, что сумма битов в 3-битовом блоке равна x-x/2-x/4(деление целочисленное). На мой взгляд решение очень красивое. К сожалению для 64 бит этот вариант не подойдёт, максимум 62

Красиво.

( 2 * b ) || ! ( 2 * b )

157

Re: OFF: Прошу подключиться к решению загадки… — II

А магические числа это:

const_01 = (-1)/3
const_0011 = (-1)/5
const_00001111 = (-1)/17

деление беззнаковое.
ещё задачки есть или продолжим эту раскрывать?

158

Re: OFF: Прошу подключиться к решению загадки… — II

деление беззнаковое.

И, на всякий случай упомяну, целочисленное.

ещё задачки есть

Вот задачка из "Жемчужин программирования" Бентли. Предлагаю решить самостоятельно прежде чем искать ответ в источнике.

Есть словарь - простой текстовый файл, где каждая строка файла содержит ровно одно слово (в оригинале английские слова; например, /usr/share/dict/linux.words). Найти все анаграммы - слова, состоящие из одинаковых букв (пример: равновесие - своенравие)

( 2 * b ) || ! ( 2 * b )

159

Re: OFF: Прошу подключиться к решению загадки… — II

Rumata пишет:

Есть словарь - простой текстовый файл, где каждая строка файла содержит ровно одно слово (в оригинале английские слова; например, /usr/share/dict/linux.words). Найти все анаграммы - слова, состоящие из одинаковых букв (пример: равновесие - своенравие)

+ Я бы делал так:
  1. Придумываем быструю функцию, которая считает хеш слова, причём этот хеш не должен зависеть от порядка букв. В простейшем случае это просто сортировка букв этого слова в алфавитном порядке.

  2. Для каждого слова считаем этот хеш и добавляем в упорядоченный список(при условии, что его там ещё нет). Кроме хеша сохраняем в списке ещё и индекс слова(номер байта в файле, с которого оно начинается).
    http://s017.radikal.ru/i422/1302/cf/50a999c68943.png

  3. Теперь остаётся только удалить из списка хеши, которым соответствует только одна запись.

Требуется только один проход по файлу, довольно много памяти(в худшем случае, при отсутствии акронимов это размер словаря+24 байта на слово).

160 (изменено: Rumata, 2013-03-01 19:16:57)

Re: OFF: Прошу подключиться к решению загадки… — II

Александр_
Частично Вы правы:
1. это должна быть простейшая хэш-функция. Все анаграммы имеют общее свойство - одинаковое количество букв. Отсортированный в алфавитном порядке буквы слов позволяют однозначно идентифицировать анаграммы (палиндромы, кстати тоже).
2. Что Вам даст индекс слова в процессе нахождения анаграмм? Это избыточная информация.
3. Согласен. Собрать все слова, имеющие одинаковый хэш. Но мне не понятно какие оценки дают такое число "24 байта на слово".

Все гораздо проще:
1. для каждого слова создать хэш (сортировка всех букв в слове) и вывести пару значений: "хеш слово"
2. отсортировать результат из п.1 (так как в начале строк стоят хэши, то сортировка приведет к группировке анаграмм по хэшам)
3. вывести все анаграммы, группируя из построчно.

( 2 * b ) || ! ( 2 * b )

161 (изменено: Александр_, 2013-03-01 19:49:26)

Re: OFF: Прошу подключиться к решению загадки… — II

Rumata пишет:

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

Ну количества букв явно не достаточно, коллизий будет больше чем совпадений. Тут несколько вариантов и они зависят от размера хеша. Можно поставить каждой букве в соответствие биты в хеше, т.е. чтобы каждая буква влияла только на свои биты, своеобразный аналог сжатия с потерями. На вскидку, при таком подходе размер хеша должен быть раза в два больше алфавита(т.е. в среднем на одну букву должно приходится 2 бита). Можно сделать по аналогии с криптографическими хешами, это универсальный вариант и вероятность коллизии и размер хеша не будут особо зависеть от алфавита.

(палиндромы, кстати тоже).

???

Rumata пишет:

2. Что Вам даст индекс слова в процессе нахождения анаграмм? Это избыточная информация.

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

Rumata пишет:

3. Согласен. Собрать все слова, имеющие одинаковый хэш. Но мне не понятно какие оценки дают такое число "24 байта на слово".

Больше всего памяти потребуется, если в словаре нет анаграмм:

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

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

Rumata пишет:

Все гораздо проще:
1. для каждого слова создать хэш (сортировка всех букв в слове) и вывести пару значений: "хеш слово"
2. отсортировать результат из п.1 (так как в начале строк стоят хэши, то сортировка приведет к группировке анаграмм по хэшам)
3. вывести все анаграммы, группируя из построчно.

Проще, но хуже.

162 (изменено: Rumata, 2013-03-01 20:00:29)

Re: OFF: Прошу подключиться к решению загадки… — II

Предполагается, что система 64-битная.

У меян 32 бита. Оффтопом. И на ней я пытался виртуализировать 64-битную ОС. Сам не смог - помогли товарищи. Но на эту тему я дискутировать не собираюсь. Так, к слову пришлось.

Ну количества букв явно не достаточно, коллизий будет больше чем совпадений.

KISS, коллега! Какие коллизии? street, tester. хэш - eerstt. Все! Дальше группируем строки с одинаковым хэшем. Те группы, в которых количество элементов больше одного - анаграммы. Их выводим, остальные отбрасываем. Вам решение на Perl показать? Или Вам JScript ближе? Просто другие выделяются в две большие группы - которые не помню, и которые не знаю.

( 2 * b ) || ! ( 2 * b )

163 (изменено: Александр_, 2013-03-01 20:44:51)

Re: OFF: Прошу подключиться к решению загадки… — II

Rumata пишет:

KISS, коллега! Какие коллизии? street, tester. хэш - eerstt. Все!

Об этом я в первом ответе написал, а вы ответили:

Rumata пишет:

Все анаграммы имеют общее свойство - одинаковое количество букв.

Тут количество букв не используется, используются сами буквы.

Rumata пишет:

Вам решение на Perl показать? Или Вам JScript ближе?

Оба знакомы и оба далеки, Perl чуть дальше . Может си? И прилагается ли словарь для тестирования? .

Rumata пишет:

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

О чём тут речь?

И возвращаясь к предыдущей задачке - тыц. 9-битный вариант можно преобразовать в 8-битный для 32-битного регистра. Есть аналогичный код для 15-ти бит и 64-битного регистра. Правда оригинальную задачу они не особо хорошо решают .

164 (изменено: Rumata, 2013-03-01 21:57:41)

Re: OFF: Прошу подключиться к решению загадки… — II

Все анаграммы имеют общее свойство - одинаковое количество букв.

Тут количество букв не используется, используются сами буквы.

O, mea culpa! Простите. Имелось в виду что-то вроде "одинаковое количество используемых букв".

О чём тут речь?

О ЯП. К сожалению ни на одном из серии C/C++ я не писал ничего. Мне тут подумалось, что C-программисты поймут в общих чертах C-подобные же ЯП. Оба предложенные языка - стилистически C-подобные. Полагаю, что Вам легко понять о чем идет речь, особенно на JScript.

словарь для тестирования

Словарь под unix/cygwin находится где-то в /usr/share. Например на некоторых машинах я видел его в /usr/share/dict/words/* (конкретно, файл linux.words) или в /usr/share/dict/words. У меня стоит cygwin и небольшой словарь в моей инсталляции расположен в /usr/share/typespeed/words/words.eng.

====

Правда оригинальную задачу они не особо хорошо решают

Либо решает, либо не решает.

( 2 * b ) || ! ( 2 * b )

165 (изменено: Александр_, 2013-03-01 22:26:08)

Re: OFF: Прошу подключиться к решению загадки… — II

Rumata пишет:

О ЯП. К сожалению ни на одном из серии C/C++ я не писал ничего. Мне тут подумалось, что C-программисты поймут в общих чертах C-подобные же ЯП. Оба предложенные языка - стилистически C-подобные. Полагаю, что Вам легко понять о чем идет речь, особенно на JScript.

Тут дело не в синтаксисе, просто на практике проверить скорость не получится. Сишный компилятор сгенерирует очень быстрый код в сравнении со скриптом.

Rumata пишет:

Словарь под unix/cygwin находится где-то в /usr/share. Например на некоторых машинах я видел его в /usr/share/dict/words/* (конкретно, файл linux.words) или в /usr/share/dict/words. У меня стоит cygwin и небольшой словарь в моей инсталляции расположен в /usr/share/typespeed/words/words.eng.

Спасибо, нашёл на виртуалке . Только там какие-то левые слова находятся, например "?ngstr?m" в файле "british-english" O_o. Движок форума даже буквы такие отказывается показывать .

Rumata пишет:

Либо решает, либо не решает.

Отлично решает упрощённую задачу, но это не получается использовать для более выгодного решения основной задачи.

166 (изменено: Rumata, 2013-03-01 22:46:30)

Re: OFF: Прошу подключиться к решению загадки… — II

Сишный компилятор сгенерирует очень быстрый код в сравнении со скриптом.

Боюсь огорчить, но это не тот вариант, когда требуется оптимизация по времени - фактически это одноразовая задача. Конечно, надо всегда предполагать, что задача может повторится, но если словарь неизменен, или изменяется очень редко, то результат можно кешировать.

левые слова находятся, например "?ngstr?m" в файле "british-english"

Полагаю, что заглавная А с кружочком; между r и m  буква о с двумя точками как в ё. Очень похоже на то, что кодировка файла - utf-X (уж не помню, которая из них), а в консоли используется что-то отличное от Юникода.

Движок форума даже буквы такие отказывается показывать

В предпросмотре показывает, а при отправке отказывается. Определенно, кривой движок.

( 2 * b ) || ! ( 2 * b )

167

Re: OFF: Прошу подключиться к решению загадки… — II

Rumata пишет:

Боюсь огорчить, но это не тот вариант, когда требуется оптимизация по времени - фактически это одноразовая задача. Конечно, надо всегда предполагать, что задача может повторится, но если словарь неизменен, или изменяется очень редко, то результат можно кешировать.

И чем тогда интересна эта задача? Простое решение любой школьник найдёт.

Rumata пишет:

Возможно ?ngstr?m. Очень похоже на то, что кодировка файла - utf-X (уж не помню, которая из них), а в консоли используется что-то отличное от Юникода.

Не думаю, вся латиница там верно показана, буква определённо из другого алфавита. Похоже это слово "angstrom" по-шведски написано.

168 (изменено: kaster, 2013-03-02 01:18:34)

Re: OFF: Прошу подключиться к решению загадки… — II

Все верно, это длинная А в шведском, финском, датском и возможно в других. Имеет коды в системах
ISO 8859/Unicode - 197/229 (C5, E5)
UTF8 - C385, C3E5
HTML - &Aring, &aring (&#xC5, &#xE5)
Unicode совпадает с обычной латиницей в ANSI для кодов 0-127.

PS: Очень странно, Unicode символы нормально отображаются в предпросмотре, но при непосредственной отправке заменяются на placeholder `?' для неюникодных символов.

autoit@conference.jabber.ru - Конференция скриптового языка AutoIt на jabber.ru

169

Re: OFF: Прошу подключиться к решению загадки… — II

kaster, так отчасти было и на старой версии движка. Даже приходилось паковать код и выкладывать на стороннем ресурсе.

170

Re: OFF: Прошу подключиться к решению загадки… — II

И чем тогда интересна эта задача?

Поиском простых решений.

Простое решение любой школьник найдёт.

Не всегда.

добавление сигнатур | сортировка | объединение слов с одинаковой сигнатурой | вывод слов-анаграмм
( 2 * b ) || ! ( 2 * b )

171

Re: OFF: Прошу подключиться к решению загадки… — II

Rumata пишет:

Поиском простых решений.

Рекомендую ЕГЭ по математике, там кроме простых решений ничего не требуется. Под интересными задачами я понимаю задачи, как минимум требующие неочевидных решений.

Rumata пишет:

Не всегда.

добавление сигнатур | сортировка | объединение слов с одинаковой сигнатурой | вывод слов-анаграмм

Ну да, если это школа для детей с ЗПР, то у них с этим будут проблемы .

172

Re: OFF: Прошу подключиться к решению загадки… — II

Покажите Ваше, посмеемся вместе.

( 2 * b ) || ! ( 2 * b )

173

Re: OFF: Прошу подключиться к решению загадки… — II

Rumata пишет:

Покажите Ваше, посмеемся вместе.

Показать моё что? Если решение этой задачи, то теперь не вижу смысла - тебя оно не интересует, а больше в обсуждении никто не участвует.
P.S. предлагаю общаться на "ты", а то как-то странно получается .

174

Re: OFF: Прошу подключиться к решению загадки… — II

предлагаю общаться на "ты", а то как-то странно получается

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

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

( 2 * b ) || ! ( 2 * b )

175

Re: OFF: Прошу подключиться к решению загадки… — II

Rumata пишет:

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

Я всё-таки за обсуждение алгоритма. Если в словаре будет много длинных слов, то их сортировка займёт много времени и памяти, либо придётся сортировать по мере считывания строки. Если же придумать нормальный хеш, то памяти будет требоваться фиксированное количество на слово, плюс его гораздо удобнее сравнивать чем строку. По идее 64-битного хеша должно быть достаточно, но простейший вариант:

BYTE HASH_TABLE[] = {0, 3, 5, 7, 10, 14, 16, 18, 21, 24, 26, 28, 31, 33, 36, 39, 41, 43, 46, 49, 52, 54, 56, 58, 60, 62};
#define HASH_FUNC(hash, x) hash += 1ull<<HASH_TABLE[x-'a']

дал сразу две коллизии на словаре в 100'000 слов. При этом на реальном, упорядоченном словаре он отработал на 10% быстрее и на столько же меньше съел памяти. А вот на случайных данных не было коллизий и отработал на 40% быстрее. На больших выборках не проверял, поскольку этот хеш не годится.

176

Re: OFF: Прошу подключиться к решению загадки… — II

Александр_, уже мелькал в нашем обсуждении алгоритм получения хеша - сортировка символов в слове. Не наю как это работает в случае C/C++, в Perl же это коротко и красиво )))

Слово переводим в верхний регистр (uc), разбиваем посимвольно (split ""), сортируем (sort) и снова объединяем в одну строку (join "").


# Perl implementation
$signature = join "", sort(split "", uc $word);

При равенстве этих сигнатур мы имеем слова, являющиеся анаграммами. Объединяя слова под одной сигнатурой, мы получаем список анаграмм.

( 2 * b ) || ! ( 2 * b )

177

Re: OFF: Прошу подключиться к решению загадки… — II

Rumata пишет:

Не наю как это работает в случае C/C++, в Perl же это коротко и красиво )))

//hash - строка, hash.begin() - итератор на начало строки, hash.end() - итератор на конец строки
std::sort(hash.begin(), hash.end());

Но как я уже сказал - это не "коротко и красиво", а "медленно и банально". И строго говоря это не хеш, у хеша фиксированная длина.

178

Re: OFF: Прошу подключиться к решению загадки… — II

Задача с dirty.

Виини–Пух и Пятачок ели торт. За сколько времени они вдвоем смогли это сделать?
Интересно, что:
если бы ели тот же торт два Винни–Пуха, то у них торт был бы съеден на 1 минуту раньше, чем это удалось Винни и Пятачку вместе;
а если бы если тот же самый торт два Пятачка, то на 4 минуты больше бы времени затратили, чем Винни и Пятачок вместе.
Так за сколько же времени съели торт друзья?

Насколько я понял, там они её пока не решили, или решения были неверными. Во всяком случае, у меня другое.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

179 (изменено: Poltergeyst, 2013-03-14 23:32:38)

Re: OFF: Прошу подключиться к решению загадки… — II

за сколько же времени съели торт друзья?

2+2/3 мин, хотя сомневаюсь, однако.

180

Re: OFF: Прошу подключиться к решению загадки… — II

Неплохо бы решение представить

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

181

Re: OFF: Прошу подключиться к решению загадки… — II

teadrinker пишет:

Неплохо бы решение представить

Давайте посмотрим, может есть другие варианты.

182 (изменено: Александр_, 2013-03-15 00:42:14)

Re: OFF: Прошу подключиться к решению загадки… — II

ха-хах . Хорошая задача, поскольку интуитивное решение оказывается неверным. Жаль только что оно вообще решения не даёт, если бы ещё неправильный ответ получался, то вообще здорово было бы. Решение:

+ открыть спойлер

задача на скорость/время/расстояние(3 класс(sic!)), только время в минутах, а расстояние в пирогах:
http://ru.numberempire.com/equation.render?\left\{\begin{matrix}(v_x+v_y)t=1\\2v_x(t-1)=1\\2v_y(t+4)=1\end{matrix}\right.\Rightarrow%20\left\{\begin{matrix}v_x=\frac3{10}\\v_y=\frac3{40}\\t=\frac83\end{matrix}\right.

183

Re: OFF: Прошу подключиться к решению загадки… — II

Александр_ пишет:

Решение:

Если быть точным, t найдено верно, а вот скорости не определены.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

184

Re: OFF: Прошу подключиться к решению загадки… — II

teadrinker пишет:

Если быть точным, t найдено верно, а вот скорости не определены.

???

185

Re: OFF: Прошу подключиться к решению загадки… — II

Они могут быть любыми

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

186

Re: OFF: Прошу подключиться к решению загадки… — II

teadrinker пишет:

Они могут быть любыми

Я в замешательстве. Подставил 1 и 1 - не подошло.

187

Re: OFF: Прошу подключиться к решению загадки… — II

Ну вот ты приравниваешь все уравнения к одному. С таким же успехом можно приравнять к 10, время останется тем же, скорости изменятся.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

188

Re: OFF: Прошу подключиться к решению загадки… — II

teadrinker пишет:

Ну вот ты приравниваешь все уравнения к одному. С таким же успехом можно приравнять к 10, время останется тем же, скорости изменятся.

нет, у меня невырожденная система из трёх уравнений с тремя неизвестными.

189

Re: OFF: Прошу подключиться к решению загадки… — II

А 1 — это чего один?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

190 (изменено: Александр_, 2013-03-15 01:21:34)

Re: OFF: Прошу подключиться к решению загадки… — II

teadrinker пишет:

А 1 — это чего один?

это же расстояние. Скорость V, умножаем на время t и получаем расстояние S. Можно переформулировать задачу так:
Винии и Пятак находятся в 1км друг от друга и равномерно движутся на встречу друг другу. Через какое время они встретятся, при условии что: (ну и т.д. по условию).

191

Re: OFF: Прошу подключиться к решению загадки… — II

Так расстояние (объём или масса торта) может быть любым

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

192 (изменено: Poltergeyst, 2013-03-15 01:26:15)

Re: OFF: Прошу подключиться к решению загадки… — II

teadrinker пишет:

время останется тем же, скорости изменятся.

Определены относительные скорости. Для решения задачи, т.е определения времени поедания пирога, абсолютная скорость кг/сек значения не имеет и, похоже, не определяется, т.к по идее, вместо единиц в уравнении _Александра, должна быть масса пирога, которая исключается из системы после манипуляций над ней.

193 (изменено: Александр_, 2013-03-15 01:25:49)

Re: OFF: Прошу подключиться к решению загадки… — II

teadrinker пишет:

Так расстояние (объём или масса торта) может быть любым

Причём тут масса? Расстояние - это количество пирогов(или тортов, забыл уже).

Poltergeyst пишет:

Определены относительные скорости. Для решения задачи, т.е определения времени поедания пирога абсолютная скорость кг/сек значения не имеет и, похоже, не определяется, т.к по идее вместо единиц в уравнении _Александра, должна быть масса пирога, которая исключается из системы после манипуляций над ней.

всё там правильно, откуда вы вообще килограммы взяли?

194

Re: OFF: Прошу подключиться к решению загадки… — II

Да, если скорость в тортах, тогда верно. Тем не менее, можно мерить и в килограммах, и приравнивать к переменной, которая потом сократится.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

195 (изменено: Александр_, 2013-03-15 01:32:31)

Re: OFF: Прошу подключиться к решению загадки… — II

teadrinker пишет:

Да, если скорость в тортах, тогда верно.

нет, скорость в "тортах в минуту" . Я это в решении написал, только про пироги.
З.Ы. Теперь я хочу пирог... Ушёл в магазин полвторого ночи...
upd:

teadrinker пишет:

Тем не менее, можно мерить и в килограммах, и приравнивать к переменной, которая потом сократится.

можно, тогда будет 4 переменных на три уравнения, но три интересующие нас переменные всё равно будут определены.

196 (изменено: Poltergeyst, 2013-03-15 01:37:56)

Re: OFF: Прошу подключиться к решению загадки… — II

Александр пишет:

всё там правильно, откуда вы вообще килограммы взяли?

Еще раз:

абсолютная скорость кг/сек значения не имеет

Поэтому килограммы, в данном случае, также не имеют значения, взяты просто для наглядности.

197

Re: OFF: Прошу подключиться к решению загадки… — II

Александр_ пишет:

З.Ы. Теперь я хочу пирог...

Ну, пирог ты сам придумал

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

198

Re: OFF: Прошу подключиться к решению загадки… — II

+ offtop
teadrinker пишет:

Ну, пирог ты сам придумал

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

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

N человек(включая вас) получают последовательные номера от 1 до N. Затем вы становитесь в круг и каждого второго убивают, пока не останется только один. Придумайте способ быстро вычислить спасительное место.

Пример для 5 игроков(курсивом выделены выбывшие, подчёркнут выбывший в текущем раунде):

1, 2, 3, 4, 5
1, 2, 3, 4, 5
1, 2, 3, 4, 5
1, 2, 3, 4, 5
спасительный номер - 3.

199

Re: OFF: Прошу подключиться к решению загадки… — II

У меня такой алгоритм получился:

+ открыть спойлер
MsgBox, % KillSecond(18)

KillSecond(n)
{
   min := 1, max := n
   del := 1   ; удалялось ли последнее число в ряду в предыдущей итерации, в начале равно 1
   step := 1  ; шаг "прореживания"

   Loop  ; цикл
   {
      step *= 2
      
   ; если в прошлой итерации последнее удалялось, минимальное остаётся
   ; иначе заменяется на следующее по предыдущему шагу
      min := del ? min : min + step//2
      
      if (min + step > max)
         break

   ; если разность максимального и минимального делится на шаг с остатком
   ; максимальное заменяется на предыдущее, иначе остаётся
      if mod(max - min, step)
         max -= step//2, del := 1
      else
         del := 0
   }
   Return min
}

Наверное, как-то проще можно

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

200

Re: OFF: Прошу подключиться к решению загадки… — II

Реализовывать алгоритм не стал. После нескольких ручных тестов получил следующую зависимость:

+ описание

(первый столбец - количество игроков, второй - номер победителя)
2 - 1
3 - 3

4 - 1
5 - 3
6 - 5
7 - 7

8 - 1
...
13 - 11
14 - 13
15 - 15

16 - 1

Можно вывести формулу, однозначно описывающую эту зависимость.

( 2 * b ) || ! ( 2 * b )