Re: OFF: Прошу подключиться к решению загадки… — II
6+3-9
Секунд десять думал...
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Серый форум → Общение → Script-Coding.com community → OFF: Прошу подключиться к решению загадки… — II
6+3-9
Секунд десять думал...
9+3-4=8
Решал на бумажке...
9+3-4=8
Решал на бумажке...
Это решение лучше .
8+3-11=0
Какая-то детская задача.
The gray Cardinal
Мне кажется, ты неверно решил. У девятки должен быть хвостик, то есть 9 это просто перевернутая 6.
8+3-11=0
Какая-то детская задача.
Задача устарела. Раньше не было электронного табло, зато были конверты.
офф: ну вот...опять ответы подсмотрели
Секунд десять думал...
Дружище, так это рекорд!
http://math.all-tests.ru/node/468
6+3-9
Как верно было упомянуто, с учетом правил начертания индексов на конвертах некорректно. Однако, математически верно, да и в условиях задачи не было ни слова про "конвертное начертание".
(картинка с википедии)
Простенькая задачка.
Подсчитать количество битов (1) в 32 битном знаковом числе.
Наверное, есть вариант хитрее, чем сдвигать поразрядно число на один бит вправо и сравнивать оставшееся с нулём?
teadrinker, я же говорю - простая задача. Кстати, перед тем как написать ее сам вспоминал ее решение.
Всем, возможно имеет смысл использовать кнопку
Загадка...
Почему на украинских деньгах Ярослав Мудрый выглядит здоровым, а на наших 1000 руб с повреждённым глазом?
P. S.: Ответ я сам не знаю.
ypppu, это Вы сами обнаружили или Вам показали? Там масштабы совершенно разные - на украинской гривне голова Ярослава в половину полотна, возможно это репродукция картины или иконы. На российской тысяче - изображение памятника в Ярославле в полный рост. И повреждение глаза - надо еще умудриться разглядывать в сильную лупу.
К сожалению у меня нет достаточно большой лупы. Сколько смотрел не увидел ничего. Возможно небольшой брак, который в данном случае несущественен.
А вообще-то я думаю, что это зрительный обман как с шестым пальцем папы римского на картине Рафаэля "Сиксинская мадонна". На википедии есть статья
Обнаружил, пока тренировался со сканером. В общем-то и без лупы видно.
Сейчас нашёл купюру более старого образца - там такого косяка нет. Веко не растянуто, зрачок не висит.
Похоже, кто-то обводил в векторной программе и решил прикольнуться - заметят или нет.
Похоже, кто-то обводил в векторной программе и решил прикольнуться - заметят или нет.
Ну вот, сейчас придёт Aскет, и скажет, что известно кто .
Да, масоны совсем обнаглели. Вон, у них даже равносторонние треугольники с углами 120, 30, 30
А чем ym.zip открывать то: ни проводник, ни WinRAR его не берут.
…ни WinRAR его не берут.
WinRAR — открывает.
WinRAR — открывает.
У меня извлекает только через восстановление архива. Уже второй раз сталкиваюсь, что с аттача нормально не скачивается.
Мой WinRAR 2005 г. Может в новых версиях утеряна совместимость?
У меня извлекает только через восстановление архива.
У меня та же байда. WinRAR 3.80.
Мой WinRAR 2005 г.
У меня тоже.
Хотя не, вру. WinRAR 3.10 (2002 г).
Скорее всего, всё-таки скачивается повреждённый файл.
>kaster
>120,30,30
Ну так это я тебя проверял на внимательность и знание википедии.
Естественно что подразумевалось 60.
У нас, у долбомасонских слявянских этимологов, так принято, всех проверять.
Естественно что подразумевалось 60.
Еще раз изложи остатки своих мыслей, только теперь правильно
А вот извлечь из него изображения действительно не получается.
Я ym.zip открывал без проблем функционалом самой винды (6.1.7600, Microsoft Windows 7 Enterprise), прямо из этого зипа как из папки запускаю просмотр - все ОК (только что еще раз скачал и проверил).
Я ym.zip открывал без проблем функционалом самой винды (6.1.7600, Microsoft Windows 7 Enterprise),
Ну-ка, ну-ка… Под Server 2008 R2 — увы.
За очередными забыли простую задачку.
Простенькая задачка.
Подсчитать количество битов (1) в 32 битном знаковом числе.
То есть, сколько знаков в числе, состоящем из 32 знаков?
Нет, сколько из них установлены в 1.
Раз речь о битах, надо понимать, что число - в двоичной системе, так? Но ведь 32 знаками можно записать много разных чисел:
00000000000000000000000000000000
00000000000000000000000000000001
00000000000000000000000000000010
. . .
11111111111111111111111111111101
11111111111111111111111111111110
11111111111111111111111111111111
То есть 32-битное число может содержать от 0 до 32 знаков.
То есть 32-битное число может содержать от 0 до 32 знаков.
Так тебя и просят найти количество этих битов в положении 1, для любого наперед заданного числа.
Меня смущает другое – не сказано какое число, целое или с плавающей точкой. Если для первого случая все просто и понятно, то для второго я пока в раздумьях.
для любого наперед заданного числа
Теперь ясно.
Добавлено: А ещё наверно число задаётся в десятичной системе, о чём явно не указано.
Меня смущает другое – не сказано какое число, целое или с плавающей точкой.
На всякий случай уточняю - 32-битное знаковое целое число. Когда писал, предполагал, что если речь идет о битах, то априори подразумеваются целые числа.
..А ведь есть и отрицательные и даже дробные числа при записи в 2х СС.
..А ведь есть и отрицательные и даже дробные числа при записи в 2х СС.
Коллега, я уже уточнил
32-битное знаковое целое число
То есть целое - не дробное. Знаковое - число со знаком, то есть и положительные, и отрицательные.
Надо посчитать количество битов (1).
#!/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 пишет:Когда писал, предполагал, что если речь идет о битах, то априори подразумеваются целые числа
Я не совсем понял этот момент. По твоему нецелые числа состоят не из битов?
Говоря о комплексе действительных чисел не подразумевают биты, кроме способа хранения самих чисел в памяти. Тем более не все языки позволяют получить битовое представление любого числа с точностью до бита. Говоря о целых числах можно говорить о точном количестве битов, однозначно характеризующих заданное число.
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 битах тоже, может быть не стоило бы зацикливаться, а сказать, что длина машинного слова фиксирована и известна. Хотя для некоторых решений это существенно, но, возможно, и их можно было бы обобщить на произвольную длину, хотя я этого сделать не берусь, т.к. сам их плохо (совсем не) понимаю и сомневаюсь, что участники этого форума найдут их самостоятельно.
32 бит (битов) - уже давно "стандарт" представления целых чисел для большинства языков программирования. Не все языки понимают числа выше чем 2^32 как целое. Например, JavaScript.
Знаковое - тоже укладывается в этот стандарт. Дополнительно, снимается вопрос об отрицательных числах. Предполагаю, что для отрицательных чисел требуются некоторые преобразования. Но не факт.
Да, я намудрил с отрицательными числами. Это неправильно, что числа разного знака но одного модуля имеют практически одинаковое бинарное представлением, за исключением самого левого бита. И да, для предотвращения двоякости в представлении нуля, надо действительно использовать Two's complement а не Ones' complement. Пределы я тоже использовал от Two's complement. Код подправлю чуть позже.
По рабоче-крестьянски:
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
Ну, вот решение (на авторство не претендую), не зависящее от длины машинного слова и (без)знаковости аргумента (если используется дополнительный код):
function OnesCount(n) {
var s = 0;
while (n != 0) {
n = n & (n - 1);
s++;
}
return s;
}
(Хотя, конечно, ответ для каждого отрицательного числа, в отличии от положительных, зависит от количества выделяемых под запоминание числа разрядов, например, для -1 ответ как раз будет равен разрядности.)
#!/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)
Заметил, что вопрос появился почти одновременно с этой темой.
Я в школе считал вот так
И лучше выдумать не мог. (c)
Заметил, что вопрос появился почти одновременно с этой темой.
Я точно не автор той темы . Просто совпадение.
Я в школе считал вот так
Это перевод в двоичную систему. Или обобщая - в любую другую позиционную систему счисления. Алгоритм един.
n = n & (n - 1);
Забавный код. Я пока не уловил его сути. Пока только понял, что он существенно быстрее чем поразрядный сдвиг и суммирование битов.
Это перевод в двоичную систему.
Я в школе считал вот так
Память имеет свойство искажаться...
На самом деле я считал вот так:
Для данной задачи алгоритм заключается в том, чтобы при получении каждого следующего знака накручивать счётчик, если это 1.
wisgest пишет:n = n & (n - 1);
Забавный код. Я пока не уловил его сути. Пока только понял, что он существенно быстрее чем поразрядный сдвиг и суммирование битов.
— убирается последний 1:
X…Z10…0 - 1 == X…Z01…1
X…Z10…0 & X…Z01…1 == X…Z00…0
Насчёт «существенно быстрее» на самом деле не уверен: если 1 мало, то да, а если много — нет, а в среднем, может быть раза в два.
Уточню. Существенно быстрее для неотрицательных чисел. Цикл выполняется ровно M раз, где M - количество взведенных битов (1). В худшем случае (для N = -1) будет выполнено 32 итерации. Видимо можно улучшить этот алгоритм, например, взятием дополнения числа ~N, подсчетом его битов в M, а потом для отрицательных чисел вернуть 32 - M.
Дополнение. Улучшить можно лишь так, чтобы худший результат не превышал 16 итераций.
Почему 16, а не 31? На самом деле отрицательные числа не намного хуже (и о том, является число с 1 в старшем разряде знаковым отрицательным или беззнаковым положительным, можно особо не задумываться, по крайней мнре если использовать сдвиг, а не деление) , например -2147483648 требует лишь одной итерации.
Я сейчас говорю не о целесообразности такой оптимизации. Это просто академический интерес. Трата времени в свое удовольствие (=
wisgest
Самое большое 32-битное положительное число - 0x7FFFFFFF (31 бит)
Самое большое 32-битное отрицательное число - 0xFFFFFFFF (или -1, 32 бита)
В обоих случаях быстрее и проще посчитать количество битов инвертировал каждый бит:
~0x7FFFFFFF = 0x80000000 (M = 1 бит)
~0xFFFFFFFF = 0x00000000 (M = 0 бит)
затем 32 - M - реальное число бит в исходном числе.
Для чисел вида 0xFFFF0000 и 0x0000FFFF решением является результат 16. Это максимальное количество итераций если попытаться оптимизировать вычисления в цикле. Однако мои оценки для JScript практически не дают существенного выигрыша. Для других языков не проверял.
Идея, основанная на серии последовательных сдвигов и суммировании соседних битов, не требует циклов. Алгоритм прост и его легко адаптировать на любом другом языке программирования.
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;
};
Подсчитать количество битов (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):
Второе слагаемое получается точно так же, только сначала число сдвигается на 1 разряд вправо ((a >> 1) & 0x55555555):
Само сложение:
Далее(вторая строка) таким же образом находим сумму в каждой тетраде(a & 0x33333333):
((a >> 2) & 0x33333333):
и их сумма(в нижней строке перевод каждой тетрады в десятичное число):
Дальше тетрады объединяются в байты, затем байты в слова и слова в двойное слово. Я думаю расписывать это нет смысла.
Можно так же предложить вариации с другим способом разделения битов. Самым быстрым мне видится вариант с использованием 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'а зависит от количества единичных битов - чем их меньше, тем быстрее код отработает. Так что если известно, что во входном значении почти нет единичных битов или наоборот почти нет нулевых битов, то лучше использовать именно тот алгоритм.
сумма битов в слове равна сумме битов в его байтах, сумма битов в байте равна сумме битов в его тетрадах, а сумма битов в тетраде равна сумме битов в парах и, наконец, сумма битов в паре равна сумме одиночных битов
Тоже, для разнообразия, приведу
А теперь рассмотрим пары бит (двухбитовое число, двоичное представление):
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
Красиво.
А магические числа это:
const_01 = (-1)/3
const_0011 = (-1)/5
const_00001111 = (-1)/17
деление беззнаковое.
ещё задачки есть или продолжим эту раскрывать?
деление беззнаковое.
И, на всякий случай упомяну, целочисленное.
ещё задачки есть
Вот задачка из "Жемчужин программирования" Бентли. Предлагаю решить самостоятельно прежде чем искать ответ в источнике.
Есть словарь - простой текстовый файл, где каждая строка файла содержит ровно одно слово (в оригинале английские слова; например, /usr/share/dict/linux.words). Найти все анаграммы - слова, состоящие из одинаковых букв (пример: равновесие - своенравие)
Есть словарь - простой текстовый файл, где каждая строка файла содержит ровно одно слово (в оригинале английские слова; например, /usr/share/dict/linux.words). Найти все анаграммы - слова, состоящие из одинаковых букв (пример: равновесие - своенравие)
Придумываем быструю функцию, которая считает хеш слова, причём этот хеш не должен зависеть от порядка букв. В простейшем случае это просто сортировка букв этого слова в алфавитном порядке.
Для каждого слова считаем этот хеш и добавляем в упорядоченный список(при условии, что его там ещё нет). Кроме хеша сохраняем в списке ещё и индекс слова(номер байта в файле, с которого оно начинается).
Теперь остаётся только удалить из списка хеши, которым соответствует только одна запись.
Требуется только один проход по файлу, довольно много памяти(в худшем случае, при отсутствии акронимов это размер словаря+24 байта на слово).
Александр_
Частично Вы правы:
1. это должна быть простейшая хэш-функция. Все анаграммы имеют общее свойство - одинаковое количество букв. Отсортированный в алфавитном порядке буквы слов позволяют однозначно идентифицировать анаграммы (палиндромы, кстати тоже).
2. Что Вам даст индекс слова в процессе нахождения анаграмм? Это избыточная информация.
3. Согласен. Собрать все слова, имеющие одинаковый хэш. Но мне не понятно какие оценки дают такое число "24 байта на слово".
Все гораздо проще:
1. для каждого слова создать хэш (сортировка всех букв в слове) и вывести пару значений: "хеш слово"
2. отсортировать результат из п.1 (так как в начале строк стоят хэши, то сортировка приведет к группировке анаграмм по хэшам)
3. вывести все анаграммы, группируя из построчно.
1. это должна быть простейшая хэш-функция. Все анаграммы имеют общее свойство - одинаковое количество букв. Отсортированный в алфавитном порядке буквы слов позволяют однозначно идентифицировать анаграммы
Ну количества букв явно не достаточно, коллизий будет больше чем совпадений. Тут несколько вариантов и они зависят от размера хеша. Можно поставить каждой букве в соответствие биты в хеше, т.е. чтобы каждая буква влияла только на свои биты, своеобразный аналог сжатия с потерями. На вскидку, при таком подходе размер хеша должен быть раза в два больше алфавита(т.е. в среднем на одну букву должно приходится 2 бита). Можно сделать по аналогии с криптографическими хешами, это универсальный вариант и вероятность коллизии и размер хеша не будут особо зависеть от алфавита.
(палиндромы, кстати тоже).
???
2. Что Вам даст индекс слова в процессе нахождения анаграмм? Это избыточная информация.
Ничего. Нет. Мы же не подсчитываем анаграммы, а находим. Если не сохранить позицию, то при выдаче результата придётся искать слова по их хешу. Это довольно накладно, лучше потратить на это немного памяти.
3. Согласен. Собрать все слова, имеющие одинаковый хэш. Но мне не понятно какие оценки дают такое число "24 байта на слово".
Больше всего памяти потребуется, если в словаре нет анаграмм:
память на хеши - в простейшем случае, если за хеш принят упорядоченный набор букв, составляющих слово, она равна размеру словаря. Иначе размер_хеша*количество_слов.
память на слова, соответствующие хешам, сами слова хранить очень накладно, поэтому хранят смещения в файле. В простейшем случае используется список - 8 байт на само смещение, ещё 8 на указатель к следующему элементу и 8 на указатель на первый(он же единственный) элемент. Предполагается, что система 64-битная.
Все гораздо проще:
1. для каждого слова создать хэш (сортировка всех букв в слове) и вывести пару значений: "хеш слово"
2. отсортировать результат из п.1 (так как в начале строк стоят хэши, то сортировка приведет к группировке анаграмм по хэшам)
3. вывести все анаграммы, группируя из построчно.
Проще, но хуже.
Предполагается, что система 64-битная.
У меян 32 бита. Оффтопом. И на ней я пытался виртуализировать 64-битную ОС. Сам не смог - помогли товарищи. Но на эту тему я дискутировать не собираюсь. Так, к слову пришлось.
Ну количества букв явно не достаточно, коллизий будет больше чем совпадений.
KISS, коллега! Какие коллизии? street, tester. хэш - eerstt. Все! Дальше группируем строки с одинаковым хэшем. Те группы, в которых количество элементов больше одного - анаграммы. Их выводим, остальные отбрасываем. Вам решение на Perl показать? Или Вам JScript ближе? Просто другие выделяются в две большие группы - которые не помню, и которые не знаю.
KISS, коллега! Какие коллизии? street, tester. хэш - eerstt. Все!
Об этом я в первом ответе написал, а вы ответили:
Все анаграммы имеют общее свойство - одинаковое количество букв.
Тут количество букв не используется, используются сами буквы.
Вам решение на Perl показать? Или Вам JScript ближе?
Оба знакомы и оба далеки, Perl чуть дальше . Может си? И прилагается ли словарь для тестирования? .
Просто другие выделяются в две большие группы - которые не помню, и которые не знаю.
О чём тут речь?
И возвращаясь к предыдущей задачке - тыц. 9-битный вариант можно преобразовать в 8-битный для 32-битного регистра. Есть аналогичный код для 15-ти бит и 64-битного регистра. Правда оригинальную задачу они не особо хорошо решают .
Все анаграммы имеют общее свойство - одинаковое количество букв.
Тут количество букв не используется, используются сами буквы.
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.
====
Правда оригинальную задачу они не особо хорошо решают
Либо решает, либо не решает.
О ЯП. К сожалению ни на одном из серии 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.
Спасибо, нашёл на виртуалке . Только там какие-то левые слова находятся, например "?ngstr?m" в файле "british-english" O_o. Движок форума даже буквы такие отказывается показывать .
Либо решает, либо не решает.
Отлично решает упрощённую задачу, но это не получается использовать для более выгодного решения основной задачи.
Сишный компилятор сгенерирует очень быстрый код в сравнении со скриптом.
Боюсь огорчить, но это не тот вариант, когда требуется оптимизация по времени - фактически это одноразовая задача. Конечно, надо всегда предполагать, что задача может повторится, но если словарь неизменен, или изменяется очень редко, то результат можно кешировать.
левые слова находятся, например "?ngstr?m" в файле "british-english"
Полагаю, что заглавная А с кружочком; между r и m буква о с двумя точками как в ё. Очень похоже на то, что кодировка файла - utf-X (уж не помню, которая из них), а в консоли используется что-то отличное от Юникода.
Движок форума даже буквы такие отказывается показывать
В предпросмотре показывает, а при отправке отказывается. Определенно, кривой движок.
Боюсь огорчить, но это не тот вариант, когда требуется оптимизация по времени - фактически это одноразовая задача. Конечно, надо всегда предполагать, что задача может повторится, но если словарь неизменен, или изменяется очень редко, то результат можно кешировать.
И чем тогда интересна эта задача? Простое решение любой школьник найдёт.
Возможно ?ngstr?m. Очень похоже на то, что кодировка файла - utf-X (уж не помню, которая из них), а в консоли используется что-то отличное от Юникода.
Не думаю, вся латиница там верно показана, буква определённо из другого алфавита. Похоже это слово "angstrom" по-шведски написано.
Все верно, это длинная А в шведском, финском, датском и возможно в других. Имеет коды в системах
ISO 8859/Unicode - 197/229 (C5, E5)
UTF8 - C385, C3E5
HTML - Å, å (Å, å)
Unicode совпадает с обычной латиницей в ANSI для кодов 0-127.
PS: Очень странно, Unicode символы нормально отображаются в предпросмотре, но при непосредственной отправке заменяются на placeholder `?' для неюникодных символов.
kaster, так отчасти было и на старой версии движка. Даже приходилось паковать код и выкладывать на стороннем ресурсе.
И чем тогда интересна эта задача?
Поиском простых решений.
Простое решение любой школьник найдёт.
Не всегда.
добавление сигнатур | сортировка | объединение слов с одинаковой сигнатурой | вывод слов-анаграмм
Поиском простых решений.
Рекомендую ЕГЭ по математике, там кроме простых решений ничего не требуется. Под интересными задачами я понимаю задачи, как минимум требующие неочевидных решений.
Не всегда.
добавление сигнатур | сортировка | объединение слов с одинаковой сигнатурой | вывод слов-анаграмм
Ну да, если это школа для детей с ЗПР, то у них с этим будут проблемы .
Покажите Ваше, посмеемся вместе.
Покажите Ваше, посмеемся вместе.
Показать моё что? Если решение этой задачи, то теперь не вижу смысла - тебя оно не интересует, а больше в обсуждении никто не участвует.
P.S. предлагаю общаться на "ты", а то как-то странно получается .
предлагаю общаться на "ты", а то как-то странно получается
Можно. но если перейду на "вы", то это по привычке. Мне было интересно увидеть другое решение, но разговор получился странный. Хотелось бы вернуться к начальному состоянию беседы .
Я вижу два варианта решения задачи - 1) только средствами определенного языка, либо 2) смешанное решение с привлечением ресурсов операционной системы.
Я вижу два варианта решения задачи - 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% быстрее. На больших выборках не проверял, поскольку этот хеш не годится.
Александр_, уже мелькал в нашем обсуждении алгоритм получения хеша - сортировка символов в слове. Не наю как это работает в случае C/C++, в Perl же это коротко и красиво )))
Слово переводим в верхний регистр (uc), разбиваем посимвольно (split ""), сортируем (sort) и снова объединяем в одну строку (join "").
# Perl implementation
$signature = join "", sort(split "", uc $word);
При равенстве этих сигнатур мы имеем слова, являющиеся анаграммами. Объединяя слова под одной сигнатурой, мы получаем список анаграмм.
Не наю как это работает в случае C/C++, в Perl же это коротко и красиво )))
//hash - строка, hash.begin() - итератор на начало строки, hash.end() - итератор на конец строки
std::sort(hash.begin(), hash.end());
Но как я уже сказал - это не "коротко и красиво", а "медленно и банально". И строго говоря это не хеш, у хеша фиксированная длина.
Задача с dirty.
Виини–Пух и Пятачок ели торт. За сколько времени они вдвоем смогли это сделать?
Интересно, что:
если бы ели тот же торт два Винни–Пуха, то у них торт был бы съеден на 1 минуту раньше, чем это удалось Винни и Пятачку вместе;
а если бы если тот же самый торт два Пятачка, то на 4 минуты больше бы времени затратили, чем Винни и Пятачок вместе.
Так за сколько же времени съели торт друзья?
Насколько я понял, там они её пока не решили, или решения были неверными. Во всяком случае, у меня другое.
за сколько же времени съели торт друзья?
2+2/3 мин, хотя сомневаюсь, однако.
Неплохо бы решение представить
Неплохо бы решение представить
Давайте посмотрим, может есть другие варианты.
ха-хах . Хорошая задача, поскольку интуитивное решение оказывается неверным. Жаль только что оно вообще решения не даёт, если бы ещё неправильный ответ получался, то вообще здорово было бы. Решение:
задача на скорость/время/расстояние(3 класс(sic!)), только время в минутах, а расстояние в пирогах:
Решение:
Если быть точным, t найдено верно, а вот скорости не определены.
Если быть точным, t найдено верно, а вот скорости не определены.
???
Они могут быть любыми
Они могут быть любыми
Я в замешательстве. Подставил 1 и 1 - не подошло.
Ну вот ты приравниваешь все уравнения к одному. С таким же успехом можно приравнять к 10, время останется тем же, скорости изменятся.
Ну вот ты приравниваешь все уравнения к одному. С таким же успехом можно приравнять к 10, время останется тем же, скорости изменятся.
нет, у меня невырожденная система из трёх уравнений с тремя неизвестными.
А 1 — это чего один?
А 1 — это чего один?
это же расстояние. Скорость V, умножаем на время t и получаем расстояние S. Можно переформулировать задачу так:
Винии и Пятак находятся в 1км друг от друга и равномерно движутся на встречу друг другу. Через какое время они встретятся, при условии что: (ну и т.д. по условию).
Так расстояние (объём или масса торта) может быть любым
время останется тем же, скорости изменятся.
Определены относительные скорости. Для решения задачи, т.е определения времени поедания пирога, абсолютная скорость кг/сек значения не имеет и, похоже, не определяется, т.к по идее, вместо единиц в уравнении _Александра, должна быть масса пирога, которая исключается из системы после манипуляций над ней.
Так расстояние (объём или масса торта) может быть любым
Причём тут масса? Расстояние - это количество пирогов(или тортов, забыл уже).
Определены относительные скорости. Для решения задачи, т.е определения времени поедания пирога абсолютная скорость кг/сек значения не имеет и, похоже, не определяется, т.к по идее вместо единиц в уравнении _Александра, должна быть масса пирога, которая исключается из системы после манипуляций над ней.
всё там правильно, откуда вы вообще килограммы взяли?
Да, если скорость в тортах, тогда верно. Тем не менее, можно мерить и в килограммах, и приравнивать к переменной, которая потом сократится.
Да, если скорость в тортах, тогда верно.
нет, скорость в "тортах в минуту" . Я это в решении написал, только про пироги.
З.Ы. Теперь я хочу пирог... Ушёл в магазин полвторого ночи...
upd:
Тем не менее, можно мерить и в килограммах, и приравнивать к переменной, которая потом сократится.
можно, тогда будет 4 переменных на три уравнения, но три интересующие нас переменные всё равно будут определены.
всё там правильно, откуда вы вообще килограммы взяли?
Еще раз:
абсолютная скорость кг/сек значения не имеет
Поэтому килограммы, в данном случае, также не имеют значения, взяты просто для наглядности.
З.Ы. Теперь я хочу пирог...
Ну, пирог ты сам придумал
Ну, пирог ты сам придумал
Это ты так говоришь, а 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.
У меня такой алгоритм получился:
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
}
Наверное, как-то проще можно
Реализовывать алгоритм не стал. После нескольких ручных тестов получил следующую зависимость:
(первый столбец - количество игроков, второй - номер победителя)
2 - 1
3 - 3
4 - 1
5 - 3
6 - 5
7 - 7
8 - 1
...
13 - 11
14 - 13
15 - 15
16 - 1
Можно вывести формулу, однозначно описывающую эту зависимость.