Tamsayılar, Montaj!


30

Görev arasındaki tam sayıları monte etmek 1için Ngenişlikte bir dikdörtgen içine (giriş olarak verilen) Wve yüksekliğiH (aynı zamanda giriş olarak verilen). Tek tek sayılar, 90 derecenin herhangi bir katı ile döndürülebilir, ancak dikdörtgende bitişik bloklar olarak görünmeleri gerekir. Diğer bir deyişle, sayılardan birini birden fazla rakama bölemez ve sayıları ayrı ayrı dikdörtgene yerleştiremezsiniz, bir köşedeki sayının üç basamağını da bükemezsiniz. Her sayıyı bir duvar inşa ettiğiniz bir tuğla olarak düşünebilirsiniz.

İşte bir örnek. Girişinizi söyle (N, W, H) = (12, 5, 3). Olası bir çözüm:

18627
21901
53114

Netlik sağlamak için, bu kılavuzun iki kopyası, biri rakamlardan biri gizli, diğeri de rakamlardan iki tanesi gizli:

1####    #8627
2##01    #19##
##11#    53##4

Dikdörtgenin benzersiz bir şekilde tekrar sökülmemesi sorun değil. Örneğin, yukarıdaki örnekte, bu 12şekilde de yerleştirilmiş olabilir:

#####    18627
21#01    ##9##
##11#    53##4

kurallar

Sen varsayabiliriz Nolumlu olduğunu ve W*Hgelen tamsayılar basamak sayısını maçları 1için Nkapsayıcı ve sayının içine dikdörtgenin bir döşeme var olduğunu. Şu anda bunun her zaman mümkün olup olmadığına dair bir kanıtım yok, ancak bir taneyle ilgilenirim.

Çıktı, tek satır besleme ayrılmış bir dize veya bir dizi listesi (her satır için bir tane) veya tek basamaklı tam sayıların (her hücre için bir tane) listelerinin bir listesi olabilir.

Gönderiminizin sonuçları belirleyici olmalı ve tüm test durumlarını makul bir masaüstü makinesinde bir dakikadan daha kısa sürede halledebilmelisiniz.

Bir program veya fonksiyon yazabilir ve standart yöntemlerimizden herhangi birini kullanabilirsiniz. girdi alma ve çıktı alma .

Herhangi bir programlama dilini kullanabilirsiniz , ancak bu boşlukların varsayılan olarak yasak olduğunu unutmayın .

Bu , yani en kısa geçerli cevap - bayt cinsinden - kazanır.

Test Kılıfları

İlki hariç, bunların hiçbiri benzersiz değil. Her test durumunu N W Holası bir çıktı izler. Daha büyük sayıları yatay olarak yazmak için dikdörtgenin çok dar olması durumunda cevabınızın çalıştığından emin olun.

1 1 1
1

6 6 1
536142

6 2 3
16
25
34

10 1 11
1
0
8
9
2
6
7
3
1
5
4

11 13 1
1234567891011

27 9 5
213112117
192422581
144136119
082512671
205263272

183 21 21
183116214112099785736
182516114011998775635
181116013911897765534
180415913811796755433
179115813711695745332
178315713611594735231
177115613511493725130
176215513411392715029
175115413311291704928
174115313211190694827
173115213111089684726
172015113010988674625
171915012910887664524
170814912810786654423
169714812710685644322
168614712610584634221
167514612510483624120
166414512410382614019
165314412310281603918
164214312210180593817
163114212110079583716

200 41 12
81711132917193661114105533118936111184136
50592924448815915414562967609909953662491
89529721161671582389717813151113658811817
41418184511110119010183423720433017331118
35171183614003547461181197275184300111711
41874381132041861871718311415915921116264
11914245014112711011594492626831219331845
17125112629222085166344707736090956375181
94507611291431121128817413566319161275711
11011540021119913511011169939551729880780
92725141607727665632702567369893534277304
78118311405621148296417218591118562161856

8
Bunun her zaman mümkün olduğuna dair bir kanıt var mı?
Ağustos’ta

@Fatalize Aslında güzel bir soru. Verilen tüm girdiler için mümkün olduğunu varsayabilirsiniz, ancak her iki şekilde de ilginç olabilir.
Martin Ender

@Faltalize: En azından önemsiz girdi durumunda, (10, 1, 1)mümkün değildir (1'den 1'e kadar olan tüm sayıların Ninşaatta kullanılması gerektiği varsayılarak ). Eğer bu kısıtlama tutulursa, birimin içindeki dikdörtgenin alanı 1..Nmümkün kılmak için en az basamak sayısı olmalıdır . Bu kısıtlama gevşemişse, her durumda mümkündür (ancak zorluk çok da eğlenceli değildir: P)
Sebastian Lenartowicz

2
@SebastianLenartowicz: Dikdörtgenin alanının [1, N] sayılarının rakamlarının toplamıyla eşleştiğini söylediği kısmı kaçırdığınızı düşünüyorum. N == 10 ise, genişlik ve yükseklik 1 ve 11 olmalıdır. Genişlik veya yükseklik 1 ise, bu problem her zaman çözülebilir.
Yay295

1
@MartinEnder Karşıt zorluk da ilginç olabilir: giriş olarak rakamlardan oluşan bir dikdörtgen (ve sonunda N, ancak program bunu genişlik ve yükseklikten hesaplayabilir) ve programın dikdörtgenin bu mücadeleye doğru bir cevap olup olmadığını kontrol etmesi gerekir. ...
Dada

Yanıtlar:


3

Pyth, 35 bayt

juum+WghHl+dQd~tQN<+.TGmkeHeH)_BvzY

Mbomb007 için kredi. Algoritmasını kullandım. Aslında sadece Steven H.'ye yardım etmek istedim, ama sonra gerçekten kısa bir versiyonunu görmek istedim.

Alır Nilk satırda ve W,Hikinci satırda: Online Deneyin: Gösterme

Pyth uygulamasında kötü bir hata .[buldum (uyguladığımdan beri kendi hatam). Yarın tamir etmeliyim. Bu +3 bayt ile sonuçlandı.

Açıklama:

juum+WghHl+dQd~tQN<+.TGmkeHeH)_BvzY
                                  Y   start with the empty list []
                                      I'll perform all operations on this list. 
                                      Sometimes it is called G, sometimes N. 
                                vz    read the second line and evaluate it: [W, H]
                              _B      bifurcate it with reverse: [[W, H], [H, W]]
 u                                    for each pair H in ^:
                    .TG                  transpose G
                   +   mkeH              append H[1] empty strings
                  <        eH            use only the first H[1] strings
                                         lets call this result N
  u                          )           modify N, until it doesn't change anymore:
   m                        N               map each d in N to:
     WghHl+dQ                                  if H[0] >= len(d+Q):
    +        d  Q                                 d + Q
              ~t                                  and decrement Q by 1
             d                                 else:
                                                  d
j                                     at the end print every row on a separate line

7

Python 2, 210 200 bayt

Düzenle: Şimdi çalışıyor!

Yukarıdan aşağıya, soldan sağa, en büyük sayılarla başlayarak doldurur. Sonra, transpoze edin ve tekrar yapın. Sonra çevir ve yazdır. Aktarımın çalışması için boşluklarla dolmak zorunda kaldım çünkü çizgiler henüz tam uzunlukta değildi.

Yuvalanmış bir execçalışma konusunda sorun yaşadım (yapacak exec'exec"..."*w\n;...'*2. Biri bunu çözebilirse, bana bildirin.

n,w,h=input()
s=[""]*h
for x in 1,2:
    exec"for i in range(h):l=len(s[i]+`n`)<=w;s[i]+=`n`*l;n-=l\n"*w;s=[r.replace(" ","")for r in map(lambda x:`x`[2::5],zip(*[r.ljust(w)for r in s]))];w,h=h,w
print s

Çevrimiçi deneyin - Birden fazla test senaryosunu daha kolay çalıştırabilmesi için değiştirilmiş bir işlev kullanır (ve kullanamadıexec). Diğer sürümü uncomment ve çalışmasını görmek için stdin değiştirin.

Daha az golf oynadı:

def f(n,w,h):
    s=[""]*h
    for x in 1,2:
        for j in[0]*w:
            for i in range(h):
                l=len(s[i]+`n`)<=w
                s[i]+=`n`*l
                n-=l
        s=[r.ljust(w)for r in s]
        s=map(lambda x:`x`[2::5],zip(*s))
        s=[r.replace(' ','')for r in s]
        w,h=h,w
    print"\n".join(s)

Bunun şimdi tüm durumlar için çalışması büyük olasılıkla muhtemeldir, ancak (gayri resmi) bir kanıt hala takdir edilecektir. ;)
Martin Ender

@MartinEnder Bir kanıt muhtemelen benden öte. Sayıların daha uzun değişmesi için, test durumları çok büyür. Muhtemelen her zaman bir çözüm olup olmadığının bir kanıtı ile ilişkili ya da aynı.
mbomb007 21

6

JavaScript, 284 259 245 241 240 223 209 205 bayt

// Golfed
let f = (N,W,H)=>eval('a=Array(H).fill("");while(N)g:{s=""+N--;d=s[L="length"];for(i in a)if(a[i][L]+d<=W){a[i]+=s;break g}for(p=0;d;++p){l=a[p][L];for(k=p+d;k>p;)l=a[--k][L]-l?W:l;while(l<W&&d)a[p+--d]+=s[d]}}a');

// Ungolfed
(N,W,H) => {
    a = Array(H).fill(""); // Create `H` empty rows.

    while (N) g : {
        s = "" + N--; // Convert the number to a string.
        d = s[L="length"]; // Count the digits in the number.

        // Loop through the rows trying to fit the number in horizontally.
        for (i in a) {
            if (a[i][L] + d <= W) { // If it fits.
                a[i] += s; // Append the number to the row.
                break g; // This is what a goto statement looks like in JavaScript.
            }
        }

        // Loop through the rows trying to fit the number in vertically.
        for (p = 0; d; ++p) {
            l = a[p][L]; // Get the length of the row.

            // Find `d` adjacent rows of the same length.
            for (k = p + d; k > p; ) {
                // If `a[--k][L] == l`, continue.
                // Else set `l` to `W` so the next loop doesn't run.
                l = a[--k][L] - l ? W : l;
            }

            // Put the characters in position.
            while (l < W && d)
                a[p+--d] += s[d];
        }
    }

    return a;
}

let test_data = [[1,1,1],
                 [6,6,1],
                 [6,2,3],
                 [10,1,11],
                 [10,11,1],
                 [11,13,1],
                 [27,9,5],
                 [183,21,21],
                 [184,2,222],
                 [200,41,12],
                 [1003,83,35]];

for (let test of test_data)
    console.log(f(test[0],test[1],test[2]));


1
İki sayının farklı olup olmadığını test etmek -yerine 1 byte kullanarak tasarruf edin !=.
Neil

2

Pyth, 79 50 48 Bayt

Ben hataları çözene kadar rekabet etmem (örneğin, [6,6,1], [6,1,6] ile aynı şekilde döner). Pyth'i kullanmaya ilk kez başladığımdan, muhtemelen bir çok özelliği özlüyorum.

Jakube sayesinde 29 bayt kurtardı ve kodumu gerçekten işe yaradı!

repr()Çağrıları gereksiz olduğunu fark ederek başka bir iki bayt kurtardı.

Temelde sadece mbomb007 en Python 2 cevabının bir çevirisi.

AEJmkHFb2VHVGIgGl+@JNQ XNJ~tQ)))=.[.TJkGA,HG)jJ

Şeklinde girdi alır
n
w,h.


2
Answers should be deleted until they are a valid solution.
mbomb007

I think most of the code is correct. The only error I see happens during the transposition. mbomb007 transposes by carefully filling up the remaining columns with spaces, then zips and removes the spaces. This guarentees. that the after transposing the matrix has w length. =.TZ can't guarantee that, since it doesn't know the length w.
Jakube

Actually the main error is, that !>+@ZN`zK should be !>+@ZN`zJ. Then all the small test cases work. But you can create test-cases, where the transposing fails (like described above). For this to work you need something like =.[.TZkK (fill the missing columns with empty strings) instead of =.TZ.
Jakube

And try to not confuse yourself with Pyth. In your code you have two multiple variable that point to the same values (like K and @Q1). It was quite hard to track which variable is which value, ... And don't just copy the code. Keep it simple. The boolean trick =Y... may be a good idea for Python, but a simple I (if) would be much more readable (and also shorter).
Jakube

Here's a really simple solution using mbomb007's code: Link It takes n on the first line (this way we don't have to assign the value to an extra variable, we can simply use Q). And w and h on the second line, which get immediately assigned to G and H with AE.
Jakube

1

Stax, 27 bytes

é!L↑?∞S░♠╔)¥¼/ÿµ◄÷│♦╫Δò6√√╣

Run and debug it

It takes input on one line in the for {N} {H} {W}.

This program starts with a grid of spaces of the specified size. For each number from N .. 1, it attempts to do a single string replacement from a string of spaces of the appropriate size to the formatted number. If no replacement can be performed, then it tries again with a transposed grid.

z)A+*   create "grid" of spaces and newlines of specified size
,Rr     create range [n ... 1]
F       for each number execute the indented section; it will fit the value into the grid
  $%z(  make a string out of spaces the same length as the number; e.g. 245 => "   "
  Y     store the space string in register Y; this will be used as a search substring
  [#    count the number of occurrences of y in the grid; the grid is still on the stack
  X     store the count in register X; this will be used as a condition
  G     jump to routine at closing curly brace
  y_$|e replace the first instance of y (the spaces) with the current number
  xG    push x; then jump to routine at closing curly brace
        end program
}       called routine jump target
C       pop top of stack; if it's truthy terminate routine
|jM|J   split on newlines; transpose; join with newlines

Run this one

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.