Утворіть правильний трикутник


10

У цьому виклику потрібно взяти два числа (розділені пробілом) як введення та виведення правильного трикутника ASCII, складеного xs.

Першим числом буде ширина та висота трикутника, який слід вивести. Другим числом буде кут, у якому буде прямий кут. Кути пронумеровані від 1 до 4, починаючи з верхнього лівого кута та йдучи в порядку читання англійською мовою:

1    2



3    4

Наприклад (входи та їх відповідні трикутники):

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

Вихід програми повинен точно відповідати цим прикладам відповідно до відповідних даних.

Вхід завжди буде дійсним: перше число буде цілим числом ≥1, а друге число - 1, 2, 3 або 4.

Це ; виграє найкоротший код (у кількості символів).

Відповіді:


9

APL (30)

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

Пояснення:

  • {... }/⎕: зменшити задану функцію над входом (тому, якщо на вході є 2 числа, просто виклик функції з цими двома номерами, будучи лівим і правим числом)
  • ≤/¨⍳2⍴⍺: Складіть матрицю координат -by і встановіть ті позиції, де координата X не більша за координату Y, даючи бітове поле.
  • (⍎⍵⌷'⌽+⍉⊖'): виберіть функцію перетворення, задану для розміщення трикутника правою стороною вгору.
  • ' x'[1+... ]: додайте його в бітове поле і використовуйте результат як індекс в рядку ' x', таким чином, додавши пробіл для 0 і x1.

1
Чим більше я читаю APL, тим більше я розумію, що APL розбирає кошмар. Чи не слід було б насправді оцінювати (⍎⍵⌷'functions')частину, перш ніж вона вирішить, як інтерпретувати всю заяву? Розглянемо для прикладу 1+(⍵⌷'12+')|40. Він би навіть не знав, чи |є монадичним чи діадичним перед тим, як використовувати цю частину, що склалася в дужках. Все абстрактне синтаксичне дерево змінюється залежно від оцінки.
протіст

Я мав на увазі 1+(⍎⍵⌷'12+')|40... не дозволить мені редагувати.
протіст

2
@protist: Веселий факт: f ← { [ }не дає помилки! f 1÷0дає ... помилку домену ! (через ділення на нуль). Тільки коли ви викликаєте таку функцію, як f 123ви отримуєте синтаксичну помилку . Ось: imgur.com/jtmdi4B
marinus

Всім богам !!!! Це трохи розбиває моє серце. Я грав із написанням перекладачів APL, і це демонструє велике зло в нинішніх реалізаціях. хахаха
протіст

Мабуть, схоже, що функції вводяться в звичайний спосіб через якийсь потворний процес, схожий на макро-розширення. Це дещо вказує на розширення тексту на місці.
протист

6

Рубі, 116 115 109 96

Почну з власного рішення.

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}

Я просто знаю, що мене майже миттєво поб'є рішення GolfScript з 30 символами: P

Дякуємо minitech за гоління 19 символів (вау)!


Замість цього ==0можна використовувати <1. ?x*xзберігає іншого персонажа. Крім того, puts i[1]%2<1?t.rjust(s):t}зробив би трюк, правда?
Ри-

Хм ... у вас є місця навколо ?? Це потрібно? Крім того, я думаю, що ви можете зробити те ж саме і з r=.
Ри-

@minitech Це необхідно - провідний простір, тому що в іншому випадку він розбирає 1?як єдиний маркер, і простір, оскільки в іншому випадку він аналізує як ?t(що еквівалентно 't'). Як ви пропонуєте реструктуризувати rчастину?
Doorknob

Ви пробували? Під якою версією Ruby? Мені добре працює 2.0.
Ри-

@minitech Незнайко, це не працювало раніше, і зараз це: P Спасибі
Doorknob

4

GolfScript ( 34 33 символи)

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

Прикро, що кути не пронумеровані в обертанні, тому що це дозволить більш елегантно підійти до створення одного масиву та його повороту nразів:

~\:^,{)' 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'));}}

Відформатовано:

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

введіть тут опис зображення


Введення має бути обмежено пробілом, а не розділятися комами.
Дверна ручка

@Doorknob: Скріншот зроблений з тестової програми, де я вирішив показати введення комою. Вхід насправді є обмеженим простором під час виконання програми, хоча справа суперечлива, оскільки всі програми консолі C # отримують введення у вигляді масиву рядків.
Ігбі Ларгеман

2

Гольфскрипт, 39 36 35 символів

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

демо-версія: http://golfscript.apphb.com/?c=OyczIDInCn5cOnkseycgJyoneCd5Kit5PC0xIDIkPyV9JS0xQDI%2BPyVuKgo%3D

занадто погано, що це не 30 символів за запитом


Якщо замінити 1${-1%}*на -1 2$?%і \2>{-1%}*на, \2>-1\?%ви вилучите 2 символи.
Нестабільність

@ Властивість спасибі, включено
Джон Дворак

@ Волатильність -1 2можна написати0~2
Говард

І ще для одного чару, ми повинні трохи реструктурувати:~(\:y,{{>'x '=}+y,%0~2$?%}%\2&(%n*
Говард

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"]}}]

інший метод


В умовах ліберальної інтерпретації "вихід" працюватиме наступне (104 символи).

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


f["50 4"]

трикутник


Якщо введення списку у формі списку було дозволеним, буде достатньо наступного (75 символів):

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


Технічно це суперечить правилам: P
Дверна ручка

Яке правило воно порушує?
DavidC

Діаграму введення / виводу, що я кладу. 122 Char одна добре, хоча. Я відредагував питання, щоб уточнити
Doorknob

На жаль Я подумав, що діаграма є просто прикладом.
DavidC

Я щойно поставив арт-версію ASCII на перше місце.
DavidC

2

J, 59 55 42 38 37 36 символів

Якщо дозволено мати дані в кінці програми:

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

Якщо ні (для додаткових 3 символів):

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

Використання:

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

або

   t 3 4
  x
 xx
xxx

Я думаю, що це може бути трохи коротше, оскільки більшість персонажів є дужками та ковпаками, щоб зберегти їх у неявному стилі.

Редагування
Використовуючи заголовок і дієслово порядку денного, відрізав декілька символів, але все ще є занадто багато великих літер, щоб мені сподобалося.

Редагувати 2
Це трохи більше подобається. Якщо скинути порядок денний на перелік кількості обертань, які потрібні, це позбудеться більшості додаткових дужок та кількох обмежень.

Редагувати 3
Позбувся останньої сторонньої кришки та пари дужок у процесі. Потрібно знайти більш дешевий спосіб кодування кількості необхідних обертів.

Редагувати 4 Використовуйте префікс замість суфікса, щоб відрізати символ. Вмикає інший спосіб створення списку, який не зберігає жодних символів. Баггер.

Редагуйте 5
За допомогою формули для відсікання іншого символу. Але відчуваю, що цей шматочок може бути коротшим.


1

Пітон 106 персонажів

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

Пітон 3, 91

Виходячи з відповіді Абхіджіта.

Змінено створення вихідного рядка, щоб уникнути суми рядків та негарних 1s у range. Python 3 позбавляється від raw_in raw_input, але робить необхідним використання //для цілого поділу та додавання парантезів для print, щоб зберегти лише один символ.

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

Кошеня , 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

Безголівки:

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

Докази того, що мені потрібно здійснити перевантаження і зцілити частину стандартної бібліотеки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.