Генерация прямоугольного треугольника


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 иx для 1.

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}

Я просто знаю, что я получу 30-символьное решение GolfScript почти мгновенно: P

Спасибо Minitech за бритья 19 символов (вау)!


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

Хм… у вас есть пробелы во всем ?? Это необходимо? Кроме того, я думаю, что вы можете сделать то же самое с r=.
Ry-

@minitech Это необходимо - начальный пробел, потому что в противном случае он анализируется 1?как один токен, а конечный пробел, потому что в противном случае он разбирается как ?t(что эквивалентно 't'). Как вы предлагаете реструктурировать rчасть?
Дверная ручка

Вы пробовали это? Под какой версией Ruby? У меня отлично работает на 2.0.
Ry-

@minitech Странно, раньше это не работало, а теперь работает: P Спасибо
дверная ручка

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

Golfscript, 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 символа.
Волатильность

@Volatility спасибо, включены
Джон Дворак

@ Volatlity -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 символа один хорошо, хотя. Я отредактировал вопрос, чтобы уточнить
дверная ручка

К сожалению. Я думал, что диаграмма была просто примером.
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

Python 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

Python 3, 91

На основании ответа Абхиджита.

Изменено создание выходной строки, чтобы избежать суммы строк и уродливых 1s в range. Python 3 избавляется от raw_in raw_input, но делает необходимым использовать //для целочисленного деления и для добавления parantheses 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

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

Доказательство того, что мне нужно реализовать перегрузку и конкретизировать стандартную библиотеку.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.