Намалюйте комбінації, які містять до 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 насправді моє напівтверді рішення було досить цікаво зробити, тому що це лише напівтверді кодування. Це було винятком із правила, оскільки питання, де кричуще жорстке кодування є найкращим / найочевиднішим варіантом, часто не дають цікавих відповідей (див., Наприклад, недавнє запитання про бромерові дзвінки). Дякую за запитання.
Річка рівня Св.

1
Прийняття відповіді може створити враження, що питання закінчено, тому я ще покину його. Якщо згодом ви отримаєте більше відповідей, ви можете змінити акцепт, але це означає, що вам потрібно тримати огляд, що ви, можливо, не встигнете зробити. Конкурси на популярність не подобаються, оскільки вони часто ліниво написані та надмірно широкі, часто типу "Зробити X найскладнішим можливим способом". Зазвичай єдині питання хорошої популярності - це обробка зображень, де оцінка людини - це єдиний спосіб вирішити, хороший алгоритм чи ні. Обробка зображень виключає чисте мистецтво, яке поза темою.
Рівень річки Св.

Відповіді:


8

Pyth, 42 38 34 байт

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

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


"|"-> \|, \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

4

Ява, 202 200 198

Пробуємо вперше: D

EDIT: збережено 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);}}

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
                )
            )
        )
    )
)

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 коли-небудь!

Цього разу з відображенням відповідно до вимог, безсоромно вкраденого адаптованого з німі (добре, що я провів деякі дослідження, але, здається, не так вже й ефективні способи відображення символів у Haskell, щоб putStr $ unlines важко уникнути).

І ... крім факторизації формули в кінці, вона все ще читається =)


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зберігає байт vs. sequence.
Лінн

2

Пітон 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}/

Пояснення до наступного… до сьогоднішнього дня ЗНО

Спробуйте його онлайн тут


Моя версія гольф-java (яка не турбує коробки, вона містить лише послідовності) - 197 символів. Це робить все на чверть довжини! Класно :)
Denham Coote

@DenhamCoote Ось кожен відповідь CJam, Pyth та GolfScript.
фаза

Все ще з нетерпінням чекаю цього пояснення ;-)
Denham Coote

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.

Недоліковані + пояснення:

# 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

Моя перша спроба (без вольхів) виглядала так:

клас Б {
  загальнодоступна статична недійсна головна (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 (k + "" + l) + Integer.parseInt (i + "" + k) + Integer.parseInt (j + "" + l) == 100) {
              System.out.println (i + "|" + j);
              System.out.println ("---");
              System.out.println (k + "|" + l + "\ n");
            }
  }
}


3
Підказка: 20*a + 11*(b + c) + 2*d == 100.
orlp

Так, це рішення було суто стрункою конкатенацією - дуже скромна перша спроба.
Denham Coote

1
Я налічую лише 436 байт , а не 450. Крім того, пробіл не потрібен, що заощадить вам значну суму.
Алекс А.

Крім того, видаляючи зайвий пробіл, це має бути ближче до 340 байт :)
Каде

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.