Сокращение фракций в неправильном направлении
В этом соревновании по коду для игры в гольф вы должны найти дроби, которые можно уменьшить неправильным образом, но при этом получить одинаковое число.
Примечание: неправильное дробление дроби здесь имеет точное определение, см. Подробности.
Пример:
64/16 = 6 4/1 6 = 4/1 = 4
Конечно, вы не можете просто ударить обе шестерки, но здесь вы все равно получите правильное значение. В этом испытании вы должны найти примеры, подобные этому.
Детали
Вы должны написать функцию / программу, которая принимает одно положительное целое число в n
качестве входных данных и выводит / возвращает список / массив фракций в формате
numerator1,denominator1,numerator2,denominator2,...
Программа должна выяснить для каждой фракции a/b
с a+b=n
и a,b>0
может ли он быть уменьшен неправильным путем . (Неважно, может ли оно быть уменьшено обычным способом или существует много возможностей сокращения, просто должна быть возможность уменьшить его неправильным способом хотя бы одним способом.)
Определение неправильного пути: дробь может быть сокращена неверно, если и только если одинаковая последовательность последовательных цифр появляется в a и b и если значение дроби остается неизменным, если вы удалите подстроку.
Пример: 1536/353 можно «уменьшить» до 16/3, но эти два значения не равны, поэтому вы не можете уменьшить эту долю неправильно .
Обратите внимание, что это определение сокращения неправильного пути может также включать дроби, которые сокращаются правильным образом: 110/10 = 11/1
оно входит в определение сокращения неправильного пути, даже если это допустимый шаг.
счет
Наименьшее количество байтов выигрывает. Вы можете написать функцию или программу, которая принимает целое число и возвращает массив или программу, которая использует stdin / stdout, или вы можете считать n сохраненным в переменной, а в конце программы список должен быть сохранен в другой переменной.
Контрольные примеры
Пожалуйста, включите следующие тестовые примеры (Скажите, какие из них мне следует добавить, я не знаю, сколько из этих фракций существует / сколько примеров ожидать)
n=80 (64/16 should be in this list)
n=147 (98/49 should be in this list)
n=500 (294/196 should be in this list) WRONG since 294+196 != 500 Thanks Falko
1010/10 = 101/1 && 1010/10 /= 110/1
n=147
) неверно:49/89 != 4/8
.Ответы:
Питон 2 -
183180вход должен быть сохранен в
n
, выход будет сохранен вl
.Тестовые случаи:
n = 80:
n = 147:
n = 490:
Если дубликаты в выводе запрещены, они получаются на 10 символов длиннее:
источник
Haskell,
207206 (209?) СимволовЕсли недопустимо возвращать одно и то же соотношение более одного раза (400/400 = 40/40 = 4/4), используйте
f n=nub[...
для их фильтрации.Возвращает список пар. Список двухэлементных пар стоит одинаково. Список фактических дробей потребует импорта
Data.Ratio
или полной квалификацииData.Ratio.%
(что также противоречит%
определенной здесь функции)контрольные примеры (с
nub
):Разгорел и прокомментировал :
источник
Python 2 - 236
источник
Питон 3 - 302
Примечание. Из-за трудностей с синтаксическим анализом дроби с числом 0 отсутствуют (поэтому дроби не вычисляются с использованием правильного метода).
С n = 80:
С n = 147
С n = 500
источник
n=80
этого печатает[[64, 16], [65, 26]]
, но очевидно65 + 26 = 91 > 80
.if
s в один большойif
сand
s, соединяющий все условия? Я думаю, что экономит немало символов.10/70
,20/60
и30/50
?