Generieren Sie ein rechtwinkliges Dreieck

10

Bei dieser Herausforderung müssen Sie zwei Zahlen (durch ein Leerzeichen getrennt) als Eingabe und Ausgabe eines ASCII-Dreiecks aus xs verwenden.

Die erste Zahl ist die Breite und Höhe des Dreiecks, das Sie ausgeben sollten. Die zweite Zahl ist, in welcher Ecke sich der rechte Winkel befindet. Die Ecken sind von 1 bis 4 nummeriert, beginnend oben links und in englischer Lesereihenfolge:

1    2



3    4

Zum Beispiel (Eingänge und ihre jeweiligen Dreiecksausgänge):

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

Die Ausgabe Ihres Programms muss genau mit diesen Beispielen für die jeweiligen Eingaben übereinstimmen.

Die Eingabe ist immer gültig: Die erste Zahl ist eine Ganzzahl ≥1 und die zweite Zahl ist 1, 2, 3 oder 4.

Das ist ; Der kürzeste Code (in Zeichenanzahl) gewinnt.

Türknauf
quelle

Antworten:

9

APL (30)

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

Erläuterung:

  • {... }/⎕: Reduziere die gegebene Funktion über der Eingabe (wenn die Eingabe also 2 Zahlen hat, rufe einfach die Funktion mit diesen beiden Zahlen auf, wobei es sich um die linke und die rechte Zahl handelt)
  • ≤/¨⍳2⍴⍺: Erstellen Sie eine -by- Koordinatenmatrix und legen Sie die Positionen fest, an denen die X-Koordinate nicht größer als die Y-Koordinate ist, wodurch ein Bitfeld erhalten wird.
  • (⍎⍵⌷'⌽+⍉⊖'): Wählen Sie eine Transformationsfunktion aus , um das Dreieck mit der rechten Seite nach oben zu platzieren.
  • ' x'[1+... ]: Füge eins zum Bitfeld hinzu und verwende das Ergebnis als Index für die Zeichenfolge. Platziere ' x'also Platz für 0 und xfür 1.
Marinus
quelle
1
Je mehr APL ich lese, desto mehr wird mir klar, dass APL ein Parsing-Albtraum ist. Müsste es den (⍎⍵⌷'functions')Teil nicht tatsächlich bewerten, bevor es entscheidet, wie die gesamte Aussage zu interpretieren ist? Betrachten Sie zum Beispiel 1+(⍵⌷'12+')|40. Es würde nicht einmal wissen, ob |es monadisch oder dyadisch ist, bevor dieser Teil in Klammern gesetzt wird. Der gesamte abstrakte Syntaxbaum ändert sich je nach Auswertung.
Protist
Ich meinte 1+(⍎⍵⌷'12+')|40... werde mich nicht bearbeiten lassen.
Protist
2
@protist: Lustige Tatsache: f ← { [ }gibt keinen Fehler! f 1÷0gibt ... einen Domainfehler ! (wegen der Division durch Null). Nur wenn Sie die Funktion so aufrufen, erhalten f 123Sie einen Syntaxfehler . Siehe: imgur.com/jtmdi4B
marinus
Von allen Göttern !!!! Das bricht mir ein bisschen das Herz. Ich habe mit dem Schreiben von APL-Dolmetschern gespielt, und das zeigt ein großes Übel in den aktuellen Implementierungen. hahaha
Protist
Es scheint fast so, als würden Funktionen routinemäßig durch einen hässlichen Makro-Expansions-ähnlichen Prozess eingerichtet. Dies würde auf eine direkte Texterweiterung hinweisen.
Protist
6

Ruby, 116 115 109 96

Ich werde mit meiner eigenen Lösung beginnen.

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}

Ich weiß nur, dass ich fast sofort von einer GolfScript-Lösung mit 30 Zeichen geschlagen werde: P.

Vielen Dank an minitech für das Rasieren von 19 Zeichen (wow)!

Türknauf
quelle
Stattdessen ==0können Sie verwenden <1. ?x*xspeichert ein anderes Zeichen. Außerdem puts i[1]%2<1?t.rjust(s):t}würde der Trick, nicht wahr?
Ry
Hmm ... hast du Leerzeichen um das ?? Ist das notwendig Ich denke auch, dass Sie das Gleiche mit dem tun können r=.
Ry
@minitech Es ist notwendig - das führende Leerzeichen, weil es sonst 1?als einzelnes Token analysiert wird , und das nachfolgende Leerzeichen, weil es sonst als ?t(was äquivalent zu 't') analysiert wird . Wie schlagen Sie eine Umstrukturierung des rTeils vor?
Türknauf
Hast Du es versucht? Unter welcher Version von Ruby? Funktioniert gut für mich auf 2.0.
Ry
@minitech Seltsam, es hat vorher nicht funktioniert und jetzt funktioniert es: P Danke
Türknauf
4

GolfScript ( 34 33 Zeichen)

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

Es ist eine Schande, dass die Ecken nicht in Rotation nummeriert sind, da dies einen eleganteren Ansatz ermöglichen würde, ein Array zu erstellen und es dann nmal zu drehen :

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

Formatiert:

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

Geben Sie hier die Bildbeschreibung ein

Igby Largeman
quelle
Die Eingabe muss durch Leerzeichen und nicht durch Kommas getrennt sein.
Türknauf
@ Doorknob: Der Screenshot stammt aus einem Testprogramm, in dem ich die Eingabe mit einem Komma angezeigt habe. Die Eingabe ist tatsächlich durch Leerzeichen getrennt, wenn Sie das Programm ausführen, obwohl der Punkt umstritten ist, da alle C # -Konsolenanwendungen Eingaben als Array von Zeichenfolgen erhalten.
Igby Largeman
2

Golfscript, 39 36 35 Zeichen

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

Live-Demo: http://golfscript.apphb.com/?c=OyczIDInCn5cOnkseycgJyoneCd5Kit5PC0xIDIkPyV9JS0xQDI%2BPyVuKgo%3D

Schade, dass es nicht wie gewünscht 30 Zeichen sind

John Dvorak
quelle
Durch Ersetzen 1${-1%}*mit -1 2$?%und \2>{-1%}*mit erhalten \2>-1\?%Sie 2 Zeichen.
Volatilität
@ Volatilität danke, aufgenommen
John Dvorak
@ Volatilität -1 2kann geschrieben werden0~2
Howard
Und für einen anderen Char müssen wir ein bisschen mehr umstrukturieren:~(\: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"]}}]

eine andere Methode


Unter einer liberalen Interpretation von "Ausgabe" wird das Folgende (104 Zeichen) funktionieren.

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


f["50 4"]

Dreieck


Wenn die Eingabe in Form einer Liste zulässig wäre, würde Folgendes (75 Zeichen) ausreichen:

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

DavidC
quelle
Technisch
verstößt
Welche Regel verstößt es?
DavidC
Das Eingabe- / Ausgabediagramm, das ich gesetzt habe. Der 122er ist allerdings gut. Ich habe die Frage bearbeitet, um zu klären
Türknauf
Hoppla. Ich dachte, das Diagramm sei nur ein Beispiel.
DavidC
Ich habe gerade die ASCII-Kunstversion an erster Stelle platziert.
DavidC
2

J, 59 55 42 38 37 36 Zeichen

Wenn es erlaubt ist, die Eingabe am Ende des Programms zu haben:

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

Wenn nicht (für zusätzliche 3 Zeichen):

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

Verwendungszweck:

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

oder

   t 3 4
  x
 xx
xxx

Ich denke, dies könnte ein bisschen kürzer sein, da die meisten Zeichen Klammern und Kappen sind, um es in einem impliziten Stil zu halten.

Bearbeiten
Mit einem Gerundium und dem Agenda-Verb wurden einige Zeichen abgeschnitten, aber es sind immer noch zu viele Großbuchstaben für meinen Geschmack vorhanden.

Edit 2
Das ist ein bisschen mehr so. Wenn Sie die Agenda für eine Liste der erforderlichen Umdrehungen löschen, werden die meisten zusätzlichen Klammern und einige Kappen entfernt.

Bearbeiten 3
Die letzte überflüssige Kappe und ein Paar Klammern wurden dabei entfernt. Sie müssen einen günstigeren Weg finden, um die Anzahl der erforderlichen Umdrehungen zu codieren.

Bearbeiten 4 Verwenden Sie das Präfix anstelle des Suffix, um ein Zeichen abzuschneiden. Ermöglicht eine andere Art der Erstellung der Liste, bei der keine Zeichen gespeichert werden. Mistkerl.

Bearbeiten 5
Verwenden Sie eine Formel, um ein anderes Zeichen abzuschneiden. Ich habe immer noch das Gefühl, dass dieses Stück kürzer sein könnte.

Gareth
quelle
1

Python 106 Zeichen

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
quelle
1

Python 3, 91

Basierend auf Abhijits Antwort.

Die Erstellung der Ausgabezeichenfolge wurde geändert, um die Summe der Zeichenfolgen und der hässlichen 1s in der zu vermeiden range. Python 3 beseitigt das raw_In raw_input, macht es jedoch erforderlich, es //für die Ganzzahldivision zu verwenden und Klammern für hinzuzufügen print, sodass nur ein Zeichen gespeichert wird .

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

Kätzchen , 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

Beweise, dass ich Überladung implementieren und die Standardbibliothek ausarbeiten muss.

Jon Purdy
quelle