このコンテナはこれだけの液体を保持できますか?


8

このコンテナはこれだけの液体を保持できますか?

チャレンジの概要

ご存知のように、液体の形状は不定であり、体積は一定です。そのため、それらは常にコンテナの形をしています。ただし、コンテナを埋めるために拡張することはできません。

今日のあなたの仕事は、特定の量の液体(L提案に従って、パーツの体積を表す特定の数の文字または数字で表される)が特定のサイズのコンテナ(マトリックスで表される)に収まるかどうかを判断することですC文字)の中にスペース(スペース文字で表される)がいくらか含まれています。コンテナは常にC、周囲全体に文字を持ちます。

プログラムは、液体がコンテナに収まるかどうかに基づいて、真偽値返します。残りのスペースから(スペースまたは2つの改行文字による)。

テストケース

LLL
L
-----    True
CCCCC
C  CC
C  CC
CCCCC

LLL
 LL
------   True
CCCCCC
C C  C
C  CCC
CCCCCC

L L
LLL
-----    False (Not enough space)
CCCCC
CCCCC
C  CC
CCCCC

LL
------   False (Spaces are not connected but liquid is)
CCCCCC
CCCC C
C CCCC
CCCCCC

L L
------   True
CCCCCC
CCCC C
C CCCC
CCCCCC

L L
------   True (There is a pocket of empty space which holds both parts of the liquid)
CCCCCC
CCC  C
CCCCCC
CCCCCC

L

L
------   True (There is a pocket of empty space for each part of the liquid)
CCCCCC
CCCC C
C CCCC
CCCCCC

L L L LL
------   True
CCCCCCCCC
CCCC  C C
C CCCCCCC
CCCCCC CC
CCCCCCCCC

L
L
-----    True
CCCCC
CCCCC
C  CC
CCCCC

テストケースをご提案ください。

ルール

  • これはなので、バイト単位の最も短い答えが優先されます。
  • 標準の抜け穴は許可されていません。

1
私のようなテストケースを追加することをお勧めしたいL\n\nLCCCCC\nCCCCC\nC..CC\nCCCCC.スペースを表し、\n改行を表します)。
Erik the Outgolfer

1
Lテキストをボリュームのリスト(つまり、L各量のs の数のリスト)として取得できますか?スペースと二重改行の解析は、チャレンジの中心とは無関係のようです。またC、同じ理由でテキストを2つの異なる値の行列として受け取ることもできますか?
ジョナサンアラン

1
推奨されるテストケース3 LLL、サイズ3および2のスペースがあるもの(最初に、最小のスペースのみを使用する最小の液体で埋めるアルゴリズムでは、Falseyが発生します)。多分同じですが、2 Lつと1つLLLもあり、反対方向に対応します。
ジョナサンアラン

1
この質問は、私にとって3つの異なる質問のようです。1つ目はL、整数リストへの入力の解析です。2つ目は、入力C行列を解析して整数のリストにすることです。そして3番目は、与えられた整数のバッグAとBの決定問題です。Aにパーティションがある場合、各パーティションのすべての整数を合計してバッグA 'を取得すると、A'のn番目に大きい数ごとに小さくなります( <=)B 'のn番目に大きい数。
tsh

1
とにかく、カタツムリの入力形式としては、文字形式が望ましいと思います。PPCGでは一般的に緩いIO要件が推奨されますが、それは確かにあなた次第です。
ジョナサンアラン

回答:


4

カタツムリ、58バイト

入力は、例とまったく同じように行われます。

t\ t\L{t\L?t\ z!.o=(\ ,\C},!(tz(\L!.!~|\ !.o=(\ ,\C},!(t\L

4バイト長いバージョンは、テストケースをすぐに完了するのに十分な速さです(このバージョンをオンラインで試してください):

?^
t\ t\L{t\L`?t\ z!.o=(\ ,\C},!(tz(\L!.!~|\ !.o=(\ ,\C},!(t\L

後者のインデントされたフォーマット:

?^
    t\ 
    t\L
    {
        t\L`?
        t\ 
        z!.
        o=(\ ,\C
    },
    !(tz(
         \L!.!~
         |
         \ !.o=(\ ,\C
},
!(t\L

2
インデントされたバージョンに説明を追加できますか?それとも、追加する前にまだゴルフを続けていますか?
Kevin Cruijssen、

1

クリーン、313バイト

import StdEnv,Data.List
?v=nub[v:[[sum s:k]\\s<-subsequences v|s>[],k<- ?(difference v s)]]
$v m#p=[[(x,y)]\\x<-[0..]&l<-m,y<-[0..]&' '<-l]
=or[and(zipWith(>=)(s++[0,0..])r)\\r<- ?v,s<-permutations(map length(foldl(\p _=nub[sort(nub(e++[(x,y)\\(u,v)<-e,x<-[u-1,u,u+1],y<-[v-1,v,v+1]|(m!!x)!!y<'C']))\\e<-p])p p))]

オンラインでお試しください!

関数を定義します $ :: [Int] [[Char]] -> Bool。TIOリンクには、STDINのラッパーが含まれています。

? :: [Int] -> [[Int]] ボリュームを組み合わせることができるさまざまな方法を生成するヘルパーです。

拡張:

$ v m // in function $ of v and m
    # p // define p as
        = [ // a list of
            [(x, y)]    // lists of pairs (x, y)
        \\              // for each
            x <- [0..]  // index x
            & l <- m    // at list l in m
        ,               // for each
            y <- [0..]  // index y
            & ' ' <- l  // at spaces in l
        ]
    = or [ // true if any of the list of
        and (               // true if all of
            zipWith         // element-wise application of
                (>=)            // greater than or equal to
                (s ++ [0, 0..]) // permutation s padded with zeroes
                v               // list v of volumes
        )
    \\                      // for each
        s <- permutations ( // permutation s of
            map length (    // the lengths of
                foldl       // a left-fold of
                    (\p _   // function on p discarding second argument
                        = nub [ // the unique elements of the list of
                            sort (          // sorted versions of
                                nub (       // unique lists composed of
                                    e       // list e of points in a region
                                    ++ [    // prepended to the list of
                                        (x, y)      // pairs (x, y)
                                    \\              // for each
                                        (u, v) <- e // pair (u, v) in list e
                                    ,               // for each
                                        x <- [u-1, u, u+1] // x-coordinate adjacent to u
                                    ,               // for each
                                        y <- [v-1, v, v+1] // y-coordinate adjacent to v
                                    |               // where
                                        (m!!x)!!y < 'C' // the character in m at (x, y) is a space
                                    ]
                                )
                            )
                        \\          // for each
                            e <- p  // region e in p
                        ]
                    )
                    p // applied to a starting argument of p
                    p // recursively, for each element in p
            )
        )
    ]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.