Doğru bir üçgen oluşturun


10

Bu meydan okumada, giriş olarak iki sayı (boşlukla ayrılmış) almalı ve xs'den oluşan bir ASCII sağ üçgeni çıkarmalısınız.

İlk sayı, çıkmanız gereken üçgenin genişliği ve yüksekliği olacaktır. İkinci sayı, sağ köşenin hangi köşede olacağı olacaktır. Köşeler sol üst köşeden başlayıp İngilizce okuma sırasına göre 1 ile 4 arasında numaralandırılmıştır:

1    2



3    4

Örneğin (girişler ve ilgili üçgen çıkışlar):

INPUT | 3 1 | 3 2 | 3 3 | 3 4
------+-----+-----+-----+----
 OUT- | xxx | xxx | x   |   x
 PUT  | xx  |  xx | xx  |  xx
      | x   |   x | xxx | xxx

Programınızın çıktısı, ilgili girdileri için bu örneklerle tam olarak eşleşmelidir.

Giriş her zaman geçerli olacaktır: ilk sayı ≥1 tamsayısı ve ikinci sayı 1, 2, 3 veya 4 olacaktır.

Bu ; en kısa kod (karakter sayısında) kazanır.

Yanıtlar:


9

APL (30)

{' x'[1+(⍎⍵⌷'⌽+⍉⊖')≤/¨⍳2⍴⍺]}/⎕

Açıklama:

  • {... }/⎕: giriş üzerinden verilen işlevi azaltın (yani girişte 2 sayı varsa, işlevi sadece bu iki sayıyla çağırır , sol sayı ve sağ sayı olur)
  • ≤/¨⍳2⍴⍺: Bir -by- koordinat matrisi yapın ve X koordinatının Y koordinatından büyük olmadığı konumları bir bit alanı vererek ayarlayın.
  • (⍎⍵⌷'⌽+⍉⊖'): üçgeni sağ tarafa gelecek şekilde koymak için bir dönüştürme işlevi seçin .
  • ' x'[1+... ]: bit alanına bir tane ekleyin ve sonucu dizeye bir dizin olarak kullanın ' x', böylece 0 ve x1 için boşluk bırakın .

1
Ne kadar çok APL okursam, APL'nin ayrıştırma kabusu olduğunu o kadar çok fark ederim. (⍎⍵⌷'functions')Tüm ifadeyi nasıl yorumlayacağına karar vermeden önce parçayı gerçekten değerlendirmek zorunda kalmayacak mıydı ? Örneğin düşünün 1+(⍵⌷'12+')|40. Parantez içindeki bölümü belirtmeden |önce monadik mi yoksa ikili mi olduğunu bile bilemez . Soyut sözdizimi ağacının tamamı değerlendirmeye bağlı olarak değişir.
protist

Demek istediğim 1+(⍎⍵⌷'12+')|40... düzenlememe izin vermeyeceğim.
protist

2
@protist: Eğlenceli gerçek: f ← { [ }hata vermiyor! f 1÷0... bir etki alanı hatası veriyor ! (sıfıra bölme nedeniyle). Sadece sizin gibi fonksiyonu çağırdığınızda sözdizimi hatasıf 123 alırsınız . İşte: imgur.com/jtmdi4B
marinus

Tüm tanrılar tarafından !!!! Bu kalbimi biraz kırıyor. Bazı APL tercümanları yazarak oynuyorum ve bu da mevcut uygulamalarda büyük bir kötülük gösteriyor. hahaha
protist

Neredeyse fonksiyonlar bir çeşit çirkin makro genişleme benzeri süreç tarafından rutin olarak yerine getiriliyor gibi görünüyor. Bir şekilde yerinde metin genişlemesini gösterir.
protist

6

Yakut, 116 115 109 96

Kendi çözümümle başlayacağım.

i=gets.split
s=i[0].to_i
(i[1]<?3?s.downto(1):1..s).map{|x|t=?x*x
puts /2|4/=~i[1]?t.rjust(s):t}

Hemen hemen 30 karakterlik bir GolfScript çözümü ile dövüleceğimi biliyorum: P

Minitech'e 19 karakteri tıraş ettiği için teşekkürler (vay)!


Bunun yerine ==0kullanabilirsiniz <1. ?x*xbaşka bir karakter kaydeder. Ayrıca, puts i[1]%2<1?t.rjust(s):t}hile yapar, değil mi?
Ry-

Hmm… etrafında boşluklar var ?mı? Bu gerekli mi? Ayrıca, bence aynı şeyi r=.
Ry-

@minitech Gerekli - önde gelen alan, aksi takdirde 1?tek bir belirteç olarak ayrıştırılır ve sondaki boşluk, aksi takdirde ?t(eşdeğer 't') olarak ayrıştırılır . Parçanın yeniden yapılandırılmasını nasıl öneriyorsunuz r?
Kapı Tokmağı

Onu denedin mi? Hangi Ruby sürümü altında? 2.0 benim için iyi çalışıyor.
Ry-

@minitech Tuhaf, daha önce işe yaramadı ve şimdi işe yarıyor: P Thanks
Doorknob

4

GolfScript ( 34 33 karakter)

~\:^,{)' x'^*$>^<0(2$?%}%\(2&(%n*

Köşelerin dönüşte numaralandırılmaması bir utançtır, çünkü bu bir dizi oluşturmak ve daha sonra nsüreleri döndürmek için daha zarif bir yaklaşıma izin verir :

~\:^,{)' x'^*$>^<}%{-1%zip}@)*n*

3

C # - 195

using System;class P{static void Main(string[]a){int G=int.Parse(
a[0]),O=int.Parse(a[1]),L=O<3?0:G+1,F=O<3?-G:1;G=O%2>0?-G:G;for(;
F<L;F++)Console.Write("{0,"+G+"}\n","".PadRight(F<0?-F:F,'x'));}}

biçimlendirilmiş:

using System;
class P
{
    static void Main(string[] a)
    {
        int G = int.Parse(a[0]),
            O = int.Parse(a[1]),
            L = O < 3 ? 0 : G + 1,
            F = O < 3 ? -G : 1;

        G = O % 2 > 0 ? -G : G;

        for(; F < L; F++)
            Console.Write("{0," + G + "}\n", "".PadRight(F < 0 ? -F : F, 'x'));
    }
}

resim açıklamasını buraya girin


Girdi, virgülle ayrılmış değil, boşlukla sınırlandırılmalıdır.
Kapı tokmağı

@Doorknob: Ekran görüntüsü, girdiyi virgülle göstermeyi seçtiğim bir test programından. Tüm C # konsol uygulamaları bir dizeler dizisi olarak girdi aldığından nokta tartışma olmasına rağmen, programı çalıştırdığınızda girdi aslında boşlukla sınırlandırılır.
Igby Largeman

2

Golfscript, 39 36 35 karakter

~\:y,{' '*'x'y*+y<0~2$?%}%-1@2>?%n*

canlı demo: http://golfscript.apphb.com/?c=OyczIDInCn5cOnkseycgJyoneCd5Kit5PC0xIDIkPyV9JS0xQDI%2BPyVuKgo%3D

çok kötü istendiği gibi 30 karakter değil


Değiştirme 1${-1%}*ile -1 2$?%ve \2>{-1%}*ile \2>-1\?%size 2 karakter net olacak.
Volatilite

@Volatility teşekkür, dahil
John Dvorak

@Volatility -1 2yazılabilir0~2
Howard

Ve başka bir karakter için biraz daha yeniden yapılandırmamız gerekiyor:~(\:y,{{>'x '=}+y,%0~2$?%}%\2&(%n*
Howard

2

Mathematica 122 (104?)

g@s_ := ({w, p} = ToExpression@StringSplit@s; 
   Array[If[Switch[p, 1, # <= (w + 1 - #2), 2, # <= #2, 3, # >= #2, 4, # > (w - #2)],
   "X", ""] &, {w, w}]) // Grid

GraphicsGrid[{{g["12 1"], g["12 3"]}}]

diğer yöntem


"Çıktı" nın liberal bir yorumu altında, aşağıdaki (104 karakter) işe yarayacaktır.

f@s_ := ({w, p} = ToExpression@StringSplit@s; 
  Graphics[Polygon@Delete[{{w, 0}, {0, 0}, {w, w}, {0, w}}, p], Axes -> True])


f["50 4"]

üçgen


Liste biçimindeki girdiye izin verilmişse, aşağıdaki (75 karakter) yeterli olacaktır:

f[{w_, p_}] := 
 Graphics[Polygon@Delete[{{w, 0}, {0, 0}, {w, w}, {0, w}}, p], Axes -> True]


Teknik olarak bu kurallara aykırıdır: P
Kapı Tokmağı

Hangi kuralı ihlal ediyor?
DavidC

Girdi / çıktı grafik şey koymak. 122 char bir olsa iyidir.
Açıklığa

Hata. Grafiğin sadece bir örnek olduğunu düşündüm.
DavidC

ASCII sanat versiyonunu ilk sıraya koydum.
DavidC

2

J, 59 55 42 38 37 36 karakter

Programın sonunda girişe izin verilirse:

(|:@|.@]^:([:|[+_7*2<[)[:[\'x'$~])~/

Değilse (fazladan 3 karakter için):

t=.(|:@|.@]^:([:|[+_7*2<[)[:[\'x'$~])~/

Kullanımı:

   (|:@|.@]^:([:|[+_7*2<[)[:[\'x'$~])~/3 4
  x
 xx
xxx

veya

   t 3 4
  x
 xx
xxx

Karakterlerin çoğu örtülü bir tarzda tutmak için parantez ve kapaklar olduğu için bu biraz daha kısa olabilir.

Düzenleme
Bir ulaç ve gündem fiil kullanmak birkaç karakter doğradı, ama yine de sevdiğim için çok fazla büyük harf var.

Edit 2
Bu biraz daha fazla. Kaç tane rotasyonun gerekli olduğunun bir listesi için gündemi boşaltmak, ekstra parantezlerin ve birkaç kapağın çoğundan kurtulur.

Düzenle 3
Son yabancı kapaktan ve işlem sırasında bir çift parantezden kurtuldum. Gerekli rotasyon sayısını kodlamanın daha ucuz bir yolunu bulmanız gerekir.

Düzenle 4 Bir karakteri kesmek için sonek yerine önek kullanın. Herhangi bir karakter kaydetmeyen liste oluşturmak için farklı bir yol sağlar. Kahretsin.

Düzenle 5
Başka bir karakteri kesmek için formül kullanma. Yine de bu parçanın daha kısa olabileceğini hissediyorum.


1

Python 106 Karakterleri

w,d=map(int,raw_input().split())
for e in range(1,w+1)[::d/3*2-1]:print('%'+'-+'[d%2]+str(w)+'s')%('*'*e)

1

Python 3, 91

Abhijit'in cevabına dayanarak.

Dizeleri ve çirkin 1s toplamını önlemek için çıkış dizesi oluşturma değiştirildi range. Python 3 kurtulmak alır raw_içinde raw_input, ama kullanılması gerekli kılan //tam sayı olarak bölünme ve için parantez eklemek için printyalnızca bir karakter kazandırır, böylece.

w,d=map(int,input().split())
for e in range(w)[::d//3*2-1]:print('%*s'%(w-d%2*2*w,'x'*-~e))

0

Yavru kedi , 140

def s{><replicate}
getLine{' 'neChar}span{readInt fromSome}toBoth->{w n}
w 0 if(n 2>){><}..
{<>w>< -{'X's}{' 's}both if(n 2%0=){><}cat say}each

Ungolfed:

getLine
{' ' neChar} span
{readInt fromSome} toBoth
->{ width corner }

width 0
if (corner 2 >):
  swap
..

{ ->index
  'X' index replicate
  ' ' (width index -) replicate
  if (corner 2 % 0 =):
    swap
  cat say
} each

Aşırı yüklemeyi uygulamam ve standart kütüphaneyi etsem gerektiğine dair kanıt.

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.