Нарисуйте комбинации, которые составляют до 100

13

У вас есть поле с одной цифрой в каждом углу:

1|2
---
3|4

Если мы соединяем цифры по строкам слева направо, мы получаем 12 и 34. Если мы соединяем цифры по столбцам сверху вниз, мы получаем 13 и 24. Если мы добавим все эти числа, мы получим 12 + 34 + 13 + 24 = 83

Вызов

Напишите программу для печати всех таких полей, где сумма, рассчитанная, как указано выше, равна 100.

Предполагая, что каждый угол содержит однозначное число от 1 до 9, существует 9 комбинаций: 1157, 1247, 1337, 1427, 1517, 2138, 2228, 2318 и 3119. (Обратите внимание, что есть 25 комбинаций, если мы включаем 0, но мы не для этого вызова.)

Обратите внимание, что пример 1234 не работает, так как 12 + 34 + 13 + 24 не равен 100.

вход

Никто

Выход

Ящики для ответов в следующем формате:

A|B
---
C|D

Вывод должен быть распечатан на STDOUT или ближайшую альтернативу.

правила

  • AB + CD + AC + BD = 100
  • Каждый угол будет содержать только положительные целые числа 1-9.
  • 0 исключено.
  • Числа могут быть использованы более одного раза.
  • Вам нужно нарисовать коробки, как указано выше. ( A|B\n---\nC|D\n)
  • Вам необходимо вывести все правильные ответы.
  • Дополнительный трейлинг-перевод строки хорош.
  • , поэтому выигрывает самый короткий код в байтах.
  • Стандартные лазейки и T & C применяются.

Это мое первое представление, поэтому, пожалуйста, дайте мне знать, если мне нужно что-то уточнить.

Денхем Кут
источник
Не могли бы вы показать, что выход должен быть? Кроме того, как насчет конечного символа новой строки?
Spikatrix
Хороший вызов. Я думаю, вам нужно явно указать, какие цифры нужно добавить. Строка «Два соединенных двухзначных числа через ПЛЮС двухзначные числа вниз должны быть равны 100». не достаточно ясно Я понял только на примере 1234. Кроме того, я получаю только 9 таких комбинаций. Можете ли вы назвать 16 комбинаций?
Оптимизатор
1
Я сделал несколько правок для объяснения и форматирования. Если это не соответствует вашему первоначальному замыслу, откатите редактирование.
Алекс А.
1
@DenhamCoote, на самом деле, мое полужесткое решение было довольно интересным, потому что оно только полужесткое. Это было исключением из правила, потому что вопросы, где вопиющее жесткое кодирование является лучшим / наиболее очевидным вариантом, часто не дают интересных ответов (см., Например, недавний вопрос о борромовых кольцах). Спасибо за вопрос.
Уровень Река St
1
Принятие ответа может создать впечатление, что вопрос закончен, поэтому я бы оставил его пока. Если после этого вы получите больше ответов, вы можете изменить согласие, но это означает, что вы должны следить, а у вас может не хватить времени. Конкурсы популярности не нравятся, потому что они часто лениво написаны и слишком широки, часто типа «Делай Х самым сложным способом». Как правило, единственные хорошие вопросы о популярности - это обработка изображений, где человеческая оценка - единственный способ решить, хорош алгоритм или нет. Обработка изображений исключает чистое искусство, которое не по теме.
Уровень Река St

Ответы:

8

Pyth, 42 38 34 байта

V ^ ST4IqC \ ds * VNsM ^, T1 2Xj \ | N3 "
---

Конечный символ новой строки в коде важен. Основная причина моей конкурентоспособности заключается в том, что я использую векторное произведение точек [1, 1, 5, 7]и [20, 11, 11, 2]сравниваю его со 100.

orlp
источник
"|"-> \|, \n-> (буквальный перевод строки) и вам не нужна заключительная цитата.
Деннис
@Dennis Спал>. <
orlp
2
Если вы не возражаете, не могли бы вы добавить объяснение тем (как я), которые не могут расшифровать ваш невероятно короткий ответ?
Denham Coote
6

Руби, 71

Поскольку жесткое кодирование не запрещено (и в любом случае трудно провести черту), вот частичный жестко закодированный ответ.

1.upto(3){|i|1.upto(7-i*2){|j|print i,?|,j,'
---
',8-j-2*i,?|,i+6,'
'}}

объяснение

Формула для решения выглядит следующим образом:

A*20+(B+C)*11+D*2=100

По модульным арифметическим рассуждениям мы видим, что A и D должны различаться на постоянную величину, такую, которая (A*20+D*2)%11является постоянной. На самом деле D = A + 6. В iитерации цикла через три возможных значений А.

Значение B может быть любым от 1 до, 7-i*2и общее количество B и C должно быть 14-A-D. Таким образом мы получаем следующие выражения, которые печатаются. Ruby позволяет буквально переводить строки в строки, заключенные в''

   i     |    j
------------------
8-j-2*i  |   i+6
Уровень реки St
источник
4

Ява, 202 200 198

Пытаюсь впервые: D

РЕДАКТИРОВАТЬ: сохранено 2 байта с немного меньшим вычислением, найденным в другом комментарии.

class C{public static void main(String[]c){for(int i=0;++i<5;)for(int j=0;++j<7;)for(int k=0;++k<10;)for(int l=0;++l<10;)if(20*i+11*(j+k)+2*l==100)System.out.printf("%s|%s%n---%n%s|%s%n",i,j,k,l);}}
Koekje
источник
4

Пакет - 187 байт

Грубая сила.

@!! 2>nul||cmd/q/v/c%0&&exit/b
set y=for /l &set z= in (1,1,9)do 
%y%%%a%z%%y%%%b%z%%y%%%c%z%%y%%%d%z%set/aa=%%a%%b+%%c%%d+%%a%%c+%%b%%d&if !a!==100 echo %%a^|%%b&echo ---&echo %%c^|%%d

Без гольфа это немного менее отвратительно:

@echo off
setLocal enableDelayedExpansion
for /l %%a in (1,1,9) do (
    for /l %%b in (1,1,9) do (
        for /l %%c in (1,1,9) do (
            for /l %%d in (1,1,9) do (
                set/aa=%%a%%b+%%c%%d+%%a%%c+%%b%%d
                if !a!==100 (
                    echo %%a^|%%b
                    echo ---
                    echo %%c^|%%d
                )
            )
        )
    )
)
unclemeat
источник
3

CJam, 40 байтов

A4m*{[KBBY].*:+56=},{:)2/'|f*"
---
"*N}/

Подход к поиску комбинаций отличается от подхода @ Optimizer, но код для их печати идентичен.

Попробуйте онлайн в интерпретаторе CJam .

Как это устроено

A4m*     e# Push all vectors of length 4 with coordinates in [0 ... 9].
         e# We'd normally use [0 ... 8] here, but "9 4m*" is 1 byte longer and
         e# "A4m*" doesn't produce any false positives.

{        e# Filter the vectors:
[KBBY].* e#   Multiply the elements of the vector by 20, 11, 11 and 2.
:+       e#   Add all four products.
56=      e#   Check if the sum is 56. 56 is used instead of 100 since all elements
         e#   of the vector will be incremented and 56 + 20 + 11 + 11 + 2 == 100.
},       e# Keep only vectors for which = pushed a truthy value.

{        e# For each vector:
:)       e#   Increment each coordinate.
2/       e#   Split into pair.
'|f*     e#   Join each pair, delimiting by '|'.
"
---
"*       e#   Join the two pairs, delimiting by "\n---\n".
N        e#   Push "\n".
}/       e#
Деннис
источник
Поскольку я знаю очень мало, кроме какой-то Java, я бы с удовольствием объяснил, как это работает, если вы хотите ..?
Denham Coote
Это хороший трюк.
Оптимизатор
Вау. Мне нужно многому научиться. Спасибо за объяснение :)
Denham Coote
3

Haskell, 107 131 байт

s=show
r=[1..9]
v=putStr$unlines[s a++"|"++s b++"\n---\n"++s c++"|"++s d++"\n"|a<-r,b<-r,c<-r,d<-r,(2*a+b+c)*10+b+2*d+c==100]

Вторая версия моей первой программы на Haskell!

На этот раз с отображением в соответствии с требованиями, бесстыдно украденным, адаптированным из nimi (я провел небольшое исследование, но, похоже, не существует эффективных способов отображения символов в Haskell, так что сложное использование stStr $ unlines трудно избежать).

И ... кроме факторизации формулы в конце, она все еще читаема =)

dungeoncrawler
источник
3

Haskell, 125 121 байт

s=show
f=putStr$unlines[s a++'|':s b++"\n---\n"++s c++'|':s d|[a,b,c,d]<-mapM id$"abcd">>[[1..9]],20*a+11*(b+c)+2*d==100]

Использование:

*Main> f
1|1
---
5|7
1|2
---
4|7
1|3
---
3|7
1|4
---
2|7
1|5
---
1|7
2|1
---
3|8
2|2
---
2|8
2|3
---
1|8
3|1
---
1|9

>>в "abcd">>[[1..9]]составляет список с 4 (длина 1 - го параметра) копий второго элемента, то есть [[1..9],[1..9],[1..9],[1..9]]. mapM idсоставляет список всех их комбинаций, т.е. [0,0,0,0]к [9,9,9,9]. Оставьте те, которые суммируют, 100и постройте строку из коробки. Распечатать все коробки.

Спасибо @Mauris за 1 байт и заставил меня просмотреть мой пост, чтобы найти еще 3.

Ними
источник
mapM idсохраняет байт против sequence.
Линн
2

Python 2, 145 129 байт

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

i=int
for k in range(1000,9999):
 a,b,c,d=`k`
 if i(a+b)+i(c+d)+i(a+c)+i(b+d)==100and not'0'in`k`:print a+'|'+b+'\n---\n'+c+'|'+d
Када
источник
2

CJam, 43 42 байта

A,1>4m*{2/_z+Afb:+100=},{2/'|f*"
---
"*N}/

Объяснение следовать .. сегодня EOD

Попробуйте онлайн здесь

оптимизатор
источник
Моя версия игры в гольф (которая не беспокоит коробки, она только перечисляет последовательности) составляла 197 символов. Это делает все это за четверть длины! Круто :)
Денхам Кут
@DenhamCoote Это каждый ответ CJam, Pyth и GolfScript.
этап
Все еще с нетерпением жду этого объяснения ;-)
Денхам Кут
1

Питон 3, 159

Быстро и грязно.

N='123456789'
D='%s|%s\n'
O=D+'---\n'+D
I=int
[print(O%(a,b,c,d)if I(a+b)+I(c+d)+I(a+c)+I(b+d)==100 else'',end='')for a in N for b in N for c in N for d in N]
Дэниел Уэйкфилд
источник
1

R 165 байт

e=expand.grid(d<-1:9,d,d,d)
a=apply
o=a(e[a(e,1,function(x)20*x[1]+11*(x[2]+x[3])+2*x[4]==100),],1,function(x)cat(x[1],"|",x[2],"\n---\n",x[3],"|",x[4],"\n",sep=""))

Это было бы значительно короче, если бы я решил каким-то образом жестко закодировать вывод. Как и в некоторых других решениях, здесь используется тождество 20 x 1 + 11 ( x 2 + x 3 ) + 2 x 4 = 100.

Ungolfed + объяснение:

# Create a matrix where each row is a combination of the digits 1-9
e <- expand.grid(1:9, 1:9, 1:9, 1:9)

# Filter the rows of the matrix using the aforementioned identity
e <- e[apply(e, 1, function(x) 20*x[1] + 11*(x[2]+x[3]) + 2*x[4] == 100), ]

# Print each row formatted into boxes
o <- apply(e, 1, function(x) cat(x[1], "|", x[2], "\n---\n", x[3], "|", x[4], sep = ""))

Вы можете быть удивлены, почему последнее утверждение является заданием. Оказывается, catфункция, которая объединяет и печатает, возвращает значение NULL. Когда вы вызываете catиз функции вроде apply, за выводом последует NULL, что нежелательно. Есть два способа обойти это: назначить переменную или обернуть ее invisible. Здесь я выбрал первый, так как он значительно короче.

Вы можете попробовать это онлайн .

Алекс А.
источник
1

Ява, 450

Моя первая попытка выглядела так:

класс B {
  public static void main (String [] a) {
    для (int i = 1; i <10; i ++)
      для (int j = 1; j <10; j ++)
        для (int k = 1; k <10; k ++)
          для (int l = 1; l <10; l ++)
            если (Integer.parseInt (I + "" + J) + Integer.parseInt (к + "" + L) + Integer.parseInt (I + "" + К) Integer.parseInt (J + "" + л) == 100) {
              System.out.println (я + "|" + J);
              System.out.println ( "---");
              System.out.println (к + "|" + л + "\ п");
            }
  }
}

Денхем Кут
источник
3
Подсказка: 20*a + 11*(b + c) + 2*d == 100.
orlp
Да, это решение было чисто конкатенацией строк - очень скромная первая попытка.
Денхам Кут
1
Я считаю только 436 байтов , а не 450. Кроме того, пробелы не нужны, что сэкономило бы вам значительную сумму.
Алекс А.
Кроме того, удаляя ненужные пробелы, это должно быть ближе к 340 байтов :)
Kade
1

PowerShell, 98

адаптированная формула Steveverrill

:\>cat printbox.ps1

1..9|%{for($j=1;$j-lt10;$j++){if(($k=(8-$j-2*$_))-gt0){"{0}|{1}`n---`n{2}|{3}"-f$_,$j,$k,
($_+6)}}}

:\>powershell -f printbox.ps1
1|1
---
5|7
1|2
---
4|7
1|3
---
3|7
1|4
---
2|7
1|5
---
1|7
2|1
---
3|8
2|2
---
2|8
2|3
---
1|8
3|1
---
1|9
blabb
источник