@trickster2019

Как решить задачку «ЛИРИК = 0,5*ФИЗИКА» на ЯП?

Добрый день, задали сделать задачку/ребус "ЛИРИК = 0,5*ФИЗИКА", и я вообще не понимаю как её сделать, посмотрел решения ребуса в принципе, и везде значения 87375 и 174750 берутся из неоткуда, а когда просишь объяснить откуда они взялись, тебе говорят "ну мы просто их из головы взяли", но менто нужно их получить осмысленно.
На данном этаме я сделал только переменные и написал условие к циклу, но как написать алгоритм который сможет подобрать правильные цифры к буквам я не понимаю.
fun main() {
    var L:String="0"
    var I:String="0"
    var R:String="0"
    var K:String="0"
    var F:String="0"
    var Z:String="0"
    var A:String="0"
    
    var LIRIK=L+I+R+I+K
    var FIZIKA=F+I+Z+I+K+A
    
    while(LIRIK.toInt()==((FIZIKA.toInt())*0.5).toInt()){
        
    }
}
  • Вопрос задан
  • 180 просмотров
Решения вопроса 2
mayton2019
@mayton2019
Bigdata Engineer
Таких задач было много в журналах Наука и жизнь. И кажется в книжках Мартина Гарднера.
Типа ТУЗИК + ТУЗИК = КАРТУЗ. И нужно угадать какой букве какая десятичная цифра соотвествтует.

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

"ЛИРИК = 0,5*ФИЗИКА"

Можно записать так

ЛИРИК + ЛИРИК = ФИЗИКА

Тогда мы знаем что буква "К" в этой системе счисления будучи умноженной на 2 дает "A" по модулю этой системы.
Потом И встречается дважды. Но но дает разные величины по модулю. Видимо для одной сработал перенос
из предыдущего разряда.

Вот из таких рассуждений мы строим дерево решений. Элегантно (но медленно) такие задачи решались
кажется на Prolog (из книжки Ивана Братко но я не уверен). Да и вообще Пролог не нагляден с точки
зрения императивного программирования. Тоесть он что-то под капотом делает но как и насколько
оптимально - непонятно.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Самое простое - в лоб
exit:
for (let l = 1; l < 10; l += 1) {
  for (let f = 1; f < 10; f += 1) {
    if (f === l) {
      continue;
    }
    for (let i = 0; i < 10; i += 1) {
      if (i === l || i === f) {
        continue;
      }
      for (let r = 0; r < 10; r += 1) {
        if (r === l || r === f || r === i) {
          continue;
        }
        for (let k = 0; k < 10; k += 1) {
          if (k === l || k === f || k === i || k === r) {
            continue;
          }
          for (let z = 0; z < 10; z += 1) {
            if (z === l || z === f || z === i || z === r || z === k) {
              continue;
            }
            for (let a = 0; a < 10; a += 2) {
              if (a === l || a === f || a === i || a === r || a === k || a === z) {
                continue;
              }
                const lirik = l * 10000 + i * 1010 + r * 100 + k;
                const fizika = f * 100000 + i * 10100 + z * 1000 + k * 10 + a;
                if (lirik * 2 === fizika) {
                  console.log(`lirik = ${lirik}`);
                  console.log(`fizika = ${fizika}`);
                  break exit;
                }
            }
          }
        }
      }
    }
  }
}
Вариант на JS.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@kalapanga
Ответ написан
Комментировать
LaRN
@LaRN
Senior Developer
На python можно вот так решить.
Находит первое подходящее решение и останавливается.
62125 = 0.5*124250

from itertools import permutations

digit = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
#ЛИРИК
#ФИЗИКА

for L,I,R,K in permutations(digit, 4):
    if L > 0:
        lirik_num  = int(str(L)+str(I)+str(R)+str(I)+str(K))
        fizika_num = 2*lirik_num
        fizika_str = str(fizika_num)
       
        if len(set(fizika_str)) < 5:
            continue
     
        if len(fizika_str) == 5:
            if '0' in fizika_str:
                continue
            else:
                fizika_str = '0'+fizika_str
       
        if len(set([fizika_str[0], fizika_str[2], fizika_str[5]])) != 3:
            continue
          
        if int(fizika_str[1]) != I or int(fizika_str[3]) != I or int(fizika_str[4]) != K:
            continue
      
        print (f'{lirik_num} = 0.5*{fizika_num}')
    
        break
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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