Narysuj kombinacje, które sumują się do 100

13

W każdym rogu masz pudełko z jednocyfrową liczbą:

1|2
---
3|4

Jeśli połączymy cyfry wzdłuż rzędów od lewej do prawej, otrzymamy 12 i 34. Jeśli połączymy cyfry wzdłuż kolumn od góry do dołu, otrzymamy 13 i 24. Jeśli dodamy wszystkie te liczby, otrzymamy 12 + 34 + 13 + 24 = 83.

Wyzwanie

Napisz program do drukowania wszystkich takich pól, w których suma obliczona jak wyżej wynosi 100.

Zakładając, że każdy narożnik zawiera jedną cyfrę od 1 do 9, istnieje 9 kombinacji: 1157, 1247, 1337, 1427, 1517, 2138, 2228, 2318 i 3119. (Pamiętaj, że istnieje 25 kombinacji, jeśli uwzględnimy 0, ale nie jesteśmy do tego wyzwania).

Zauważ, że przykład 1234 nie działa, ponieważ 12 + 34 + 13 + 24 nie jest równe 100.

Wejście

Żaden

Wynik

Pola odpowiedzi w następującym formacie:

A|B
---
C|D

Dane wyjściowe należy wydrukować do STDOUT lub najbliższej alternatywy.

Zasady

  • AB + CD + AC + BD = 100
  • Każdy narożnik będzie zawierał tylko liczby całkowite dodatnie 1-9.
  • 0 jest wykluczone.
  • Liczb można używać więcej niż jeden raz.
  • Musisz narysować pola, jak wyżej. ( A|B\n---\nC|D\n)
  • Musisz podać wszystkie poprawne odpowiedzi.
  • Dodatkowy znak nowej linii jest w porządku.
  • , więc wygrywa najkrótszy kod w bajtach.
  • Obowiązują standardowe luki i warunki.

To moje pierwsze zgłoszenie, więc daj mi znać, jeśli będę musiał coś wyjaśnić.

Denham Coote
źródło
Czy możesz pokazać, jaki powinien być wynik? A co z końcowym znakiem nowego wiersza?
Spikatrix,
Niezłe wyzwanie. Myślę, że musisz wyraźnie powiedzieć, jakie liczby należy dodać. Wiersz „Dwie połączone liczby dwucyfrowe w poprzek PLUS dwa dwucyfrowe numery w dół muszą być równe 100”. nie jest wystarczająco jasne. Zorientowałem się tylko na przykładzie 1234. Dostaję tylko 9 takich kombinacji. Czy możesz podać 16 kombinacji?
Optymalizator
1
Wprowadziłem kilka zmian w wyjaśnieniu i formatowaniu. Jeśli nie zgadza się z pierwotnymi założeniami, cofnij edycję.
Alex A.,
1
@DenhamCoote faktycznie, moje częściowo zakodowane rozwiązanie było całkiem interesujące, ponieważ jest tylko częściowo zakodowane. Jest to wyjątek od reguły, ponieważ pytania, w których rażące kodowanie jest najlepszą / najbardziej oczywistą opcją, często nie dają ciekawych odpowiedzi (patrz na przykład ostatnie pytanie dotyczące pierścieni boromejskich). Dziękuję za pytanie.
Level River St
1
Zaakceptowanie odpowiedzi może sprawiać wrażenie, że pytanie jest skończone, więc zostawię to jeszcze chwilę. Jeśli później otrzymasz więcej odpowiedzi, możesz zmienić akceptację, ale oznacza to, że musisz uważać, co może nie mieć czasu. Konkursy popularności nie są lubiane, ponieważ często są leniwie pisane i zbyt szerokie, często typu „Wykonaj X w najbardziej skomplikowany sposób”. Zasadniczo jedynymi dobrymi pytaniami dotyczącymi popularności są przetwarzanie obrazu, gdzie ocena przez człowieka jest jedynym sposobem na podjęcie decyzji, czy algorytm jest dobry, czy nie. Przetwarzanie obrazu wyklucza czystą sztukę, która jest nie na temat.
Level River St

Odpowiedzi:

8

Pyth, 42 38 34 bajty

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

Końcowy znak nowej linii w kodzie jest ważny. Głównym powodem jestem konkurencyjny dlatego używam kropka iloczyn wektorowy [1, 1, 5, 7]i [20, 11, 11, 2]i porównać go do 100.

orlp
źródło
"|"-> \|, \n-> (dosłowny wysuw wiersza) i nie potrzebujesz ostatecznej wyceny.
Dennis,
@Dennis spał>. <
orlp
2
Jeśli nie masz nic przeciwko, czy możesz dodać wyjaśnienie dla tych (takich jak ja), którzy nie potrafią odczytać twojej niewiarygodnie krótkiej odpowiedzi?
Denham Coote
6

Ruby, 71

Ponieważ kodowanie na stałe nie jest niedozwolone (a w każdym razie trudno jest narysować linię), oto częściowa zakodowana odpowiedź.

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

Wyjaśnienie

Wzór na rozwiązanie jest następujący:

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

Dzięki modułowym argumentom arytmetycznym widzimy, że A i D muszą się różnić stałą wartością, taką jak (A*20+D*2)%11stała. W rzeczywistości D = A + 6. W iiteracji pętli przez trzy możliwe wartości A.

Wartość B może wynosić od 1 do 1, 7-i*2a suma B i C musi wynosić 14-A-D. W ten sposób otrzymujemy następujące wyrażenia, które są drukowane. Ruby zezwala na dosłowne znaki nowej linii w ciągach zamkniętych w''

   i     |    j
------------------
8-j-2*i  |   i+6
Level River St
źródło
4

Java, 202 200 198

Próbuję po raz pierwszy: D

EDYCJA: zapisano 2 bajty z nieco mniejszymi obliczeniami znalezionymi w innym komentarzu.

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
źródło
4

Partia - 187 bajtów

Brutalna siła.

@!! 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

Gra w golfa jest nieco mniej obrzydliwa:

@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
                )
            )
        )
    )
)
nieszczęście
źródło
3

CJam, 40 bajtów

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

Podejście do wyszukiwania kombinacji różni się od @ Optymalizatora, ale kod do ich wydruku jest identyczny.

Wypróbuj online w interpretatorze CJam .

Jak to działa

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#
Dennis
źródło
Ponieważ niewiele wiem poza Javą, chętnie wyjaśnię, jak to działa, jeśli chcesz…?
Denham Coote,
To niezła sztuczka.
Optymalizator
Łał. Muszę się wiele nauczyć. Dzięki za wyjaśnienie :)
Denham Coote,
3

Haskell, 107 131 bajtów

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]

Druga wersja mojego pierwszego programu Haskell w historii!

Tym razem z wyświetlaniem zgodnie z wymaganiami, bezwstydnie skradziony zaadaptowany przez nich (no cóż, przeprowadziłem kilka badań, ale wydaje się, że nie ma tak skutecznych sposobów wyświetlania postaci w Haskell, więc trudno jest uniknąć unlines putStr $).

I ... oprócz faktoryzacji formuły na końcu, nadal jest ona czytelna =)

dungeoncrawler
źródło
3

Haskell, 125 121 bajtów

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]

Stosowanie:

*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

>>in "abcd">>[[1..9]]tworzy listę z 4 (długość pierwszego parametru) kopiami drugiego elementu, tj [[1..9],[1..9],[1..9],[1..9]]. mapM idtworzy listę wszystkich ich kombinacji, czyli [0,0,0,0]do [9,9,9,9]. Trzymaj te, które sumują się 100i buduj ciąg z jego pudełkiem. Wydrukuj wszystkie pudełka.

Dzięki @Mauris za 1 bajt i każę przejrzeć mój post, aby znaleźć 3 kolejne.

nimi
źródło
mapM idoszczędza Vs. bajtów sequence.
Lynn
2

Python 2, 145 129 bajtów

Obecnie bawię się kilkoma różnymi metodami obliczania, które powinny być krótsze niż te przedstawione, ale opublikuję to, co mam teraz.

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
Kade
źródło
2

CJam, 43 42 bajty

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

Wyjaśnienie do naśladowania ... do dziś EOD

Wypróbuj online tutaj

Optymalizator
źródło
Moja wersja gry w golfa w Javie (która nie przeszkadza pudełkom, tylko wyświetla sekwencje) miała 197 znaków. To wszystko na ćwierć długości! Fajnie :)
Denham Coote,
@DenhamCoote To jest każda odpowiedź na CJam, Pyth i GolfScript.
faza
Nadal nie mogę się doczekać tego wyjaśnienia ;-)
Denham Coote
1

Python 3, 159

Szybko i brudno.

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]
Daniel Wakefield
źródło
1

R, 165 bajtów

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

Byłoby to znacznie krótsze, gdybym zdecydował się w jakiś sposób zakodować wyjście. Podobnie jak kilka innych rozwiązań, wykorzystuje to tożsamość 20 x 1 + 11 ( x 2 + x 3 ) + 2 x 4 = 100.

Niegolfowane + wyjaśnienie:

# 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 = ""))

Być może zastanawiasz się, dlaczego ostatnie zdanie jest zadaniem. Jak się okazuje, catfunkcja konkatenująca i drukująca zwraca wartość NULL. Kiedy zadzwonisz catz funkcji takiej apply, po wyjściu pojawi się komunikat NULL, co jest niepożądane. Są na to dwa sposoby: przypisz ją do zmiennej lub zawiń invisible. Tutaj wybrałem ten pierwszy, ponieważ jest znacznie krótszy.

Możesz spróbować online .

Alex A.
źródło
1

Java, 450

Moja pierwsza (nie golfowa) próba wyglądała następująco:

klasa B {
  public static void main (String [] a) {
    dla (int i = 1; i <10; i ++)
      dla (int j = 1; j <10; j ++)
        dla (int k = 1; k <10; k ++)
          dla (int l = 1; l <10; l ++)
            if (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");
            }
  }
}

Denham Coote
źródło
3
Podpowiedź: 20*a + 11*(b + c) + 2*d == 100.
orlp
Tak, to rozwiązanie było czysto strunowe połączenie - bardzo skromna pierwsza próba.
Denham Coote,
1
Liczę tylko 436 bajtów , a nie 450. Również białe znaki nie są konieczne, co pozwoliłoby ci zaoszczędzić sporo.
Alex A.,
Ponadto, usuwając niepotrzebne białe znaki, powinno to być bliżej 340 bajtów :)
Kade
1

PowerShell, 98

dostosowana formuła steveverrilla

:\>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
źródło