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.