Générer un triangle rectangle

10

Dans ce défi, vous devez prendre deux nombres (séparés par un espace) comme entrée et sortie d'un triangle rectangle ASCII, composé de xs.

Le premier nombre sera la largeur et la hauteur du triangle que vous devez sortir. Le deuxième nombre sera dans quel coin l'angle droit sera. Les coins sont numérotés de 1 à 4, en commençant en haut à gauche et dans l'ordre de lecture anglais:

1    2



3    4

Par exemple (entrées et leurs sorties triangulaires respectives):

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

La sortie de votre programme doit correspondre exactement à ces exemples pour leurs entrées respectives.

L'entrée sera toujours valide: le premier nombre sera un entier ≥1 et le deuxième nombre sera 1, 2, 3 ou 4.

C'est du ; le code le plus court (en nombre de caractères) gagne.

Poignée de porte
la source

Réponses:

9

APL (30)

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

Explication:

  • {... }/⎕: réduire la fonction donnée sur l'entrée (donc si l'entrée a 2 nombres, appelle simplement la fonction avec ces deux nombres, soit le nombre de gauche et le bon nombre)
  • ≤/¨⍳2⍴⍺: Faire une -by- coordonner la matrice et définir les positions où la coordonnée X n'est pas supérieure à la coordonnée Y, ce qui donne un champ de bits.
  • (⍎⍵⌷'⌽+⍉⊖'): sélectionnez une fonction de transformation donnée par pour placer le triangle à droite.
  • ' x'[1+... ]: ajoutez-en un au champ binaire et utilisez le résultat comme index dans la chaîne ' x', en mettant donc de l'espace pour 0 et xpour 1.
marinus
la source
1
Plus je lis APL, plus je réalise que APL est un cauchemar d'analyse. Ne devrait-il pas réellement évaluer la (⍎⍵⌷'functions')partie avant de décider comment interpréter l'ensemble de la déclaration? Considérez par exemple 1+(⍵⌷'12+')|40. Il ne saurait même pas s'il |est monadique ou dyadique avant d'avoir ingéré cette portion entre parenthèses. L'arbre de syntaxe abstrait entier change en fonction de l'évaluation.
protiste
Je voulais dire 1+(⍎⍵⌷'12+')|40... ne me laissera pas éditer.
protiste
2
@protist: Fait amusant: f ← { [ }ne donne pas d'erreur! f 1÷0donne ... une erreur de domaine ! (à cause de la division par zéro). Ce n'est que lorsque vous appelez la fonction comme f 123vous obtenez une erreur de syntaxe . Voici: imgur.com/jtmdi4B
marinus
Par tous les dieux !!!! Cela me brise un peu le cœur. J'ai joué avec l'écriture d'interprètes APL, ce qui démontre un grand mal dans les implémentations actuelles. hahaha
protiste
Il semble que les fonctions soient mises en place régulièrement par une sorte de vilain processus de type macro-expansion. Cela indiquerait quelque peu l'expansion du texte en place.
protiste
6

Rubis, 116 115 109 96

Je vais commencer par ma propre solution.

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}

Je sais juste que je vais me faire battre par une solution GolfScript à 30 caractères presque instantanément: P

Merci à minitech d'avoir rasé 19 personnages (wow)!

Poignée de porte
la source
Au lieu de ==0, vous pouvez utiliser <1. ?x*xenregistre un autre personnage. Aussi, puts i[1]%2<1?t.rjust(s):t}ferait l'affaire, non?
Ry-
Hmm… vous avez des espaces autour du ?? Est-ce nécessaire? De plus, je pense que vous pouvez faire la même chose avec le r=.
Ry-
@minitech Il est nécessaire - l'espace de tête car sinon il analyse 1?comme un seul jeton, et l'espace de fin parce que sinon il analyse comme ?t(ce qui est équivalent à 't'). Comment proposez-vous de restructurer la rpièce?
Poignée de porte
L'avez-vous essayé? Sous quelle version de Ruby? Fonctionne bien pour moi sur 2.0.
Ry-
@minitech Odd, cela ne fonctionnait pas avant et maintenant ça marche: P Merci
Poignée de porte
4

GolfScript ( 34 33 caractères)

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

C'est dommage que les coins ne soient pas numérotés en rotation, car cela permettrait une approche plus élégante de la construction d'un tableau puis de sa rotation n:

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

Formaté:

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

entrez la description de l'image ici

Igby Largeman
la source
L'entrée doit être délimitée par des espaces, pas séparée par des virgules.
Poignée de porte
@ Doorknob: La capture d'écran provient d'un programme de test où j'ai choisi d'afficher l'entrée avec une virgule. L'entrée est en fait délimitée par des espaces lorsque vous exécutez le programme, bien que le point soit théorique car toutes les applications de la console C # reçoivent des entrées sous forme de tableau de chaînes.
Igby Largeman
2

Golfscript, 39 36 35 caractères

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

démo en direct: http://golfscript.apphb.com/?c=OyczIDInCn5cOnkseycgJyoneCd5Kit5PC0xIDIkPyV9JS0xQDI%2BPyVuKgo%3D

dommage que ce ne soit pas 30 caractères comme demandé

John Dvorak
la source
Le remplacement 1${-1%}*par -1 2$?%et \2>{-1%}*par \2>-1\?%vous rapportera 2 caractères.
Volatilité
@Volatility thanks, incorporated
John Dvorak
@Volatility -1 2peut être écrit0~2
Howard
Et pour un autre personnage, nous devons restructurer un peu plus:~(\: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"]}}]

une autre méthode


Selon une interprétation libérale de la "sortie", les éléments suivants (104 caractères) fonctionneront.

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


f["50 4"]

Triangle


Si la saisie sous forme de liste était autorisée, les éléments suivants (75 caractères) suffiraient:

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

DavidC
la source
Techniquement, cela est contraire aux règles: P
Poignée de porte
Quelle règle viole-t-elle?
DavidC
Le truc d'entrée / sortie graphique que je mets. Le 122 car c'est bien. J'ai modifié la question pour clarifier
Poignée de porte
Oops. Je pensais que le tableau n'était qu'un exemple.
DavidC
Je viens de placer la version artistique ASCII en premier lieu.
DavidC
2

J, 59 55 42 38 37 36 caractères

S'il est permis d'avoir l'entrée à la fin du programme:

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

Sinon (pour 3 caractères supplémentaires):

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

Usage:

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

ou

   t 3 4
  x
 xx
xxx

Je pense que cela pourrait être un peu plus court car la plupart des caractères sont des crochets et des majuscules pour le garder dans un style implicite.

Éditer
À l'aide d'un gérondif et le verbe de l'agenda a coupé quelques caractères, mais il y a encore trop de majuscules à mon goût.

Edit 2
C'est un peu plus comme ça. La suppression de l'agenda pour une liste du nombre de rotations nécessaires supprime la plupart des supports supplémentaires et quelques plafonds.

Edit 3
Débarrassé du dernier capuchon étranger et d'une paire de supports dans le processus. Besoin de trouver un moyen moins coûteux d'encoder le nombre de rotations nécessaires.

Edit 4 Utilisez un préfixe au lieu d'un suffixe pour couper un caractère. Permet une manière différente de créer la liste qui n'enregistre aucun caractère. Bugger.

Edit 5
Utilisation d'une formule pour couper un autre caractère. Je pense toujours que ce morceau pourrait être plus court.

Gareth
la source
1

Python 106 caractères

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
la source
1

Python 3, 91

Basé sur la réponse d'Abhijit.

Modification de la création de la chaîne de sortie pour éviter la somme des chaînes et les vilains 1s dans le range. Python 3 se débarrasse de raw_in raw_input, mais oblige à utiliser //pour la division entière et à ajouter des parenthèses pour print, ce qui ne sauvegarde qu'un seul caractère.

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

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

Non golfé:

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

Preuve que je dois implémenter la surcharge et étoffer la bibliothèque standard.

Jon Purdy
la source