Genera un triangolo rettangolo


10

In questa sfida, devi prendere due numeri (separati da uno spazio) come input e output un triangolo rettangolo ASCII, composto da xs.

Il primo numero sarà la larghezza e l'altezza del triangolo che dovresti produrre. Il secondo numero sarà in quale angolo si troverà l'angolo destro. Gli angoli sono numerati da 1 a 4, iniziando in alto a sinistra e procedendo nell'ordine di lettura inglese:

1    2



3    4

Ad esempio (ingressi e rispettive uscite a triangolo):

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

L'output del tuo programma deve corrispondere esattamente a questi esempi per i rispettivi input.

L'input sarà sempre valido: il primo numero sarà un numero intero ≥1 e il secondo numero sarà 1, 2, 3 o 4.

Questo è ; vince il codice più breve (nel conteggio dei caratteri).

Risposte:


9

APL (30)

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

Spiegazione:

  • {... }/⎕: riduce la funzione data sull'ingresso (quindi se l'ingresso ha 2 numeri, chiama semplicemente la funzione con quei due numeri, essendo il numero sinistro e il numero giusto)
  • ≤/¨⍳2⍴⍺: Fare un -by- matrice coordinare e impostare quelle posizioni in cui la coordinata X non è superiore coordinata Y, dando un campo di bit.
  • (⍎⍵⌷'⌽+⍉⊖'): seleziona una funzione di trasformazione fornita da per posizionare il triangolo con il lato destro rivolto verso l'alto.
  • ' x'[1+... ]: aggiungine uno al campo bit e usa il risultato come indice nella stringa ' x', quindi metti spazio per 0 e xper 1.

1
Più APL leggo, più realizzo che APL è un incubo di analisi. Non dovrebbe effettivamente valutare la (⍎⍵⌷'functions')parte prima di decidere come interpretare l'intera affermazione? Consideriamo ad esempio 1+(⍵⌷'12+')|40. Non saprebbe nemmeno se |è monadico o diadico prima di assumere quella porzione tra parentesi. L'intero albero di sintassi astratto cambia in base alla valutazione.
protista il

Volevo dire 1+(⍎⍵⌷'12+')|40... non mi lascerà modificare.
protista il

2
@protista: Curiosità: f ← { [ }non dà un errore! f 1÷0dà ... un errore di dominio ! (a causa della divisione per zero). Solo quando si chiama la funzione come f 123si ottiene l' errore di sintassi . Ecco: imgur.com/jtmdi4B
marinus

Per tutti gli dei !!!! Mi spezza un po 'il cuore. Ho giocato con alcuni interpreti APL e questo dimostra un grande male nelle attuali implementazioni. hahaha
protista il

Sembra quasi che le funzioni siano sistemate di routine da una sorta di brutto processo simile alla macro-espansione. Indicherebbe in qualche modo l'espansione del testo sul posto.
protista il

6

Rubino, 116 115 109 96

Inizierò con la mia soluzione.

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}

So solo che sarò battuto da una soluzione GolfScript di 30 caratteri quasi istantaneamente: P

Grazie a minitech per aver rasato 19 caratteri (wow)!


Invece di ==0, puoi usare <1. ?x*xsalva un altro personaggio. Inoltre, puts i[1]%2<1?t.rjust(s):t}farebbe il trucco, giusto?
Ry-

Hmm ... hai spazi attorno al ?? È necessario? Inoltre, penso che puoi fare la stessa cosa con r=.
Ry-

@minitech È necessario - lo spazio iniziale perché altrimenti analizza 1?come un singolo token e lo spazio finale perché altrimenti analizza come ?t(che equivale a 't'). Come proponete di ristrutturare la rparte?
Maniglia della porta

Hai provato? Con quale versione di Ruby? Funziona bene per me su 2.0.
Ry-

@minitech Strano, non ha funzionato prima e ora funziona: P Grazie
Maniglia

4

GolfScript ( 34 33 caratteri)

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

È un peccato che gli angoli non siano numerati in rotazione, perché ciò consentirebbe un approccio più elegante nella costruzione di un array e quindi nella rotazione dei ntempi:

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

formattato:

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

inserisci qui la descrizione dell'immagine


L'input deve essere delimitato da spazi, non separato da virgola.
Maniglia della porta

@Doorknob: lo screenshot proviene da un programma di test in cui ho scelto di mostrare l'input con una virgola. L'input in realtà è delimitato da spazi quando si esegue il programma, sebbene il punto sia controverso perché tutte le applicazioni della console C # ricevono input come un array di stringhe.
Igby Largeman,

2

Golfscript, 39 36 35 caratteri

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

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

peccato che non siano 30 caratteri come richiesto


Sostituendo 1${-1%}*con -1 2$?%e \2>{-1%}*con \2>-1\?%otterrai 2 caratteri.
Volatilità,

@Volatility thanks, incorporated
John Dvorak

@Volatility -1 2può essere scritto0~2
Howard

E per un altro personaggio dobbiamo ristrutturare un po 'di più:~(\: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"]}}]

un altro metodo


Sotto un'interpretazione liberale di "output", funzioneranno i seguenti (104 caratteri).

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


f["50 4"]

triangolo


Se fosse consentito l'inserimento in forma di elenco, sarebbero sufficienti i seguenti (75 caratteri):

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


Tecnicamente questo è contro le regole: P
Maniglia della porta

Quale regola viola?
DavidC

Lo schema di input / output che ho messo. Il 122 caratteri è buono però. Ho modificato la domanda per chiarire
Doorknob

Ops. Pensavo che il grafico fosse semplicemente un esempio.
DavidC

Ho appena posizionato la versione di arte ASCII al primo posto.
DavidC,

2

J, 59 55 42 38 37 36 caratteri

Se è consentito avere l'input alla fine del programma:

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

In caso contrario (per altri 3 caratteri):

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

Uso:

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

o

   t 3 4
  x
 xx
xxx

Penso che questo potrebbe essere un po 'più breve poiché la maggior parte dei personaggi sono tra parentesi e maiuscole per mantenerlo in uno stile implicito.

Modifica
Usando un gerundio e il verbo dell'agenda sono stati tagliati alcuni caratteri, ma ci sono ancora troppi tappi per i miei gusti.

Modifica 2
È un po 'più simile. Eliminare l'agenda per un elenco di quante rotazioni sono necessarie elimina la maggior parte delle parentesi extra e alcune protezioni.

Modifica 3
Sbarazzati dell'ultimo cappuccio estraneo e di un paio di parentesi nel processo. È necessario trovare un modo più economico per codificare il numero di rotazioni richieste.

Modifica 4 Usa il prefisso invece del suffisso per tagliare un personaggio. Consente un modo diverso di creare l'elenco che non salva alcun carattere. Bugger.

Modifica 5
Usare una formula per tagliare un altro personaggio. Sento ancora che questo pezzo potrebbe essere più breve.


1

Personaggi di 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

Basato sulla risposta di Abhijit.

Modificata la creazione della stringa di output per evitare la somma di stringhe e le brutte 1s in range. Python 3 si sbarazza di raw_in raw_input, ma rende necessario usarlo //per il numero intero e per aggiungere le parentesi print, in modo da salvare solo un carattere.

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

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

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

La prova che ho bisogno di implementare il sovraccarico e arricchire la libreria standard.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.