Hasilkan segitiga siku-siku

10

Dalam tantangan ini, Anda harus mengambil dua angka (dipisahkan oleh spasi) sebagai input dan output segitiga kanan ASCII, terdiri dari xs.

Angka pertama adalah lebar dan tinggi segitiga yang harus Anda hasilkan. Angka kedua adalah sudut mana sudut kanan berada. Sudut diberi nomor 1 hingga 4, mulai dari kiri atas dan menggunakan urutan pembacaan bahasa Inggris:

1    2



3    4

Misalnya (input dan output segitiga masing-masing):

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

Output program Anda harus cocok dengan contoh-contoh ini persis untuk input masing-masing.

Masukan akan selalu valid: angka pertama adalah bilangan bulat ≥1, dan angka kedua adalah 1, 2, 3, atau 4.

Ini adalah ; kode terpendek (dalam jumlah karakter) menang.

Gagang pintu
sumber

Jawaban:

9

APL (30)

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

Penjelasan:

  • {... }/⎕: kurangi fungsi yang diberikan pada input (jadi jika input memiliki 2 angka, panggil saja fungsi dengan dua angka tersebut, sebagai angka kiri dan angka kanan)
  • ≤/¨⍳2⍴⍺: Buat matriks -dengan koordinat dan atur posisi-posisi tersebut di mana koordinat X tidak lebih besar dari koordinat Y, berikan bitfield.
  • (⍎⍵⌷'⌽+⍉⊖'): pilih fungsi transformasi yang diberikan oleh untuk menempatkan segitiga sisi kanan atas.
  • ' x'[1+... ]: tambahkan satu ke bitfield, dan gunakan hasilnya sebagai indeks ke dalam string ' x', jadi beri spasi untuk 0 dan xuntuk 1.
marinus
sumber
1
Semakin banyak APL saya baca, semakin saya sadari bahwa APL adalah mimpi buruk yang parsing. Bukankah harus benar-benar mengevaluasi (⍎⍵⌷'functions')bagian sebelum memutuskan bagaimana menafsirkan seluruh pernyataan? Pertimbangkan misalnya 1+(⍵⌷'12+')|40. Bahkan tidak akan tahu apakah |itu monadik atau diad sebelum mengambil bagian yang diapit itu. Keseluruhan sintaksis abstrak berubah tergantung pada evaluasi.
Protista
Maksud saya 1+(⍎⍵⌷'12+')|40... tidak akan membiarkan saya mengedit.
Protist
2
@protist: Fakta menyenangkan: f ← { [ }tidak memberikan kesalahan! f 1÷0memberi ... kesalahan domain ! (karena pembagian dengan nol). Hanya ketika Anda memanggil fungsi seperti f 123Anda mendapatkan kesalahan sintaks . Lihatlah: imgur.com/jtmdi4B
marinus
Demi semua dewa !!!! Itu sedikit menghancurkan hatiku. Saya telah bermain dengan menulis beberapa penerjemah APL, dan itu menunjukkan kejahatan besar dalam implementasi saat ini. hahaha
protist
Sepertinya fungsi dijalankan secara rutin oleh semacam proses makro-ekspansi yang jelek. Ini akan agak menunjukkan ekspansi teks di tempat.
Protista
6

Ruby, 116 115 109 96

Saya akan mulai dengan solusi saya sendiri.

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}

Saya hanya tahu bahwa saya akan dikalahkan oleh solusi GolfScript 30 karakter hampir secara instan: P

Terima kasih kepada minitech karena telah memangkas 19 karakter (wow)!

Gagang pintu
sumber
Alih-alih ==0, Anda bisa menggunakan <1. ?x*xmenyimpan karakter lain. Juga, puts i[1]%2<1?t.rjust(s):t}akan melakukan triknya, bukan?
Ry-
Hmm ... Anda punya ruang di sekitar ?? Apakah itu perlu? Juga, saya pikir Anda dapat melakukan hal yang sama dengan r=.
Ry-
@minitech Perlu - ruang utama karena jika tidak mem-parsing 1?sebagai token tunggal, dan ruang tambahan karena jika tidak mem-parsing sebagai ?t(yang setara dengan 't'). Bagaimana Anda mengusulkan restrukturisasi rbagian?
Gagang Pintu
Apakah kamu sudah mencobanya? Di bawah versi Ruby mana? Bekerja dengan baik untuk saya di 2.0.
Ry-
@minitech Aneh, itu tidak berfungsi sebelum dan sekarang ya: P Terima kasih
Gagang Pintu
4

GolfScript ( 34 33 karakter)

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

Sayang sekali bahwa sudut-sudutnya tidak dinomori secara rotasi, karena itu akan memungkinkan pendekatan yang lebih elegan dalam membangun satu array dan kemudian memutarnya nberkali - kali:

~\:^,{)' x'^*$>^<}%{-1%zip}@)*n*
Peter Taylor
sumber
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'));}}

Diformat:

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'));
    }
}

masukkan deskripsi gambar di sini

Igby Largeman
sumber
Input harus dibatasi ruang, tidak dipisahkan koma.
Gagang Pintu
@Doorknob: Tangkapan layar berasal dari program uji di mana saya memilih untuk menunjukkan input dengan koma. Input sebenarnya dibatasi oleh ruang ketika Anda menjalankan program, meskipun intinya diperdebatkan karena semua aplikasi konsol C # menerima input sebagai larik string.
Igby Largeman
2

Skrip golf, 39 36 35 karakter

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

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

Sayang sekali itu bukan 30 karakter seperti yang diminta

John Dvorak
sumber
Mengganti 1${-1%}*dengan -1 2$?%dan \2>{-1%}*dengan \2>-1\?%akan memberi Anda 2 karakter.
Volatilitas
@Volility, terima kasih, dimasukkan
John Dvorak
@Vatilitas -1 2dapat ditulis0~2
Howard
Dan untuk char lain kita harus merestrukturisasi lebih sedikit:~(\: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"]}}]

metode lain


Di bawah interpretasi liberal "output", yang berikut (104 karakter) akan berfungsi.

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


f["50 4"]

segi tiga


Jika input dalam bentuk daftar diizinkan, berikut ini (75 karakter) sudah cukup:

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

DavidC
sumber
Secara teknis ini melanggar aturan: P
Doorknob
Aturan apa yang dilanggar?
DavidC
Input / output chart saya masukkan. Namun, char yang bagus. Saya mengedit pertanyaan untuk menjelaskan
Gagang Pintu
Ups. Saya pikir bagan itu hanyalah sebuah contoh.
DavidC
Saya baru saja menempatkan versi seni ASCII di tempat pertama.
DavidC
2

J, 59 55 42 38 37 36 karakter

Jika diizinkan memiliki input di akhir program:

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

Jika tidak (untuk 3 karakter tambahan):

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

Pemakaian:

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

atau

   t 3 4
  x
 xx
xxx

Saya pikir ini bisa sedikit lebih pendek karena sebagian besar karakter adalah tanda kurung dan topi agar tetap dalam gaya implisit.

Sunting
Menggunakan gerund dan kata kerja agenda telah memotong beberapa karakter, tetapi masih ada terlalu banyak batasan di sana untuk keinginan saya.

Sunting 2
Itu sedikit lebih seperti itu. Membuang agenda untuk daftar berapa banyak rotasi yang diperlukan menghilangkan sebagian besar tanda kurung tambahan dan beberapa tutup.

Sunting 3
Singkirkan tutup asing dan sepasang kurung dalam proses. Perlu menemukan cara pengkodean jumlah rotasi yang lebih murah.

Sunting 4 Gunakan awalan alih-alih suffix untuk memotong karakter. Mengaktifkan cara berbeda untuk membuat daftar yang tidak menyimpan karakter apa pun. Bersetubuh.

Sunting 5
Menggunakan rumus untuk memotong karakter lain. Masih merasa bit ini bisa lebih pendek.

Gareth
sumber
1

Python 106 Karakter

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)
Abhijit
sumber
1

Python 3, 91

Berdasarkan jawaban Abhijit.

Dimodifikasi pembuatan string output untuk menghindari jumlah string dan jelek 1di range. Python 3 menghilangkan raw_in raw_input, tetapi membuat perlu digunakan //untuk integer divison dan untuk menambahkan paranthes print, sehingga hanya menyimpan satu karakter.

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

Kitten , 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

Tidak Disatukan:

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

Bukti bahwa saya perlu menerapkan overloading dan menyempurnakan perpustakaan standar.

Jon Purdy
sumber