最大100個の組み合わせを描く


13

各コーナーに1桁の数字のボックスがあります:

1|2
---
3|4

行に沿って数字を左から右に連結すると、12と34が得られます。列に沿って数字を上から下に連結すると、13と24が得られます。これらの数値をすべて加算すると、12 + 34 + 13 +が得られます。 24 = 83。

チャレンジ

上記のように計算された合計が100に等しいすべてのボックスを印刷するプログラムを作成します。

各コーナーに1〜9の1桁の数字が含まれていると仮定すると、1157、1247、1337、1427、1517、2138、2228、2318、および3119の9つの組み合わせがあります。私たちはこの挑戦のためではありません。)

12 + 34 + 13 + 24は100ではないため、例1234は機能しないことに注意してください。

入力

なし

出力

次の形式の回答ボックス:

A|B
---
C|D

出力は、STDOUTまたは最も近い代替に出力する必要があります。

ルール

  • AB + CD + AC + BD = 100
  • 各コーナーには、1〜9の正の整数のみが含まれます。
  • 0は除外されます。
  • 番号は複数回使用できます。
  • 上記のように、ボックスを描く必要があります。(A|B\n---\nC|D\n
  • すべての有効な回答を出力する必要があります。
  • 追加の末尾の改行で問題ありません。
  • なので、バイト単位の最短コードが優先されます。
  • 標準の抜け穴とT&Cが適用されます。

これは私の最初の提出ですので、何か明確にする必要がある場合はお知らせください。


出力がどうなるかを示していただけますか?また、末尾の改行文字はどうですか?
Spikatrix

ナイスチャレンジ。どの数字を追加する必要があるかを明示的に伝える必要があると思います。「2つの連結された2桁の数字と2つ下の2桁の数字は100に等しくなければなりません。」という行 十分に明確ではありません。私は1234の例を使用して計算しました。また、このような組み合わせは9つしかありません。16の組み合わせを教えてください。
オプティマイザー

1
説明とフォーマットをいくつか編集しました。元の意図と一致しない場合は、編集をロールバックしてください。
アレックスA.

1
実際、@ DenhamCooteは、セミハードコーディングされたソリューションであるため、私のセミハードコーディングされたソリューションは非常に興味深いものでした。露骨なハードコーディングが最良/最も明白なオプションである質問では、興味深い回答が得られないことが多いため、これはルールの例外です(たとえば、最近のボロミアリング質問を参照してください)。質問ありがとうございます。
レベルリバーセント

1
答えを受け入れると、質問が終了したという印象を与えることがあるので、私はまだそれを残しておきます。その後より多くの回答が得られた場合、受け入れを変更できますが、それは見張りを維持する必要があることを意味します。人気のコンテストは、多くの場合「怠Xに書かれており、過度に広範であり、「可能な限り最も複雑な方法でXを実行する」タイプであるため、嫌われています。一般的に、人気のある質問は画像処理に限られ、人間の評価がアルゴリズムが良いかどうかを判断する唯一の方法です。画像処理では、トピック外の純粋なアートは除外されます。
レベルリバーセント

回答:


8

Pyth、42 38 34バイト

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

コードの末尾の改行は重要です。私はのベクトル内積を使用するので、私は競争力だ主な理由はある[1, 1, 5, 7][20, 11, 11, 2]し、100と比較します。


"|"-> \|\n->(リテラル改行)そして、最後の引用符は必要ありません。
デニス

@デニスは寝ていた>。<
orlp

2
気にしない場合、あなたの信じられないほど短い答えを解読できない人(私のような)に説明を追加してもらえますか?
デンハムクート

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。iA.の3つの値をループ反復

Bの値は1〜の任意の値で7-i*2、BとCの合計はでなければなりません14-A-D。したがって、次の式を取得します。これらの式は出力されます。Rubyで囲まれた文字列のリテラル改行を許可します''

   i     |    j
------------------
8-j-2*i  |   i+6

4

Java、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);}}

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を除けばほとんど知らないので、喜んでこれがどのように機能するかの説明が欲しいです。
デンハムクート

それはいいトリックです。
オプティマイザー

ワオ。学ぶべきことがたくさんあります。説明をありがとう:)
デンハムクート

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プログラムの2番目のバージョン!

今回は要件に応じた表示で、nimiからfromしみなく盗まれました(まあ、私はいくつかの研究をしましたが、Haskellで文字を表示する効率的な方法がないため、putStr $ unlinesを避けるのは困難です)。

そして...最後に式の因数分解を除いて、それはまだ読みやすいです=)


3

ハスケル、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

>>in "abcd">>[[1..9]]は、2番目の要素の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まで

こちらからオンラインでお試しください


私のゴルフのJavaバージョン(ボックスに煩わされず、シーケンスをリストするだけです)は197文字でした。これは、長さの4分の1ですべて完了します!クール:)
デンハムクート

@DenhamCoote CJam、Pyth、GolfScriptのすべての答えです。
フェーズ

まだその説明を楽しみにしています;-)
デナムクート


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、これは望ましくありません。これを回避するには、2つの方法がありますinvisible。変数に割り当てるか、でラップします。ここでは、前者が大幅に短いため、前者を選択しました。

オンラインで試すことができます


1

Java、450

私の最初の(改変されていない)試みはこのように見えました:

クラスB {
  public static void main(String [] a){
    for(int i = 1; i <10; i ++)
      for(int j = 1; j <10; j ++)
        for(int k = 1; k <10; k ++)
          for(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");
            }
  }
}


3
ヒント:20*a + 11*(b + c) + 2*d == 100
orlp

ええ、この解決策は純粋に文字列の連結でした-非常に謙虚な最初の試み。
デンハムクート

1
450 バイトではなく436バイトしかカウントしません。また、空白は必要ありません。これにより、かなりの量を節約できます。
アレックスA

さらに、不要な空白を削除すると、これは340バイトに近くなります。
ケイド

1

PowerShell、98

適応ステベバーリルの式

:\>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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.