Formiche su un tronco naturale


23

Questa è una buona sfida per principianti e un buon assassino di tempo.

Ho detto solo un log -natural- perché il titolo era troppo breve, questo non ha nulla a che fare con i logaritmi.

Dato 2 variabili:

  • Il numero di formiche n.
  • La larghezza del registro w.

Stampa un registro di larghezza wcon le nformiche (esempio mostrato w=3, n=6)

|             |
| \O/ \O/ \O/ |
| -O- -O- -O- |
| /o\ /o\ /o\ |
|  ^   ^   ^  |
|             |
| \O/ \O/ \O/ |
| -O- -O- -O- |
| /o\ /o\ /o\ |
|  ^   ^   ^  |
|             |

Una singola formica si presenta così:

\O/ # Upper-case O
-O- # Upper-case O
/o\ # Lower-case o
 ^  

Alcune leggi sulle formiche:

  1. Le formiche non possono toccarsi a vicenda né direttamente sul bordo del registro, preferiscono toccare gli spazi.
  2. Ogni fila di formiche deve essere wlarga, con n/wfile di formiche.
  3. Le formiche necessitano sempre di un registro, la larghezza del registro è maggiore di 0, garantita.
  4. Anche le formiche ... beh, servono le formiche, il numero di formiche è maggiore di 0, garantito.
  5. Le formiche sono anche sorprendentemente ben organizzate, riempiranno un registro da sinistra a destra, dall'alto verso il basso; come se stessero leggendo un libro.

Ant-SEMPI

w = 3, n = 5

|             |
| \O/ \O/ \O/ |
| -O- -O- -O- |
| /o\ /o\ /o\ |
|  ^   ^   ^  |
|             |
| \O/ \O/     |
| -O- -O-     |
| /o\ /o\     |
|  ^   ^      |
|             |

w = 1, n = 1

|     |
| \O/ |
| -O- |
| /o\ |
|  ^  |
|     |

w = 1, n = 3

|     |
| \O/ |
| -O- |
| /o\ |
|  ^  |
|     |
| \O/ |
| -O- |
| /o\ |
|  ^  |
|     |
| \O/ |
| -O- |
| /o\ |
|  ^  |
|     |

Si tratta di , vince la persona con il numero minore di byte.



@AdmBorkBork Lo ricordo ora. Ho finito a metà strada e ho letto male le specifiche, potrei aver inconsciamente rubato parte di quell'idea.
Magic Octopus Urn

Questi sono registri ant-y.
Arjun,

"Ogni fila di formiche deve essere larga". Se w>nci dovrebbe essere spazio extra prima della mano destra |o no, o dipende da noi?
Jonathan Allan,

1
-1 per Ant-xamples(Odio i giochi di parole)
caird coinheringaahing il

Risposte:


4

Gelatina ,  44  43 byte

Cancellato 44 non è 44 con l'uso di  

⁶ṁ;⁶jЀ“\-/“OOo^ ”;UṖz⁶¤Y
sÇ€⁶;YỴz⁶Zj@€⁾||Y

Provalo online!

Come?

⁶ṁ;⁶jЀ“\-/“OOo^ ”;UṖz⁶¤Y - Link 1, make a row of ants: list x (could be integer = length)
⁶                         - literal ' '
 ṁ                        - mould like x (makes a list of that many spaces)
  ;⁶                      - concatenate one more space
                       ¤  - nilad followed by link(s) as a nilad
       “\-/“OOo^ ”        -   literal      ["\-/","OOo^ "] ("..." a list of chars really)
                   U      -   reverse each [" ^oOO","/-\"]
                  ;       -   concatenate  ["\-/","OOo^ "," ^oOO","/-\"]
                    Ṗ     -   pop          ["\-/","OOo^ "," ^oOO"]
                      ⁶   -   literal ' '
                     z    -   transpose & fill ["\O/","-O-","/o\"," ^ ","   "]
    jЀ                   - join left mapped over right
                          -   (join the spaces with each of the ant parts in turn)
                        Y - join with newlines

sÇ€⁶;YỴz⁶Zj@€⁾||Y - Main link: n, w
s                 - split n into chunks of length w (implicitly makes a range of length n)
 Ç€               - call the last link (1) as a monad for €ach
   ⁶;             - a space concatenated with that
     Y            - join with newlines
      Ỵ           - split at newlines (both the ones we just joined with AND the others!)
       z⁶         - transpose & fill with space characters (making the shorter rows,
                  -   including the single space as long as the longest one)
         Z        - transpose it back the right way
             ⁾||  - literal ['|','|']
          j@€     - join with reverse arguments for €ach (put each row between pipes)
                Y - join back up with newlines
                  - implicit print

Ho chiesto w<nin un commento poiché è leggermente ambiguo.
Se il registro deve essere wlargo e non solo quello w, il costo è di due byte:

⁶ṁ;⁶jЀ“\-/“OOo^ ”;UṖz⁶¤Y
+RsÇ€YỴz⁶Zj@€⁾||ṫ5Y

Questo fa lo stesso di prima, tranne che piuttosto che anteporre un singolo spazio per creare la prima riga vuota, crea un'intera fila di formiche in più e taglia via tutto tranne la sua riga vuota finale.


5

V , 70 , 68 byte

i \O/ 
 -O- 
 /o\ 
  ^  Àä{ò@bf }C GïpòÇÓ/d
HÄÒ çÞ/ÙÒ 
ëI|yê$p

Provalo online!

00000000: 6920 5c4f 2f20 0a20 2d4f 2d20 0a20 2f6f  i \O/ . -O- . /o
00000010: 5c20 0a20 205e 2020 1bc0 e416 7bf2 4062  \ .  ^  ....{.@b
00000020: 6620 167d 4320 1b47 ef70 f2c7 d32f 640a  f .}C .G.p.../d.
00000030: 48c4 d220 e7de 2fd9 d220 0a16 eb49 7c1b  H.. ../.. ...I|.
00000040: 79ea 2470                                y.$p

Questo non mi è mai successo prima, ma un bug noto mi ha effettivamente salvato i byte!

È un po 'difficile spiegare esattamente cosa sta succedendo, ma sfortunatamente quando provi a duplicare qualcosa per colonne, V sposta una colonna sopra prima di duplicare. Ecco perché in origine ho fatto:

h<C-v>{dÀp

che non utilizza l'operatore duplicato. Tuttavia, poiché abbiamo già bisogno di spostarci di una riga, possiamo semplicemente farlo

hÀä<C-v>{

Bello! Una potenziale nomination per lo sfruttamento dei bug: P.
Magic Octopus Urn

5

PHP> = 7.1, 150 byte

for([,$w,$n]=$argv;$i<ceil($n/$w)*5+1;)echo str_pad("| ".str_repeat(["","\O/ ","-O- ","/o\ "," ^  "][$i%5],$n<$w*ceil($i++/5)?$n%$w:$w),$w*4+2)."|\n";

Versione online


Ho riscontrato un errore facendo clic su "versione online" ed "esegui codice".
Kjetil S.

1
@KjetilS. cambia la versione di PHP in 7.1
Jörg Hülsermann,

Sì, 7.1 è ok.
Kjetil S.


4

05AB1E , 47 byte

"   \O/-O-/o\ ^ "5äðìI.D)IôvyøJ'|ì})˜¬¸«.B„ |«»

Provalo online!

Spiegazione

"   \O/-O-/o\ ^ "                                # push the ant-string
                 5ä                              # split into 5 parts
                   ðì                            # prepend a space to each
                     I.D                         # copy input-1 number of times
                        )                        # wrap in a list
                         Iô                      # split into parts each the size of input-2
                           v                     # for each row of ants
                            yø                   # zip, so body parts are on the same row
                              J'|ì               # join to string and prepend a pipe to each
                                  }              # end loop
                                   )˜            # wrap in a flattened list
                                     ¬¸«         # append a copy of the first row (spaces)
                                        .B       # pad rows to equal length with spaces
                                          „ |«   # append " |" to each row
                                              »  # merge on newlines

4

SOGL , 74 71 74 byte

 |pe4*I@*o |o→L:"╔O¦‘2n;"nΤ↕¬┐α┐PΝld‘*┼eG-’⁵@**┼ |4*┼OL→ALbe÷:?{eA}}be%:?A

Prima parte: funzione che genera una parte di registro vuota

             →L  define function L
 |p              output in a newline "|"
   e4*           multiply width by 4
      I          increace that
       @*        get that many spaces
         o       append [to current line] that
           |o    append "|"

La seconda parte ha una stringa compressa "nΤ↕¬┐α┐PΝld‘, che è la formica. Si decomprime a \-/ OOo^/-\ . Questa è la formica (con spaziatura a destra), ma presa dall'alto in basso e poi a destra come

159d
26ae
37bf
48cg

Viene memorizzato in questo modo perché la funzione aggiunge stringhe del genere (questo perché è possibile quindi moltiplicare la stringa per aggiungere più istanze ad essa). La parte stessa: funzione che richiede un numero in pila che indica quante formiche disegnare.

                                    Example input: width 3, on stack 2
:                                   duplicate the input                             [2,2]
 "╔O¦‘                              push "| | | | "                                 [2,2,"| | | | "]
      2n                            split into chunks of two                        [2,2,["| ","| ","| ","| "]]
        ;                           put one of the input copies ontop of the stack  [2,["| ","| ","| ","| "], 2]
         "...‘*                     multiply that many ants                         [2,["| ","| ","| ","| "], "\\-/ OOo^/-\\     \\-/ OOo^/-\\     "]
               ┼                    add horizontally the ants                       ["| \O/ \O/ \O/ ",
                                                                                     "| -O- -O- -O- ",
                                                                                     "| /o\ /o\ /o\ ",
                                                                                     "|  ^   ^   ^  "]
                e                   get the width                                   [["| \\O/ \\O/ \\O/ ", "| -O- -O- -O- ", "| /o\\ /o\\ /o\\ ", "|  ^   ^   ^  "], 3]
                 G-                 subtract input from it                          [["| \\O/ \\O/ \\O/ ", "| -O- -O- -O- ", "| /o\\ /o\\ /o\\ ", "|  ^   ^   ^  "], 1]
                   ’⁵@*             push 16 spaces                                  [["| \\O/ \\O/ \\O/ ", "| -O- -O- -O- ", "| /o\\ /o\\ /o\\ ", "|  ^   ^   ^  "], 1, "                "]
                       *            multiply [the 16 spaces and empty place count]  [["| \\O/ \\O/ \\O/ ", "| -O- -O- -O- ", "| /o\\ /o\\ /o\\ ", "|  ^   ^   ^  "], "                "]
                        ┼           add that horizontally                           [["| \\O/ \\O/ \\O/     ", "| -O- -O- -O-     ", "| /o\\ /o\\ /o\\     ", "|  ^   ^   ^      "]]
                          |4*┼      add 4 vertical bars to the array                [["| \\O/ \\O/ \\O/     |", "| -O- -O- -O-     |", "| /o\\ /o\\ /o\\     |", "|  ^   ^   ^      |"]]
                              O     output the array                                []
                               L    call the empty line function                    []
                                →A  define as A

E la funzione principale:

L                  call the empty line drawing function
 be÷               push floor(b/e) (the amount of full lines)
    :?{eA}}        that many times call A with the full width on the stack
           be%     push b%e (the leftovers)
              :?   if truthy (aka !=0)
                A   call A with for the leftovers

2

Perl 5 , 159 byte

($w,$n)=@ARGV;
print
$_%$w?"":"| ",
['   \O/-O-/o\\ ^ '=~/.../g]->[($_<5*$w*int$n/$w||$_%$w<$n%$w?$_/$w:0)%5],
($_+1)%$w?" ":" |\n"
for 0..$w*(6+5*int(($n-1)/$w))-1

Provalo online!

Perl 5 , 152 byte

Un altro basato sulla soluzione Python:

($w,$n)=@ARGV;
$b=' 'x($w*4+1);$j=$a="|\n|";
map$j.=' '."$_ "x($w<$n?$w:$n).'    'x($w-$n).$a,'\\O/','-O-','/o\\',' ^ 'and$n-=$w
while$n>0;
print"|$b$j$b|"

Provalo online!


0

Mathematica 210 byte

StringRiffle[If[#2==c||#2==1,"|",If[r-#1<6&&#2>2+4 (a+w-h w),Table[" ",5,4],Characters@"    \\O/ -O- /o\\  ^  "~Partition~4][[1+Mod[#1-1,5],1+Mod[#2+1,4]]]]&~Array~{r=5(h=⌈(a=#)/(w=#2)⌉)+1,c=4w+3},"\n",""]&

Pensando di dover creare un linguaggio golfistico basato su Mathematica.


0

Python 2, 166 byte

w,n=input()
print'\n'.join(['|'+' '*w*4+' |']+[' '.join(['|']+[p]*r+['   ']*(w-r)+['|'])for r in[w]*(n/w)+[[],[n%w]][n%w>0] for p in['\O/','-O-','/o\\',' ^ ','   ']])

0

Carbone , 43 byte

NθF⪪× Nθ«←P↓⁶M⊗⊕⊗θ→P↓⁶⸿E⪪\O/-O-/o\ ^ ³⭆ι⁺μκ

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

Nθ

Input w.

F⪪× Nθ«

Inserire n, quindi creare una stringa di nspazi e dividerla in righe di lunghezza w(tranne l'ultimo pezzo che può essere più piccolo). Passa sopra quelle file.

←P↓⁶M⊗⊕⊗θ→P↓⁶⸿

Stampa i lati della sezione del registro.

  \O/-O-/o\ ^           Literal string
 ⪪            ³         Split into (4) pieces of length 3
E                       Map over each piece
               ⭆ι       Map over each row space
                 ⁺μκ    Appending the piece
                        Implicitly print the results on separate lines
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.