vak: (Default)
[personal profile] vak
Дана строка:
123456789
Вставить кое-где между цифрами знаки + или *, чтобы при вычислении формулы получилось ровно 100.

Date: 2021-09-27 21:43 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Это программировать надо, или в голове решить?

Date: 2021-09-27 21:47 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Я ленив, я запрограммировал (см. ниже).

Date: 2021-09-27 21:46 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Что, простите?
sh-4.2$ for i in 1{,\+,\*}2{,\+,\*}3{,\+,\*}4{,\+,\*}5{,\+,\*}6{,\+,\*}7{,\+,\*}8{,\+,\*}9 ; do j=$(($i)); if [ $j = 100 ] ; then echo $i; fi; done
12+34+5*6+7+8+9
12+3*4+5+6+7*8+9
1+2+3+4+5+6+7+8*9
1+2*3+4+5+67+8+9
1*2+34+5+6*7+8+9
1*2*3+4+5+6+7+8*9
1*2*3*4+5+6+7*8+9


Date: 2021-09-27 23:12 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
И я ещё переборщил, плюсы от страха заэкранировал, хотя не надо было.

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

Date: 2021-09-28 00:49 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Думал, на скале примерно столько же. Ан нет. Не меньше четырех (неинтересно, в результате).

Date: 2021-09-28 01:25 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
(($i == 100))

Я не знал, что так можно.

Date: 2021-09-28 06:46 (UTC)
henry_flower: A melancholy wolf (Default)
From: [personal profile] henry_flower
1-liner на рубі:

$ ruby -v
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux]

$ ruby -e 'pp ["","+","*"].repeated_permutation(8).map{|v| (1..9).zip(v).join }.filter {|v| eval(v) == 100}'
["12+34+5*6+7+8+9",
 "12+3*4+5+6+7*8+9",
 "1+2+3+4+5+6+7+8*9",
 "1+2*3+4+5+67+8+9",
 "1*2+34+5+6*7+8+9",
 "1*2*3+4+5+6+7+8*9",
 "1*2*3*4+5+6+7*8+9"]

Date: 2021-09-28 00:46 (UTC)
euthanasepam: Ла-ла-ла-ла! Ла-ла-ла-ла! (Default)
From: [personal profile] euthanasepam
(Записал в блокнотЪ.)

Date: 2021-09-28 02:41 (UTC)
henry_flower: A melancholy wolf (Default)
From: [personal profile] henry_flower
те саме, але без циклів, ггг:

eval echo $(seq -f '%.f{,+,*}' -s '' 1 8)9 | sed -E 's/\S+/if (& == 100) print "&\\n"\n/g' | bc

Date: 2021-09-28 05:13 (UTC)
euthanasepam: Ла-ла-ла-ла! Ла-ла-ла-ла! (Default)
From: [personal profile] euthanasepam
Cygwin, bash:

$ time eval echo $(seq -f '%.f{,+,*}' -s '' 1 8)9 | sed -E 's/\S+/if (& == 100) print "&\\n"\n/g' | bc

12+34+5*6+7+8+9
12+3*4+5+6+7*8+9
1+2+3+4+5+6+7+8*9
1+2*3+4+5+67+8+9
1*2+34+5+6*7+8+9
1*2*3+4+5+6+7+8*9
1*2*3*4+5+6+7*8+9

real    0m4,019s
user    0m0,592s
sys     0m2,759s


$ time for i in 1{,\+,\*}2{,\+,\*}3{,\+,\*}4{,\+,\*}5{,\+,\*}6{,\+,\*}7{,\+,\*}8{,\+,\*}9 ; do j=$(($i)); if [ $j = 100 ] ; then echo $i; fi; done

12+34+5*6+7+8+9
12+3*4+5+6+7*8+9
1+2+3+4+5+6+7+8*9
1+2*3+4+5+67+8+9
1*2+34+5+6*7+8+9
1*2*3+4+5+6+7+8*9
1*2*3*4+5+6+7*8+9

real    0m0,222s
user    0m0,203s
sys     0m0,000s


Date: 2021-09-28 05:10 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Много ли корысти в отсутствии циклов, если приходится аж три внешних процесса вызывать? И гораздо медленнее получается.

Date: 2021-09-28 05:14 (UTC)
euthanasepam: Ла-ла-ла-ла! Ла-ла-ла-ла! (Default)
From: [personal profile] euthanasepam
Да, очень медленнее. Я как раз только что запостил, вашего коммента ещё не было.

Date: 2021-09-28 05:16 (UTC)
henry_flower: A melancholy wolf (Default)
From: [personal profile] henry_flower

то була пародія на code golf з metaprogramming

Date: 2021-09-28 13:54 (UTC)
sun_jr: (Arghhh!)
From: [personal profile] sun_jr
Ничоси!!!

На Прологе

Date: 2021-09-29 04:59 (UTC)
From: [personal profile] yury_yuschenko
/* На Прологе решение тоже почти в одну строку. Три очень простых: подготовительных, а остальное можно в одной строке записать.
Лично мне больше всего по душе прозрачность и читабельность решения на Прологе, чем другими средствами.
Уж очень люблю Пролог.*/

/* Определяем трехэлементную множество: */
d ( "+").
d ( «*»).
d ( "").
/* остальное можно записать в одной строке */

s (S): - d (X1), d (X2), d (X3), d (X4), d (X5), d (X6), d (X7), d (X8), / * эта строка : строим восьмую декартову степень 3-х элементной множества: количество элементов: 3 ^ 8 = 6561 * /

/* Заполнения между 9 цифрами всеми возможными вариантами */
/* Формируем строку для пользователя: конкатенация кортежей с элементами кортежей декартова произведения: */

/* Конкатенацию "1 ++ X1 ++ 2 ++ X2 ++ 3 ++ X3 ++ 4 ++ X4 ++ 5 ++ X5 ++ 6 ++ X6 ++ 7 ++ X7 ++ 8 *" необходимо записать длинным текстом, но при решении с использованием списков и рекурсии получится лаконично и без привязки к длине входной строки цифр */
concat (1, X1, S01), concat (S01, 2, S02),
concat (S02, X2, S03), concat (S03, 3, S04),
concat (S04, X3, S05), concat (S05, 4, S06),
concat (S06, X4, S07), concat (S07, 5, S08),
concat (S08, X5, S09), concat (S09, 6, S10),
concat (S10, X6, S11), concat (S11, 7, S12),
concat (S12, X7, S13), concat (S13, 8, S14),
concat (S14, X8, S15), concat (S15, 9, S).

/* Строку для пользователя преобразуем в терм (формулу). Подсчет с фильтрацией. Печать. (вынесено в отдельную строку для простоты восприятия */
ss (X): - s (A), term_string (Q, A), X is Q, print (Q).

Это всё. Далее запрос и его результат:

? - ss (100).

1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 * 9
1true
1 + 2 * 3 + 4 + 5 + 67 + 8 + 9
2true
1 * 2 + 34 + 5 + 6 * 7 + 8 + 9
3true
1 * 2 * 3 + 4 + 5 + 6 + 7 + 8 * 9
4true
1 * 2 * 3 * 4 + 5 + 6 + 7 * 8 + 9
5true
12 + 3 * 4 + 5 + 6 + 7 * 8 + 9
6true
12 + 34 + 5 * 6 + 7 + 8 + 9
7true
Edited Date: 2021-09-29 05:01 (UTC)

В онлайне, например:

Date: 2021-09-29 06:21 (UTC)
From: [personal profile] yury_yuschenko
https://swish.swi-prolog.org/
Это в SWI-Prolog, который поддерживает стандарт.
В GNU Prolog 1.5.0 и SWI-Prolog 8.2.4 не должно давать ошибки.
При копировании и вставке кода были вставлены в недопустимых местах пробелы и заменены кавычки на неправильные.
Этот код проверен в он-лайн интерпретаторе SWI:

/* На Прологе решение тоже почти в одну строку. Три очень простых: подготовительных, а остальное можно в одной строке записать.
Лично мне больше всего по душе прозрачность и читабельность решения на Прологе, чем другими средствами.
Уж очень люблю Пролог.*/

/* Определяем трехэлементную множество: */
d("+").
d("*").
d("").
/* остальное можно записать в одной строке */

s(S) :- d(X1), d(X2), d(X3), d(X4), d(X5), d(X6), d(X7), d(X8), /* эта строка: строим восьмую декартову степень 3-х элементной множества: количество элементов: 3 ^ 8 = 6561 */

/* Заполнения между 9 цифрами всеми возможными вариантами */
/* Формируем строку для пользователя: конкатенация кортежей с элементами кортежей декартова произведения: */

/* Конкатенацию "1 ++ X1 ++ 2 ++ X2 ++ 3 ++ X3 ++ 4 ++ X4 ++ 5 ++ X5 ++ 6 ++ X6 ++ 7 ++ X7 ++ 8 *" необходимо записать длинным текстом, но при решении с использованием списков и рекурсии получится лаконично и без привязки к длине входной строки цифр */
concat(1, X1, S01), concat(S01, 2, S02),
concat(S02, X2, S03), concat(S03, 3, S04),
concat(S04, X3, S05), concat(S05, 4, S06),
concat(S06, X4, S07), concat(S07, 5, S08),
concat(S08, X5, S09), concat(S09, 6, S10),
concat(S10, X6, S11), concat(S11, 7, S12),
concat(S12, X7, S13), concat(S13, 8, S14),
concat(S14, X8, S15), concat(S15, 9, S).

/* Строку для пользователя преобразуем в терм (формулу). Подсчет с фильтрацией. Печать. (вынесено в отдельную строку для простоты восприятия */
ss(X) :- s(A), term_string(Q, A), X is Q, print(Q).

Только одна строка?

Date: 2021-09-29 06:53 (UTC)
From: [personal profile] yury_yuschenko
Пробуй:
1. Всё перед строкой удалить (могли "вкрасться" нежелательные символы до этой строки).
2. Оставить только эту строку. Запрос: ?- d(X).

Имею единое предположение: перед строкой нечто есть, что интерпретатор воспринимает в качестве синтаксической лексемы, что приводит к обнаружению ошибки в последующем тексте.

Date: 2021-09-29 08:06 (UTC)
From: [personal profile] yury_yuschenko
Проще не бывает:
man(serg).

Запрос:
?- man(Who).

Неверное понял. Ты из режима блокнота, а программа ещё "пустая" и Пролог не видит "d".

В программу (режим "Program") и всё будет работать (создать Программу).

Date: 2021-09-30 09:45 (UTC)
x86128: (Default)
From: [personal profile] x86128
На Прологе это конечно сильно :)
Какая там глубина рекурсии интересно получилась?

Date: 2021-09-30 02:29 (UTC)
From: [personal profile] xexe

Ванілла жабоскрипт:

// Permutations as radix 3 numbers
Array.from({ length: parseInt('22222222', 3) }, (_, i) => i.toString(3).replaceAll(/[0-2]/g, m => [' ','+','*'][m]).padStart(8, ' '))
// Zip
.map(p => Array.from(p).reduce((exp, o, i) => `${exp}${o === ' ' ? '' : o}${i+2}`, '1'))
// Eval and filter
.map(e => [e, eval(e)]).filter(([_, r]) => r === 100).map(p => p[0])
Edited Date: 2021-09-30 02:30 (UTC)

Date: 2023-10-02 01:09 (UTC)
From: [personal profile] abalaeff
Я в детстве такую задачку решал для каждого автобусного билета 🙂 Получить 100 и 101. Знаки – все 4 действия арифметики, плюс скобки.
Edited Date: 2023-10-02 01:10 (UTC)