Lego parçası yazdırma


48

Bu meydan okuma basit bir . Bir Lego parçasının yüksekliğini ve genişliğini tanımlayan iki girdi göz önüne alındığında, bir ASCII sanat temsilini bastırdınız.

Lego parçalarının nasıl görünmesi gerektiği:

(4, 2)

___________
| o o o o |
| o o o o |
-----------

(8, 2)

___________________
| o o o o o o o o |
| o o o o o o o o |
-------------------

(4, 4)

___________
| o o o o |
| o o o o |
| o o o o |
| o o o o |
-----------

(3, 2)

_________
| o o o |
| o o o |
---------

(1, 1)

o

Test durumlarından söyleyemezseniz, üst ve alt width*2+3alt çizgiler ve çizgilerdir ve her satırda yanlar için borular vardır o, küçük şeyler için olanlar ve her şey boşluklarla ayrılmıştır.

Bunun tek istisnası (1, 1), sadece bir tek o.

Hiçbir 0boyut için asla elde edemezsin.

Bu , bayt cinsinden en kısa kod kazanır!


2
Genişlik veya yüksekliğin 10'dan büyük olması mümkün mü? Hangi aralığı desteklemeliyiz?
DJMcMayhem

29
Özel durum gerçek bir serseri.
Conor O'Brien

47
Önümüzdeki birkaç yıl içinde, bir 3D yazıcıya bir Lego üretmesini söylemek için kod yazmayı gerektiren başka bir "Lego parçası yazdır" mücadelesi görmek istiyorum.
Kevin - Monica

8
"Diliniz hangi tamsayı aralığını desteklerse" bekleyin. LEGO böyle işlemiyor. Tuğlalar sadece çok özel boyutlarda bir avuç içinde bulunur. Tabak ekleseniz bile, sadece birkaç tane daha kazanırsınız. (1,7) veya (5,3) gibi girişleri atmayan tüm komut dosyaları tamamen çöptür.
RegDwight

3
Tek parçada (1,1) neden taraf yoktur? Bir küpün üstünde tek bir meme başı olan gerçek bir Lego parçası var.
tcrosley

Yanıtlar:


53

Befunge , 165 227 bayt

&::&*:1` v
v+3*2:\/\_"o",@
v       _$ v<
>"_",1-:^  2
v:,,"| ",*5<
v         _v
>" o",,1-:^$
>*v>\     #\^
5 #|:-1,"|"<
^2$<
v1, *95<
- >2*3+^
>:    #^_@

Daha önce olduğu kadar boşluk değil, yine de boşluklar var. İlke, önceki çözümde olduğu gibidir, ancak düzen farklıdır. Bu sefer, her iki sayının 1 olup olmadığını kontrol etmek için sadece ürünlerini alıyorum ve sonucun 1'den büyük olup olmadığını görüyorum.


Eski çözüm (227 bayt)

v           v       <
&   >>\:2*3+>"_",1-:|
>&:1`|v ,,"| ",*52:$<   :\<
    #\v         <
     :>" o",,1-:|
     1          >"|",$\1-:|
    \`            @       $
    ^_"o",@>:!    |       2
           ^-1,*95<+3*2,*5<

Daha fazla golf oynamak mümkün olabilir. Sadece tüm o boşluklara bak!

İşte benim MSPaint resim formunda bir açıklamada benim zayıf girişim: Befunge nasıl Kod ok yönünde akar.


2
ah. benim. Tanrı. Aklımı
darbeler

25

V , 43, 40, 38 36 bayt

Yazdığım en uzun V cevaplardan biri ...

Àio ddÀPñóo î½o
u2Pí.«/| °|
Vr-HVr_

Çevrimiçi deneyin!

Bu unicode ve yazdırılamayan karakterler içerdiğinden, geri dönüşümlü bir hexdump:

0000000: c069 6f20 1b64 64c0 50f1 f36f 20ee bd6f  .io .dd.P..o ..o
0000010: 0d0a 7532 50ed 2eab 2f7c 20b0 7c0d 0a56  ..u2P.../| .|..V
0000020: 722d 4856 725f                           r-HVr_

Bu zorluk, metni manipüle etmektir, V için mükemmel! Öte yandan, V şartlı ve matematikte korkunç, bu yüzden (1, 1) için farklı çıktı gerçekten batırdı ... :(

Açıklama:

À                   "Arg1 times:
 io <esc>           "Insert 'o '
         dd         "Delete this line, and
           À        "Arg2 times:
            P       "Paste it

Şimdi aralarında boşluk olan 'He' satırları var.

ñ                   "Wrap all of the next lines in a macro. This makes it so that if any 
                    "Search fails, execution will stop (to handle for the [1, 1] case)
 ó                  "Search and replace
  o î½o             "'o'+space+0 or 1 newlines+another 'o'

u                   "Undo this last search/replace
 2P                 "Paste twice
   í                "Search and replace on every line
    .«/| °|         "A compressed regex. This surrounds every non-empty line with bars.

Vr-                 "Replace the current (last) line with '-'
   H                "Move to line one
    Vr_             "Replace this line with '_'

Rekabet etmeyen sürüm (31 bayt):

Çevrimiçi deneyin!

Bu sürüm daha yeni olan birkaç özellik kullanır, daha sonra bu zorluk 5 byte daha kısadır!

İkinci açıklama:

ddÀP

"Satırı sil ve n kere yapıştır " seçeneği ÀÄolan "Bu satırı n kere tekrarla" komutunun yerine kullanılır . (-2 bayt)

óo î½o
u

"Bu regex'in ilk eşleşmesini değiştir; Geri Al" ile değiştirildi

/o î½o

Hangi sadece "Bu regex'in bir eşleşmesini ara" (-1 bayt)

Ve son olarak, her ikisi de "Bu satırdaki her karakteri" x "ile değiştir" anlamına gelen Òbasit bir eşanlamlı Vr. (-2 bayt)



2
@meepl Gerçekten hiçbir fikrim yok. 50x959'da çalışır ancak genişliği veya yüksekliği arttırırsanız çalışmayı durdurur. Büyük olasılıkla çok büyük programların çalıştırılmasını önlemek için kasıtlı olarak web sitesine yerleştirilmiş bir kısıtlama olduğunu tahmin ediyorum.
DJMcMayhem

1
TIO , ön uç tarayıcınızın çökmesini önlemek için çıktıyı 100 KB ile sınırlar .
Dennis,

22

32 16 bit küçük endian x86 makine kodu, 57 54 51 bayt

@Ninjalj sayesinde 3 bayt daha az.

Kodu yoğun bir şekilde yeniden yazdım ve başka bir 3 baytı tıraş etmeyi başardık

Altıgen içinde

FCBA6F208D48FFE20492AAEB2389D941D1E14151B05FF3AAEB0BB87C20AB89D992F3AB92AAB00AAA4E7DEF59B02DF3AA91AAC3

Giriş: BX = genişlik, SI = yükseklik, DI sonucu "\ n" ile ayrılmış çizgilerle NULL sonlandırılmış bir dize olarak alan arabelleğe işaret eder

demontaj:

fc            cld
ba 6f 20      mov    dx,0x206f      ;Storing ' o' in DX for later use
8d 48 ff      lea    cx,[bx+si-0x1] ;CX=width+height-1
e2 04         loop   _main0         ;--CX & brahch if not zero
92            xchg   dx,ax          ;(1,1) case, swap DX & AX
aa            stosb                 ;AL == 'o', CX == 0
eb 23         jmp    _end
_main0:
89 d9         mov    cx,bx
41            inc    cx
d1 e1         shl    cx,1
41            inc    cx           ;Calculate (width+1)*2+1
51            push   cx           ;and save it for future use
b0 5f         mov    al,0x5f      ;'_'
f3 aa         rep    stosb        ;Output the whole line of them
eb 0b         jmp    _loopstart   ;Jump into the loop
_loop:
b8 7c 20      mov    ax,0x207c    ;' |'
ab            stosw               ;Output it once (left bar + space)
89 d9         mov    cx,bx        ;Copy width
92            xchg   dx,ax        ;AX == ' o'
f3 ab         rep    stosw        ;Output it CX times
92            xchg   dx,ax        ;Swap values back, AL == '|'
aa            stosb               ;Output only the right bar
_loopstart:
b0 0a         mov    al,0x0a      ;Newline. Can be replaced with mov ax,0x0a0d for windows newline
aa            stosb               ;convention (at the cost of 1 byte), with stosb replaced with stosw
4e            dec    si           ;Height--
7d ef         jge    _loop        ;Continue if si >= 0 (this accounts for the dummy first pass)
59            pop    cx
b0 2d         mov    al,0x2d      ;'-'
f3 aa         rep    stosb        ;Output bottom line
_end:
91            xchg   cx,ax        ;CX == 0, so swap to get zero in AL
aa            stosb               ;NULL-terminate output
c3            retn

16 bit olarak daha kısa olurdu: 3 66 saat öneki için -3 bayt, "\ r \ n" satır sonlandırması için +1 bayt.
ninjalj

Okunabilmesi için, bayt sayınıza çarpı işaretli sayılarla geçerli sayılar arasına boşluk bırakmalısınız.
Value Ink,

20

Python 2, 75 73 72 bayt

lambda x,y:(x*'__'+'___\n'+('| '+'o '*x+'|\n')*y+'-'*(x*2+3),'o')[x<2>y]

1,1 bloğu işlemek için koşullu bir dize döndürür.

İki bayt için Lynn ve Chepner'e teşekkürler


lambda x,y:('_'*x*2+'___\n'+Vb bayt kaydeder.
Lynn

1
x*'__'Bunun yerine başka bir baytı devirin 2*x*'_'.
chepner

Sormak için üzgünüm, bu Topluluk'a katıl. Çalıştığını nasıl görebilirim? terminale yapıştırıyorum ve yazdırıyor <function <lambda> at 0x......>. Bunu nasıl test edebilirim?
Miguel,

1
@ Miguel, bir değişkene atayın. Bu fonksiyonun değerini döndürür:f=lambda x:x+1; print(f(9))
atlasologist

Cevap vermek zor olmasa bir soru daha. Bitleri bu kadar kesin bir şekilde nasıl takip edebilirsiniz?
Miguel,

13

CJam, 34

'_q~'o*"||"\*S*f*f+'-f+zN*_,H='o@?

Çevrimiçi deneyin

Açıklama:

'_        push a '_' character
q~        read and evaluate the input (height and width)
'o*       repeat the 'o' character <width> times
"||"\*    join the "||" string by the string of o's (putting them in between)
S*        join with spaces (inserting a space between every 2 characters)
f*        repeat each character <height> times, making it a separate string
f+        prepend '_' to each string
'-f+      append '-' to each string
z         transpose the array of strings
N*        join with newlines; lego piece is ready, special case to follow
_,        duplicate the string and get its length
H=        compare with H=17
'o        push 'o' for the true case
@         bring the lego piece to the top for the false case
?         if the length was 17, use 'o' else use the lego piece

11

Ruby, 59 56 bayt

Anonim işlev, çok satırlı bir dize döndürür. Çevrimiçi deneyin!

@ El'endiaStarman'dan bir oyun ödünç aldığın için -3 bayt

->w,h{w*h<2??o:?_*(x=2*w+3)+$/+(?|+' o'*w+" |
")*h+?-*x}

11

Java, 318 312 297 294 260 258 bayt

Cliffot sayesinde 15 bayt kurtarıldı !

interface a{static void main(String[]A){int b=Byte.valueOf(A[0]),B=Byte.valueOf(A[1]),C=3+b*2;String c="";if(b<2&B<2)c="o";else{for(;C-->0;)c+="_";for(;B-->0;){c+="\n|";for(C=b;C-->0;)c+=" o";c+=" |";}c+="\n";for(C=3+b*2;C-->0;)c+="-";}System.out.print(c);}}

Komut satırı argümanları ile çalışır.

Ungolfed İnsan tarafından okunabilir bir biçimde:

interface a {
    static void main(String[] A) {
        int b = Byte.valueOf(A[0]),
            B = Byte.valueOf(A[1]),
            C = 3 + b*2;
        String c = "";
        if (b < 2 & B < 2)
            c = "o";
        else {
            for (; C-- > 0;)
                c += "_";
            for (; B-- > 0;) {
                c += "\n|";
                for (C = b; C-- >0;)
                    c += " o";
                c += " |";
            }
            c += "\n";
            for(C = 3 + b*2; C-- >0;)
                c += "-";
        }
        System.out.print(c);
    }
}

Evet, program kurulduysa bile neler olduğunu anlamak hala zor. İşte adım adım açıklama:

static void main(String[] A)

İlk iki komut satırı argümanı - boyutları elde etmek için kullanacağımız - programda A[0]ve A[1]sırasıyla kullanılabilir.

int b = Byte.valueOf(A[0]),
    B = Byte.valueOf(A[1]),
    C = 3 + b*2;
String c = "";

bsütun Bsayısıdır, satır sayısıdır ve döngülerde Ckullanım için ayrılmış bir değişkendir for.

cLego parçası. Buna satır ekleriz ve sonunda yazdırırız.

if (b < 2 & B < 2)
    c = "o";
else {

Basılacak parça 1x1 ise, hem b(sütun sayısı) ve Bbiz sadece set Yani (satır sayısı) daha küçük 2 olması gereklidir ctek için ove sonra atlamak için açıklamada System.out.printeğer olay buysa parça bu.

for (; C-- > 0; C)
    c += "_";

Burada, (integerValueOfA[0] * 2) + 3altını çizeriz c. Bu, tüm deliklerin üstündeki en üst sıradır.

for (; B > 0; B--) {
    c += "\n|";
    for(C = b; C-- > 0;)
        c+=" o";
    c += " |";
}

Bu, parçayı her seferinde bir satır yaptığımız döngüdür. İçeride neler olup bittiğini örnek olmadan açıklamak mümkün değil. Diyelim ki parça 4x4:

Before entering the loop, c looks like this:
___________

After the first iteration (\n denotes a line feed):
___________\n
| o o o o |

After the second iteration:
___________\n
| o o o o |\n
| o o o o |

After the third iteration:
___________\n
| o o o o |\n
| o o o o |\n
| o o o o |

.

c += "\n";
for (C = 3 + b*2; C-- > 0;)
    c += "-";

Burada, (integerValueOfA[0] * 2) + 3parçaya tire ekleriz. Bu, tüm deliklerin altındaki en alttaki sıradır.

forParçanın gerçekte inşa edildiği döngüyü açıklamak için kullandığım 4x4 parçası şuna benziyor:

___________\n
| o o o o |\n
| o o o o |\n
| o o o o |\n
| o o o o |\n
-----------
System.out.print(c);

Ve sonunda, parçayı basıyoruz!


Muhtemelen Revizyon 3 bunu, Stack Exchange'de yaptığım en uzun mesaj yaptı.
dorukayhan

2
CDeğişkeni fordöngülerden taşıyabilirsiniz int b=Byte.valueOf(A[0]),B=Byte.valueOf(A[1]),C. Tüm sizin döngülerinizde aynı zamanda C-->0;çekleri kullanabileceğiniz gibi görünüyor , bunu 298 yapar, pastebin.com/uj42JueL
cliffroot

1
bazı forbaytlar için döngülerin bazı yaratıcı kullanımları kaydedildi - pastebin.com/dhNCpi6n
cliffroot

1
önce argümanlarınızı if(b==1&B==1)baytlara
çevirirseniz, çekiniz

ayrıca bunun yerine 1x1 durumu için, başka bir bloğa farklı tuğlalar için mantık System.out.print('o');return;koyabilir c='o've yerleştirebilirsiniz. daha sonra tekli baskı ifadesi olması ve geri dönüşü olmaması, bazı ek baytları kaydetmenize izin verir
user902383

9

Minkolang 0.15 , 58 57 56 bayt

Evet bu doğru. Bir iki kokuşmuş küçük bayttan kurtuldum ...

nn$d*1-5&"o"O.rd2*3+$z1$([" o"]" ||"2Rlkr$Dlz["-_"0G]$O.

Burada dene!

açıklama

nn                Take two numbers from input (stack is now [w h])

                  C special case C
  $d              Duplicate stack
    *1-           Multiply and subtract 1
       5&         Jump 5 spaces if truthy
         "o"O.    Top of stack was 1*1-1=0, so output "o" and stop.

                     C precalculates width of top and bottom lines for later use C
         r           Reverse stack (now [h w])
          d          Duplicate top of stack
           2*3+      Multiply top of stack by 2 and add 3
               $z    Pop this and store in register (z = 2*w+3)

                                       C generates the row C
                 1$(                   Open while loop prepopulated with top of stack
                    [" o"]             w times, push "o "
                          " ||"        Push "|| "
                               2R      Rotate twice to the right
                                 l     Push newline (10)
                                  k    Break out of while loop

                                           C duplicates the row h times C
                                   r       Reverse stack
                                    $D     Duplicate whole stack h times
                                      l    Push newline

                     C this is for the top and bottom lines C
        z[           Open for loop that repeats z times
          "-_"       Push "_-"
              0G     Relocate top of stack to bottom of stack
                ]    Close for loop

                 $O.    Output whole stack as characters and stop.

Tamam, bu kaydedilen iki bayt için iki önemli açıklama. Bundan daha fazla bir şey yapabileceğimi veya golf oynayabileceğimi sanmıyorum. : P


3
İlk bayt en zor adımdır ... 1000 baytın başlangıcı tek bir bitle başlar ...
Conor O'Brien

8

brainfuck, 391 bayt

Bunun daha çok golf oynayabileceğini biliyorum, ama bu noktada işe yaradığı için mutluyum. Golf oynamak için çalışmaya devam edeceğim.

+++++[-<+++[-<+++<++++++<+++++++<++<++++++++>>>>>]<<+<+<<+<++>>>>>>>]<<<<+<++<->>>>>>,<,>>++++++[<--------<-------->>-]<<->>+<<[>>-<<[>>>+<<<-]]>>>[<<<+>>>-]<[<->>>+<<<[>>>-<<<[>>>>+<<<<-]]>>>>[<<<<+>>>>-]<[<<<<<<<.[-].]<<<+>-]<<+>[->++>+<<]>+++[-<<<<.>>>>]>[-<<+>>]<<<<<<<<<.>>>>>>><[->[->+>+<<]<<<<<<.>>>>>>>[<<<<<<.>.>>>>>-]>[-<<+>>]<<<<<<<.<.<.>>>>>>]>[->++>+<<]>+++[-<<<.>>>]>[-<<+>>]<<

Girişin sadece iki basamak olarak verilmesi gerekir. Gibi, yapmak (8, 2)için sadece girecekti 82.

Çevrimiçi deneyin!

Yıkmak:

İlk önce gerekli karakterleri kasete koyun: (newline)| o_-

+++++[-<+++[-<+++<++++++<+++++++<++<++++++++>>>>>]<<+<+<<+<++>>>>>>>]<<<<+<++<->>>>>

Sonra girişi iki hücreye toplayın ve her birinden 48 çıkartın (sayısal karakteri değil sayısal değeri almak için)

>,<,>>++++++[<--------<-------->>-]<<

Daha sonra, özel durum için kontrol edin (1, 1)(yalnızca bu kontrolün kodun 109 baytını oluşturduğunu unutmayın). Sanki ifbeyin fırtınasında yapacak kadar zor olmasa, iç içe geçmiş bir durumumuz var if:

->>+<<[>>-<<[>>>+<<<-]]>>>[<<<+>>>-]<[<->>>+<<<[>>>-<<<[>>>>+<<<<-]]>>>>[<<<<+>>>>-]<[<<<<<<<.[-].]<<<+>-]<<+

Aşağıdaki, x hücresinin sıfır olup olmadığını kontrol eden yapıdır:

temp0[-]+
temp1[-]
x[
 code1
 temp0-
 x[temp1+x-]
]
temp1[x+temp1-]
temp0[
 code2
temp0-]

Ancak bir yuvada if4 geçici hücreye sahip olmamız gerekiyor.

Şimdi gerçek karakter basımına geçiyoruz:

Üst çubuğu ve yeni satırı yazdır:

>[->++>+<<]>+++[-<<<<.>>>>]>[-<<+>>]<<<<<<<<<.>>>>>>>

Yüksekliğe eşit sayıda, bir satır , bir başka satır ve bir yeni |satır yazdırın :o|

<[->[->+>+<<]<<<<<<.>>>>>>>[<<<<<<.>.>>>>>-]>[-<<+>>]<<<<<<<.<.<.>>>>>>] 

Ve alttaki çubuğu yazdırın (burada yeni satır gerekmez):

>[->++>+<<]>+++[-<<<.>>>]>[-<<+>>]<<

7

Retina , 52 bayt

Bayt sayısı, ISO 8859-1 kodlamasını varsayar. Altıncı çizginin tek bir boşluk içermesi gerektiğini unutmayın.

\G1?
$_¶
1* 



.+
|$&|
\G.
_
r`.\G
-
s`^.{17}$|1
o

Çevrimiçi deneyin!

Girdi, 1unary hanesi, ayırıcı olarak boşluk ve yükseklikten sonra genişlik kullanılarak aynı şekildedir.

açıklama

Bu programdaki tüm aşamalar, zaman zaman düzenli bir regex değiştiricisi olan (tekrarlama veya döngü yok, başka aşama türleri yok) yapılan, çıplak ikamelerdir. Satır yemleri için kullanılan diğer isimler dışında, Retina'ya özgü ikame özelliklerini bile kullanmaz .

\G1?
$_¶

Bunun amacı iki girişi "çarpmak" tır. Amacımız yaratmaktır h+2satırları w 1(her bir s h+2biz içine üst ve alt açabilirsiniz böylece _ve -sonrası). \GÇapa sonuncusu kaldığı yerden başlatmak için eşleşme gerektirir. Diğer bir deyişle, dizedeki bir karakterle eşleşmediğinde, başka karakterler de eşleşmeyecektir. Biz sadece maç için kullanabilir 1içinde s hdeğil de wregex ayırır onları eşleştirilecek bu alanı izin vermediğinden. Bununla birlikte, 1isteğe bağlı olarak da yaptık , böylece sonunda boş bir eşleşme elde ederiz h. Bu h+1eşleşir. Bunların her biri girişin tamamı ( $_) ile değiştirilir, ardından satır beslenir.wKendisi dokunulmadan kalıyor, bu da bize h+2nd kopyasını veriyor . Girdilerin olduğunu söyle, 11 1111şimdi elimizde:

11 1111
11 1111
11 1111
 1111

Bu oldukça iyi. Fazladan bir kaç şeyimiz var, ama h+2kopyaları worada.

1* 

İlk satırın sonunda bir boşluk olduğuna dikkat edin. Bu, bu önekleri satırlardan kaldırır, böylelikle sadece ws 'lerden sonra sahip oluruz .



Pekala, bu SE'nin biçimlendirmesiyle gerçekten işe yaramaz ... ilk satır boş ve ikinci satır tek bir boşluk içermeli. Bu, boşlukları mümkün olan her konuma, yani her çizginin başında ve sonunda ve her çift çifti arasında yerleştirir 1:

 1 1 1 1 
 1 1 1 1 
 1 1 1 1 
 1 1 1 1 

Bunları osonraya çevireceğiz.

.+
|$&|

Bu sadece her satırı bir çift halinde sarar |:

| 1 1 1 1 |
| 1 1 1 1 |
| 1 1 1 1 |
| 1 1 1 1 |

Şimdi üst ve alt ile ilgileniyoruz:

\G.
_

\GTekrar parlama zamanı . Bu ilk satırda her karakterle eşleşir ve bir haline döner _.

r`.\G
-

Aynı şey, ancak rdeğiştirici nedeniyle (sağdan sola modu), bu, son satırdaki karakterlerle eşleşir ve onları dönüştürür -. Şimdi elimizde:

___________
| 1 1 1 1 |
| 1 1 1 1 |
-----------

Orada şimdi yapmak için sol sadece iki şey var: O çevirmek 1içine os ve giriş olsaydı 1 1o zaman içine tüm şey çevirmek oyerine. Her ikisini de tek aşamalı olarak ele alabiliriz:

s`^.{17}$|1
o

snormal singleline modudur (yani .eşleşen satır beslemelerini yapar ). Girdi 1 1sonuçsa en az 17 karakter olacak ve böylece eşleştirip ^.{17}$değiştirebiliriz o. Aksi takdirde, bu başarısız olursa, tüm s'lerle eşleşir 1ve obunun yerine bunları değiştiririz .


7

Jolf, 36 bayt

?w*jJρΡ,a+3ώj+2J'-"-+"d*'_lH"  ' o'o
?w*jJ                             'o   return "o" if j * J - 1
       ,a                              make a box
         +3ώj                           of width +3ώj = 3+2*j
             +2J                        of height +2J = 2+J
                '-                      specifying corners as "-"
      Ρ           "-+"                 replacing the first run of "-"s
                      d*'_lH            with a run of "_"s of equal length
     ρ                      "  '       replacing all "  "
                               ' o      with " o"

Jolf, 24 bayt, rekabetçi olmayan

Ben daha iyi bir kutu yerleşik yaptım.

?w*jJ,AhώjJ"_-'_-'|' o'o

Jolf, 38 37 bayt

?w*jJΆ+*'_γ+3ώjS*JΆ'|*j" o' |
"*'-γ'o

Basit şeyler, gerçekten. Her iki argüman 1 olduğunda ve (aksi halde bizim için falsey olduğunda) (matematik zeta veya stand sapma) sadece 0 olduğunu belirterek bir bayt kaydedildi .


6

05AB1E , 33 bayt

Kod:

*i'oë¹·3+©'_׶²F'|„ o¹×„ |¶}®'-×J

Açıklama:

*i'o                               # If both input equal 1, push "o"
    ë                              # Else, do...
     ¹·3+                          # Push input_1 × 2 + 3
         ©                         # Copy this number to the register
          '_×                      # Multiply by "_"
             ¶                     # Push a newline character
              ²F           }       # Do the following input_2 times:
                '|                 # Push "|"
                  „ o              # Push " o"
                     ¹×            # Multiply this by input_1
                       „ |         # Push " |"
                          ¶        # Push a newline character
                            ®      # Retrieve the value from the register
                             '-×   # Multiply by "-"
                                J  # Join everything and implicitly print.

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin! .


6

JavaScript (ES6), 89 86 bayt

(x,y,g=c=>c[r=`repeat`](x*2+3))=>x*y-1?g(`_`)+`
`+`| ${`o `[r](x)}|
`[r](y)+g(`-`):`o`

Düzenleme: @Shaggy sayesinde 3 bayt kaydedildi.


Takma ad vererek 3 bayt tasarruf edin repeat.
Shaggy

5

Python 2, 71 bayt

lambda x,y:('o',x*'__'+'___\n'+'| %s|\n'%('o '*x)*y+'-'*(x*2+3))[x+y>2]

1
PPCG'ye Hoşgeldiniz! Güzel ilk mesaj!
Rɪᴋᴇʀ

5

Befunge, 144 Bayt

Ben yorumlaması için tercih ederdi bu yazı ama benzer bir şekilde çalışır, hangi kendime ait bir cevap atıyorum yüzden, henüz üne yok, ama biraz daha kompakt

&::&*:1`v
v3*2:\/\_"o",@
>+:  v   >52*," |",, v
>,1-:vLEG O MAKERv::\<
^"_" _$\:|<v "o "_v
v52:+3*2$<,>,,1-:^$
>*,v <    ^"|":-1\<
v-1_@,
>:"-"^

kodu burada test edebilirsiniz


4

Reng v.4, 82 bayt, rekabetçi olmayan

İşlevlerin kendilerinin üzerine yazılmasını düzelten bir hata düzeltmesi yaptım (lütfen sorma; eşyalarım perili)

i#wi#hhw+2e1+ø ~*x}o:{"-"ö<
"_"{:o}w2*3+#xx*2ø
"o"o~
ö"|"o"o"{Wo:o}w*"| "ooh1-?^#h

Girdiyi boşlukla birleştirilen sayılar gibi alır 4 2. Burada dene!


8
I pushed a bug fix that fixes functions being overwritten by themselves... Evet, bu ilginç bir hata oldu
MKII

4

PowerShell v2 +, 76 bayt

param($x,$y)if($x+$y-2){"_"*($z=$x*2+3);"|$(" o"*$x) |`n"*$y+'-'*$z;exit}"o"

Girdi alır, sonra bir ififadeyi kontrol eder . PowerShell'de sıfır olmayan değerler, en az biri kadar eşit olduğu ve eşit olmadığı sürece truthy olduğu için , doğru olacaktır.$x$y1if

İçinde ifbir dizi dize çarpımı var. İlk önce, alt çizgi dizimizi oluşturduk, $zsonradan tasarruf ediyoruz . Boru hattına yerleştirilir. Daha sonra, kenar ve mandal dizimizi (mandalla çarparak $x), yapılan $ysüreyi ve bunu çizgi süremizle birleştiriyoruz $z. Bu ip daha sonra boru hattına yerleştirilir ve biz exit. Boru hattı temizlendi ve baskı işlemi çok açık. .ToString()Dizi çıktısı için varsayılan ayırıcı olduğundan `n(ve bir dizi dizisi çıkardığımızda) alt çizgi ve ilk mandal sırası arasındaki newline'ı ücretsiz aldığımızı unutmayın.

Eğer ifyanlışsa, özel 1 1durumdayız, bu yüzden "o"tekrar basmakla, sadece boru hattına koyup çıktık .

Örnekler

PS C:\Tools\Scripts\golfing> .\print-a-lego-piece.ps1 1 1
o

PS C:\Tools\Scripts\golfing> .\print-a-lego-piece.ps1 5 3
_____________
| o o o o o |
| o o o o o |
| o o o o o |
-------------

4

Bash, 186 , 163 , 156 , 148 , 131 , 130 Bayt

 ## Arg1 - Lego width
 ## Arg2 - Lego height 
function print_lego() { 
(($1+$2>2))&&{
printf _%.0s `seq -1 $1`
echo
for((i=$2;i--;)){ 
 printf \|
 for((j=$1;j--;)){
  printf o
 }
 echo \| 
}
printf =%.0s `seq -1 $1`
echo 
}||echo o
}

Not: Son satır için kısa çizgi koymak için lego'ya gerçekten ihtiyacınız varsa, son printf değerini değiştirin.

printf -- -%.0s `seq -1 $1`

ve iki bayt ekleyin.


2
Bir işleve sarılmamışsa bu biraz daha kısa olmaz mıydı? Ayrıca, bash konusunda uzman değilim ama biraz fazladan boşluk var gibi görünüyor.
DJMcMayhem

Tek bir astar olarak ~ 170 olabilir:(($x+$y==2))&&echo o||{ printf _%.0s $(seq -1 $x);echo;for((i=0;i<$y;i++));do printf \|;for((j=0;j<$x;j++));do printf o;done;echo \|;done;printf =%.0s $(seq -1 $x);echo;}

1
Eğer kullanırsanız (), anahtar kelimeyi gerekmez functionişlev bildirimi için. Alternatif vardır forparantez kullanılarak sözdizimi, örneğin: for((j=$1;j--;));{ printf o;}. Önceki örnekte gösterildiği gibi, bazı forifadeleri ikinci ifadesinde azaltarak ve test ederek kaydedebilirsiniz . Bunun yerine backticks kullanabilirsiniz $(cmd).
ninjalj

@ ninjalj Teşekkürler, golf kodlaması yeniyim - başka ~ 17 byte sıkar, bir-liner şuan 152:(($x+$y==2))&&echo o||{ printf _%.0s `seq -1 $x`;echo;for((i=$y;i--;)){ printf \|;for((j=$x;j--;)){ printf o;};echo \|;};printf =%.0s `seq -1 $x`;echo;}

Eğer değiştirerek daha birkaç byte tıraş böylece Dolar işaretleri, aritmetik bağlamda isteğe bağlıdır (($something))etmek ((something))boyunca. ( $1Hala sabitin onu belirsizliği giderecek dolar işareti ihtiyacı 1.)
tripleee

4

Perl 5 - 84 77 bayt

84 Bayt

sub l{($x,$y)=@_;$w=3+2*$x;warn$x*$y<2?"o":'_'x$w.$/.('| '.'o 'x$x."|\n")x$y.'-'x$w}

77 Bayt. Dom Hastings’ten biraz yardım alarak

sub l{($x,$y)=@_;$x*$y<2?o:'_'x($w=3+2*$x).('
| '.'o 'x$x."|")x$y.$/.'-'x$w}

İlk önce neden warnbir golf programında kullanma çabalarına girmeye çalıştığı konusunda kafam karıştı , ama sonra onu kullandığınızdan daha kısa olduğu için anladım print. Güzel!
pipe,

Evet, Perl 6’da uyarmak yerine söyleyerek başka bir bayt çıkarabilirim
Kaundur,

1
Bunu Perl 5'te de yapabilirsiniz, sadece varsayılan olarak etkin değildir. Tüm uzantılara izin vermek -Eyerine komut satırını komut satırından arayarak kod-golf içerisinde dolaşabileceğinizi düşünüyorum -e. Bu yer için yeni olduğum için puanları nasıl hesaplayacağımı tam olarak nerede belirttiğimi bilmiyorum.
pipe,

Gerçekten, bunu bilmiyordum. Ben de burada yeniyim, bu yüzden de emin değilim
Kaundur

Sana (size 4 bayt tasarruf JS cevaba bakınız ben dize dönen kabul edilebilir olduğuna inanıyorum bir işlevi kullanıyorsanız, ... 76 bayt bu kısaltmak düşünüyorum warn, sen etrafında tırnak gerekmez) "o"(yapabilirsiniz başka bir -2 için bir korkuluk kullanın, eğer hesaplamanızı satır içi $wyaparsanız başka bir bayt kaydetmelisiniz ( '_'x($w=3+2*$x)vs. $w=3+2*$x;... '_'x$w) ve son olarak, \ndeğişmez bir satırsonunu değiştirebilirsiniz. Umarım yardımcı olur!
Dom Hastings,

3

C, 202 191 bayt

#define p printf
i,w,h;t(char*c){for(i=0;p(c),++i<w*2+3;);p("\n");}f(){t("_");for(i=0;i<w*h;)i%w<1?p("| o "):p("o "),i++%w>w-2&&p("|\n");t("-");}main(){scanf("%d %d",&w,&h);w*h<2?p("o"):f();}

11 byte tasarruf için @Lince Assassino için teşekkürler !

Ungolfed:

#include <stdio.h>
#define p printf

int i, w, h;

void t(char *c)
{
    for(i=0; p(c), ++i<w*2+3;);
    p("\n");
}

void f()
{
    t("_");
    for(i=0; i<w*h;)
    {
        i%w<1 ? p("| o ") : p("o ");
        i++%w>w-2 && p("|\n");
    }
    t("-");
}

int main()
{
    scanf("%d %d", &w, &h);
    w*h<2 ? p("o") : f();
}

1
İlk hattınızı değiştirebilirsinizp(char*A){printf(A);}
Lince Assassino

1
Gerçekten teşekkür ederim! Ama daha kısa yapmak mümkün#define p printf
Marco

3

Tarçınlı Sakız, 32 bayt

0000000: 6c07 d5f5 7a5d 9cdf 5ae6 52ae 4050 0c35  l...z]..Z.R.@P.5
0000010: 18d9 052f 0082 9b42 e7c8 e422 5fe4 7d9f  .../...B..."_.}.

Sigara rakip. Çevrimiçi deneyin. Giriş tam olarak [width,height]virgülle yükseklik arasında boşluk bırakılmamış biçimde olmalıdır .

açıklama

Dize bunun için açar:

l[1,1]&o;?&`p___~__~
%| ~o ~|
%---~--~

İlk laşama eşler [1,1]için o(özel durumda) ve dize her şey

`p___~__~
%| ~o ~|
%---~--~

Geri dönüş tuşu daha sonra ikinci bir aşamanın başlangıcını işaret eder; CG, bu dizgenin çıktısı yerine backtick'i keser ve dizgiyi yürütür. Bu pdurumda tildesin ilk parametre (genişlik) kez içindeki tüm karakterleri tekrar eder ve daha sonra ikinci parametre (yükseklik) kez yüzde işaretlerinin içindeki karakterleri tekrarlar. Yani [4,2]bunun için bu:

___________
%| o o o o |
%-----------

ve sonra:

___________
| o o o o |
| o o o o |
-----------

3

Toplu iş, 172 170 bayt

@echo off
if "%*"=="1 1" echo o&exit/b
set o=
for /l %%i in (1,1,%1)do call set o=%%o%% o
echo ---%o: o=--%
for /l %%i in (1,1,%2)do echo ^|%o% ^|
echo ---%o: o=--%

Düzenleme: @ CᴏɴᴏʀO'Bʀɪᴇɴ @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ sayesinde 2 bayt kaydedildi .

Gecikmeli genişlemenin etkin olduğunu varsayabilirsem 7 bayt tasarruf edebilirim.


%%o%%yerine %o%?
Outgolfer Erik,

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ her seferinde %o%orijinal değerle değiştirilir o, böylece osadece eşit olur " o". %%o%%Bir değişken olarak geçer callve %o%daha sonra mevcut değerini kullanır o.
Neil

Neden yapmıyorsun ... sadece do set o=%o% o?
Outgolfer'lı Erik,

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ döngü ayrıştırılmadan %o%önce genişler for, bu nedenle döngü for /l %i in (1,1,8) do call set o= oaçıkça anlamsız olan okunur .
Neil,

Neden sen yapmıyorsun do set o=%%o%% o(-5)?
Outgolfer Erik,

3

Vim, 56 tuş vuruşlarını

Bu bir metin düzenleme görevi gibi görünüyor, bu yüzden Vim açık bir seçim! İki boşluklu tamsayı içeren bir metin dosyası olarak girdi alıyorum ve cevabı aynı dosyaya verdim. Ayrıca, 1x1 özel kasasına sahip olduğun için senden nefret ediyorum ... Neyse:

"adt l"bDro:if@a*@b==1|wq|en<cr>Di| |<esc>@aio <esc>yy@bPVr_GpVr-ZZ

ve eğer özel durum için olmasaydı, 35

"adt x"bDi| |<esc>@aio <esc>yy@bPVr_GpVr-ZZ

Aklı başında insanlar için bir arıza:

"adt l"bD

Tampondan @a ve b'ye sayıları silin (boşluk char tutuldu)

         ro:if@a*@b==1|wq|en<cr>

Boşluğu "o" ile değiştirin ve eğer özel durum varsa, kaydedin ve çıkın

                                Di| |<esc>

Çizgiyi temizle ve lego bloğunun kenarlarını yaz

                                          @aio <esc>

Bitmiş bir orta kısım elde etmek için @a "bol" yazınız

                                                    yy@bP

Yank line ve @b fazladan kopyalar (biri çok fazla)

                                                         Vr_

Tamponun tepesindeyiz, ekstra çizgiyi alt çizgi ile değiştirin

                                                            Gp

Tamponun altına atla, daha önce çektiğimiz çizgiyi çek

                                                              Vr-ZZ

Çizgileri çizgi ile değiştirin, kaydedin ve çıkın



2

Haskell, 76 bayt

1#1="o"
w#h|f<-w*2+3=f!"_"++'\n':h!('|':w!" o"++" |\n")++f!"-"
n!s=[1..n]>>s

Kullanım örneği: 3 # 23'e 2 tuğla için size çok satırlı bir dize verir.

Ungolfed:

(#) :: Int -> Int -> String
1     #   1    = "o"
width # height = let longWidth = 2 * width + 3 in -- golfed as 'f'
                      (        longWidth `times` "_"  ++   "\n" )
  ++ height   `times` ( "|" ++     width `times` " o" ++ " |\n" )
  ++                  (        longWidth `times` "-"            )

-- | golfed as (!)
times :: Int -> [a] -> [a]
times n s = concat $ replicate n s

İlk bakışta göründüğü gibi görünmesi daha kısa olmalı unlines, ama değil.
ballesta25

2

Büyük, 107 , 98 , 70 , 64

{x,y->t=x*2+3;x<2&&y<2?"o":'_'*t+"\n"+"|${' o'*x} |\n"*y+'-'*t}

Test yapmak:

(2,2)
(1,1)
(8,2)
(1,4)
_______
| o o |
| o o |
-------
o
___________________
| o o o o o o o o |
| o o o o o o o o |
-------------------
_____
| o |
| o |
| o |
| o |
-----

2

Befunge, 114 113 108 101 bayt

Çok sayıda Befunge çözümü olduğunu biliyorum, ancak kodun düzenine farklı bir yaklaşım getirerek geliştirilebileceklerinden oldukça emindim. Bu cevabın daha da golf oynayabileceğinden şüpheleniyorum, ancak daha önceki girişlerden biraz daha küçük.

&::&+:2`^|,+55_"_",^
-4:,,"| "<\_|#:+1\,,"|"+55$_2#$-#$" o",#!,#:<
  ,"-"_@#:-1<
 :*2+2\-_"o",@v!:-1<

Çevrimiçi deneyin!


İpin neden :<|gerekli olduğunu açıklayabilir misiniz ?
Zacharý

@ Zacharı İlk satırdaki dikey dal asla dallanmıyor. Yığının tepesi o noktada daima sıfırdır, bu nedenle yığının tepesini düşürmek ve aynı zamanda dallanmanın kısayoludur - esasen bu uç .
James Holderness,

1

APL, 46 bayt

{⍵≡1 1:'o'⋄'-'⍪⍨'_'⍪'|',' ','|',⍨'o '⍴⍨1 2×⌽⍵}

Muhafız: ⍵≡1 1:'o'özel durum için. Aksi halde 'o '⍴⍨1 2×⌽⍵içeriği oluşturur. Ve gerisi sadece boks.


1

C #, 198 bayt

void f(int x,int y){int l=x*2+3;Console.Write(y==x&&x==1?"o":s("_",l)+"\n"+s("|"+s(" o",x)+" |\n",y)+s("-",l));}string s(string m,int u){return string.Join("",new string[u].Select(n=>m).ToArray());}

hızlı ve kirli

Dizeleri çarpan bir fonksiyon yazmak zorunda kaldım

ungolfed (öneriler için)

public static void f(int x,int y)
{
    int l=x*2+3;
    Console.Write(y == x && x == 1 ? "o" : s("_",l)+"\n"+ s("|" + s(" o", x) + " |\n", y) + s("-",l));

}
public static string s(string m,int u)
{
    return string.Join("", new string[u].Select(n => m).ToArray());
}

S işlevinizin optimize edilebileceğini fark ettim string s(string m,int u){return string.Join("",new int[u].Select(n => m));}- .ToArray () gereksizdir ve [] dizgisi bir int [] de olabilir. Ancak string.Join yerine toplu kullanabilirsiniz:string s(string m, int u){return new int[u].Aggregate("",(t,i)=>t+m);}
Oliver Hallam 19

1
bunun gibi birkaç byte'ı tıraş edebilirsiniz ... (191)void f(int x,int y){Func<char,int,string>s=(c,i)=>new string(c,i);int l=x*2+3;Console.Write((y&x)==1?"o":s('_',l)+"\n"+s('y',y).Replace("y","| "+s('x', x)+"|\n").Replace("x","o ")+s('-',l));}
Matthew Whited

1

Octave, 97 95 86 bayt

@(w,h){[a=~(1:w*2+3)+95;repmat(['| ' repmat('o ',1,w) '|'],h,1);~a+45],'o'}{(w*h<2)+1}

Kullandığım @atlasologist testine Python 'ın yöntemi (1, 1):(...,'o')[x<2>y]

Sayesinde @Luis Mendo : 7 bayt kaydetmek için a=ones(1,w*2+3)*'_'için a=~(1:w*2+3)+95ve a./a*'-'için~a+45

2 byte tasarruf için @pajonk için teşekkürler :f=


1
Bu geçerli bir Matlab kodu değil. Sadece "Octave" olarak etiketlemelisiniz. Ayrıca, yerine a./a*'-'kullanabilirsiniz ~~a*'-'? Veya hatta ~a+45?
Luis Mendo,

Ayrıca, muhtemelen bunu adsız bir işlev olarak bırakabilirsiniz (olmadan f=)
pajonk
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.