Visualizza di nuovo l'algoritmo euclideo


10

Compito

Dati due numeri interi positivi:

  1. Disegna il rettangolo con le dimensioni specificate dai due numeri interi.
  2. Ripetere il passaggio 3 fino a quando non c'è più spazio.
  3. Disegna e riempi il quadrato più grande toccando i tre lati del rettangolo (rimanente).
  4. Stampa il rettangolo risultante.

Esempio

Ad esempio, il nostro input è 6e 10.

Disegniamo il rettangolo vuoto delle dimensioni 6 x 10:

xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx

Dopo aver riempito ripetutamente i quadrati, questo è ciò che otterremmo:

aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaaccdd
aaaaaaccdd

Ci sono 4 quadrati here ( a, b, c, d), ciascuno con lato di lunghezza 6, 4, 2, 2rispettivamente.

Regole e libertà

  1. Devi usare una lettera diversa per ogni quadrato.
  2. Puoi scegliere quali lettere supportare, purché le lettere supportate siano tutte caratteri stampabili e ci siano almeno 10caratteri supportati.
  3. In ogni iterazione del passaggio 3 sopra, hai due scelte (tranne nell'ultima iterazione, in cui hai solo una scelta). Entrambe le scelte sono valide.
  4. Il numero di quadrati richiesti non supererà il numero di lettere supportate.
  5. Puoi riempire i quadrati con le lettere che supporti in qualsiasi ordine .

Casi test

Ingresso: 6, 10

Produzione:

aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaaccdd
aaaaaaccdd

o

aaaaaaccdd
aaaaaaccdd
aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaabbbb

o

bbbbaaaaaa
bbbbaaaaaa
bbbbaaaaaa
bbbbaaaaaa
ccddaaaaaa
ccddaaaaaa

o

ccddaaaaaa
ccddaaaaaa
bbbbaaaaaa
bbbbaaaaaa
bbbbaaaaaa
bbbbaaaaaa

o

ddddddaaaa
ddddddaaaa
ddddddaaaa
ddddddaaaa
ddddddbbcc
ddddddbbcc

Ingresso: 1,1

Produzione:

a

Ingresso: 1,10

Produzione:

abcdefghij

Ingresso: 10,1

Produzione:

a
b
c
d
e
f
g
h
i
j

Nota che ci sono più possibilità di quelle che posso includere per i test di cui sopra.

punteggio

Questo è . Vince la risposta più breve in byte.

Si applicano scappatoie standard .


Risposte:


3

Carbone , 30 byte

NδNγFβ¿×γδ«UOγδι¿‹γδA⁻δγδA⁻γδγ

Provalo online! Spiegazione:

Nδ      Input d
Nγ      Input g
Fβ      For i In ['a' ... 'z']
 ¿×γδ«   If g * d
  UOγδι   Oblong g, d, i
  ¿‹γδ    If g < d
   A⁻δγδ   d = d - g
   A⁻γδγ   Else g = g - d

Il comando Oblong di Charcoal fastidiosamente non avrà 0una dimensione, che mi costa 4 byte. L'altro approccio sarebbe quello di eseguire il ciclo mentre g * d, ma poi non sono riuscito a capire come ripetere b(che è predefinito alle lettere minuscole).


Spiacenti, è stata una decisione di progettazione consapevole, pensi che dovrebbero essere ammessi anche input negativi?
ASCII

@ Solo ASCII Qual è il comportamento attuale (sia per 0 che per negativo)? La mia idea migliore sarebbe che il negativo attirerebbe a sinistra / in alto anziché a destra / in basso. (Inoltre, se uso W×γδ, come faccio a stampare una lettera diversa ogni volta?)
Neil,

@Neil wow, capisco cosa vuoi dire che DOVREBBE essere fastidioso.
Magic Octopus Urn,



1

Gelatina , 32 byte

Ṁ,ạ/y
³,⁴ÇÐĿp/€Fs2
pµ¢ṣLµ€+95ỌsY

Provalo online!

Ṁ,ạ/yvuoi una spiegazione? Ecco qui.

Ṁ,ạ/y          - perform one step of the Euclidean Algorithm, input 2-element list
 ,             - pair of the following two:
Ṁ              -  maximum of the the input list
  ạ/           -  absolute difference of the two elements
    y          - use this as a mapping on the input.

³,⁴ÇÐĿp/€Fs2   - apply Euclidean Algorithm
³,⁴            - start with the pair [input 1, input 2]
   Ç           - apply a step of the Euclidean Algorithm
    ÐĿ         - repetitively until the results repeat
      p/€      - take the Cartesian product of each step
         Fs2   - flatten and split into all coordinate pairs of letters

pµ¢ṣLµ€+95ỌsY
p              - Cartesian product of inputs: provides all possible coordinate pairs.
 µ   µ€       - for each coordinate
   ṣL         - find the number of times it is included in
  ¢           - the above list of covered coordinates.
       +95Ọ   - convert number of times to letters
           s  - split into rows
            Y - join by newlines.

Posso probabilmente giocare a golf un po 'di più usando argomenti impliciti invece di ³,⁴.


1

Haskell , 181 byte

import Data.List
(['!'..'~']&)
a#[]=a
a#b=zipWith(++)a$transpose b
(s&a)b|b<1=[]|b>a=transpose$s&b$a|n<-div a b,(t,u)<-splitAt n s=foldl1(#)((<$[1..b]).(<$[1..b])<$>t)#(u&b$mod a b)

Provalo online!

Per 10byte in più invece ottieni una bella spirale :)

!!!!!!!!!!!!!$$$#####
!!!!!!!!!!!!!$$$#####
!!!!!!!!!!!!!$$$#####
!!!!!!!!!!!!!%%'#####
!!!!!!!!!!!!!%%&#####
!!!!!!!!!!!!!""""""""
!!!!!!!!!!!!!""""""""
!!!!!!!!!!!!!""""""""
!!!!!!!!!!!!!""""""""
!!!!!!!!!!!!!""""""""
!!!!!!!!!!!!!""""""""
!!!!!!!!!!!!!""""""""
!!!!!!!!!!!!!""""""""

Provalo online!

Ungolfed

L' (#)operatore mette due matrici una accanto all'altra, ma traspone quella giusta, ad esempio:

!!!                !!!"
!!! # "#$    ->    !!!#
!!!                !!!$

a # [] = a
a # b  = zipWith (++) a $ transpose b

Questa è fondamentalmente la versione ricorsiva dell'algoritmo di Euclide, ma invece di dimenticare i divisori e i resti e restituire il gcd, costruisce quadrati da esso e li accumula (#). La svariabile sono i caratteri rimanenti che possiamo usare:

(s & a) b
  | b == 0 = []                     -- Base case
  | b > a = transpose $ (s & b) a   -- In this case we can just flip the arguments and rotate the result by 90 degrees
  | n <- div a b                    -- set n to the number of squares we need
  , (t,u) <- splitAt n s =          -- take n characters, ..
               ((<$[1..b]).(<$[1..b]) <$> t)                     -- .. build squares from them and ..
    foldl1 (#)                                                   -- put them next to each other
                                             (u & b $ mod a b)   -- recursively build the smaller squares with the remaining characters..
                                            #                    -- .. flip them and put them next to the previous one(s)

La funzione effettiva chiama semplicemente la funzione dall'alto con una stringa di tutti i caratteri stampabili:

(['!'..'~']&)

Devi contare import Data.Listper usare transpose.
Anders Kaseorg,

L'ho fatto ma (per quanto ne sappia) non è possibile eseguire tale importazione quando utilizzo una funzione senza punti. Ma l'ho incluso nel conteggio dei byte, vedere il TIO in cui si trova il conteggio dei byte 164..
ბიმო

1
Oh. Potresti giocare a stravaganti giochi di preprocessore , ma a un certo punto ha più senso modificare semplicemente il codice nel tuo post dopo averlo copiato da TIO.
Anders Kaseorg,
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.