Symetryczne Biedronki

22

Wprowadzenie:

Kiedy myślimy o Biedronkach, zwykle myślimy o czerwonym lub ciemnopomarańczowym błędzie z czarnymi plamami. Chociaż nie jest to konieczne, ponieważ są również czarne z czerwonymi / pomarańczowymi biedronkami z kropkami lub biedronki w ogóle bez plam , to głównie wyobrażamy sobie biedronki, takie jak azjatycka biedronka:

wprowadź opis zdjęcia tutaj

Należy również zauważyć, że plamy na biedronkach są prawie zawsze symetryczne. I tu pojawia się to wyzwanie.

Wyzwanie:

Biorąc pod uwagę liczbę całkowitą n( >= 0), wypisz jedną lub wiele razy następującą biedronkę ASCII-art, z symetrycznymi plamami równomiernie podzielonymi między dwie strony, a także dwie lub więcej biedronek.

Oto domyślny układ biedronki:

    _V_ 
  /(@I@)\
 /   |   \
|    |    |
 \   |   /
  ''-!-''

Jeśli n=0wyprowadzamy biedronkę powyżej taką, jaka jest.

Kiedy njest większy od zera, albo wypełniamy spacje błędu ASCII-art małymi literami o, albo zastępujemy środek |w środku wielką O. Celem jest wprowadzenie nzmian w „pustych” biedronkach, przy jednoczesnym wytwarzaniu symetrycznego wyjścia (na biedronkę) i generowaniu jak najmniejszej liczby biedronek.

Prawidłowe wyniki dla n=1:

    _V_ 
  /(@I@)\
 /   O   \
|    |    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    O    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    |    |
 \   O   /
  ''-!-''

Ale byłoby to nieprawidłowe:

    _V_ 
  /(@I@)\
 /   |   \
| o  |    |
 \   |   /
  ''-!-''

Prawidłowe dane wyjściowe dla n=2:

    _V_ 
  /(@I@)\
 /   O   \
|    O    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   O   \
|    |    |
 \   O   /
  ''-!-''

    _V_ 
  /(@I@)\
 /  o|o  \
|    |    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
| o  |  o |
 \   |   /
  ''-!-''

etc. There are a lot of possible outputs.

Pierwszym, nktóry nie jest już w stanie zmieścić się w jednej biedronce, jest n=24. W takim przypadku będziesz musiał podzielić go tak równo, jak to możliwe na dwie biedronki (możesz wybrać, czy wyprowadzać je obok siebie, czy pod sobą - z opcjonalnie jedną spacją lub jedną nową linią między nimi). Na przykład:

    _V_        _V_ 
  /(@I@)\    /(@I@)\
 /o o|o o\  /o o|o o\
|o o | o o||o o | o o|
 \o o|o o/  \o o|o o/
  ''-!-''    ''-!-''

LUB:

    _V_ 
  /(@I@)\
 /ooo|ooo\
|    |    |
 \ooo|ooo/
  ''-!-''
    _V_ 
  /(@I@)\
 /ooo|ooo\
|    |    |
 \ooo|ooo/
  ''-!-''

Zasady konkursu:

  • nbędzie w zakresie 0-1000.
  • Możesz wybrać wyjście do STDOUT, powrót jako ciąg lub tablicę / listę 2D-char itp. Twoje połączenie.
  • Wiodące znaki nowej linii lub niepotrzebne białe znaki nie są dozwolone. Dozwolone są końcowe białe spacje i pojedyncza nowa linia.
  • Jak wspomniano powyżej, gdy potrzebne są dwie lub więcej biedronek, możesz wybrać, czy mają być wyprowadzane obok siebie, czy pod sobą (lub połączenie obu ...)
  • Gdy dwie lub więcej biedronek jest drukowanych obok siebie, dozwolone jest jedno opcjonalne miejsce pomiędzy nimi. Kiedy drukowane są dwie lub więcej biedronek, dozwolona jest jedna opcjonalna nowa linia pomiędzy nimi.
  • Możesz wybrać układ biedronek na dowolnym etapie sekwencji, o ile są one symetryczne i równe wejściowi n.
  • Ponieważ celem jest wprowadzanie nzmian ORAZ jak najmniejszej liczby biedronek, zaczniesz używać więcej niż jednej biedronki, gdy będziesz wyżej n=23. Układ tych biedronek nie musi być taki sam. W rzeczywistości nie jest to nawet możliwe w przypadku niektórych danych wejściowych, takich jak n=25lub n=50wymienić dwa.
  • Ponadto czasami nie jest możliwe równomierne podzielenie kropek na dwie lub więcej biedronek. W takim przypadku musisz podzielić je możliwie równomiernie, z różnicą co najwyżej 1.

Tak więc, biorąc n=50pod uwagę dwie ostatnie zasady, byłby to prawidłowy możliwy wynik (gdzie pierwszy błąd ma 16 miejsc, a pozostałe dwa mają 17):

    _V_        _V_        _V_ 
  /(@I@)\    /(@I@)\    /(@I@)\
 /oooOooo\  /   O   \  /o oOo o\
|ooooOoooo||ooooOoooo||o ooOoo o|
 \   |   /  \oooOooo/  \o oOo o/
  ''-!-''    ''-!-''    ''-!-''

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i zwracanymi typami, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem swojego kodu.
  • W razie potrzeby dodaj również wyjaśnienie.
Kevin Cruijssen
źródło
Co rozumiesz przez „jak najmniej zmian” dla pustej biedronki? Umieszczając n (<24) liter o / O na jednej biedronce, wprowadzasz n zmian. Czy masz na myśli zmiany z n-1 na n (więc wyjścia różnią się tak mało, jak to możliwe, gdy wejścia różnią się o 1)?
Heimdall,
@Heimdall Ach przepraszam za zamieszanie z powodu złego sformułowania. To wtedy wpadłem na pomysł, aby pozwolić wielu postaciom stworzyć jedno miejsce, kiedy pomyślałem o tym wyzwaniu, ale porzuciłem to i po prostu użyłem oi Ozamiast tego. Trochę zmieniłem brzmienie.
Kevin Cruijssen
Na n=50przykład uważam, że masz na myśli, że pierwszy błąd ma 16 miejsc, a pozostałe dwa mają po 17.
Jon Claus
To mój ulubiony album Jimi Hendrix.
Przywróć Monikę iamnotmaynard
@iamnotmaynard Może brakuje mi czegoś oczywistego lub skomentowałeś złe wyzwanie? Naprawdę nie widzę związku między Jimi Hendrix a biedronkami ..
Kevin Cruijssen

Odpowiedzi:

5

Węgiel drzewny , 84 81 bajtów

Nθ≔⌈∕∨θ¹¦²³ηFη«≔⁺÷θη‹ι﹪θηζV_¶I@)↘²↙|/←''-↑!↑⎇›ζ²¹OO²§|OζE037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧↙»‖B←

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

Nθ

Podaj całkowitą liczbę miejsc.

≔⌈∕∨θ¹¦²³η

Oblicz potrzebną liczbę biedronek.

Fη«

Pętla nad każdą biedronką.

≔⁺÷θη‹ι﹪θηζ

Oblicz liczbę miejsc do umieszczenia na tej biedronce.

V_¶I@)↘²↙|/←''-↑!

Wydrukuj głowę i prawe skrzydło biedronki.

↑⎇›ζ²¹OO²

Jeśli jest więcej niż 21 miejsc, wydrukuj dwa miejsca, w przeciwnym razie wydrukuj na odwrocie.

§|Oζ

Jeśli liczba miejsc jest nieparzysta, wydrukuj inne miejsce, w przeciwnym razie wydrukuj resztę tyłu.

E037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧

Podziel liczbę miejsc przez dwa i rozdziel je na trzy rzędy po 3, 4 i 3 miejsca.

↙»

Przejdź na początek następnej biedronki.

‖B←

Odbij płótno po lewej stronie, trzymając plecy.

Neil
źródło
8

Python 2 , 252 249 238 212 211 213 209 bajtów

n=input()
x=(n+22)/23or 1
for i in range(x):b=n/x+(n%x>i);c=r"""    _V_
  /(@I@)\
 /361%s163\
|408717804|
 \5201025/
  ''-!-''"""%'|O'[b%2];i=0;exec"c=c.replace(`i%9`,' |oO'[i>9::2][i<b/2],2);i+=1;"*11;print c

Wypróbuj online!

  • Zaoszczędzono 9 bajtów dzięki Kevinowi Cruijssenowi
  • Zaoszczędzono 18 bajtów dzięki Mr. Xcoder
  • Zaoszczędź 2 bajty dzięki Jonathanowi Frechowi
TFeld
źródło
Myślę, że możesz zamiast tego usunąć .replace('A','|O'[b%2])i użyć c=" _V_\n /(@I@)\ \n /361"+'|O'[b%2]+"163\ \n|4087B7804|\n \\529B925/\n ''-!-''"?
Kevin Cruijssen
230 bajtów , zamieniając się [' o','|O'][i>9]w ' |oO'[i>9::2]i używając |zamiast logicznego lub. Również przechodząc for i in range(11)do execinstrukcji zapisano 4 bajty.
Pan Xcoder,
1
I przepraszam za bałagan w komentarzach, ale 218 bajtów , mieszając rozumienie listy z forpętlą, usuwając również niepotrzebną zmienną.
Pan Xcoder,
@ Mr.Xcoder Wielkie dzięki :)
TFeld
Ma produkować jak najmniej biedronek, prawda? Kiedy wstawiam 24 do 46 na TIO, daje 3 biedronki zamiast dwóch.
Nick Matteo,
7

JavaScript (ES6), 183 186 bajtów

Używa tej samej formuły, co odpowiedź TFelda, aby rozdzielić miejsca między biedronki.

n=>(g=k=>k--?`    _V_
  /(@I@)\\
 /3\\
|4|
 \\3/
  ''-!-''
`.replace(/\d/g,i=>(h=s=>i--?h((p=N?(N-=2,'o'):' ')+s+p):s)('|O'[N>2*i|N&1&&+!!N--]),N=(n%j>k)+n/j|0)+g(k):'')(j=n/23+.99|0||1)

Próbny

Arnauld
źródło
6

Befunge, 292 279 bajtów

#j07-00p&>::1-27*9+/\!!*:1+06pv-1_@#:<<g61$<<:
v"h"**95%2:+`g61%g60\/g60::p61<>-0g*+35*-,:!|
>\-30p2/:55+`:59**"g"\-40p-26pv^*84\!`"."::<<9
v\%+55+g62:%+55+4*g62:::-1<+55<>:"/n"$#->#<^#<
>`26g!+"O"*"Y"\-\-\5+0p:>#^_" 66<0<66// >,-"v
"n //>7OXO8k />'&%$%&'k !(*+)#)+*(! /k,-.$."<v

Wypróbuj online!

Wyjaśnienie

Sztuka ASCII dla biedronki jest zakodowana w jednym ciągu Befunge, przesuniętym o 15, aby umożliwić zarezerwowanie pierwszych 15 znaków do druku do specjalnych celów. Pierwsze dwa z tych znaków specjalnych reprezentują znak nowej linii i |znak, które w innym przypadku nie byłyby możliwe do wydrukowania. Trzeci nie jest używany, ponieważ jest to" , którego nie można użyć w ciągu. Następne dwa przedstawiają duże plamy w centrum. Pozostałe dziesięć dotyczy miejsc na skrzydłach.

Te znaki specjalne są tłumaczone do ostatecznej postaci za pomocą tabeli odnośników, która jest zapisana w pierwszej części pierwszego wiersza.

Aby ułatwić wyjaśnienie, jest to kod z wyróżnionymi różnymi częściami składowymi:

Kod źródłowy z podświetlonymi ścieżkami wykonania

*Zaczynamy od zainicjowania nowej linii i |znaku w tabeli odnośników, ponieważ są one stałe.
*Następnie odczytujemy liczbę miejsc ze standardowego wejścia i obliczamy liczbę wymaganych biedronek.
*Następnie możemy uruchomić zewnętrzną pętlę dla zestawu błędów, obliczając liczbę miejsc do renderowania następnej biedronki.
*Dla każdej biedronki obliczamy, czy należy wyświetlić duże środkowe miejsce (jeśli spots%2 == 1), i zapisujemy odpowiednią wartość w tabeli odnośników.
*Podobnie obliczamy, czy należy wyświetlić drugą parę dużych punktów (jeśli spots/2 > 10), ponownie aktualizując tabelę wyszukiwania. Obliczamy również pozostałe miejsca wymagane na każdym skrzydle.
*Ostatnią częścią inicjalizacji tabeli odnośników jest pętla, która oblicza, które z małych miejsc należy wyświetlić. Zasadniczo algorytm jest następujący: jeśli (spotnum*spotcount+4)%10 > ((spotnum+1)*spotcount+4)%10, to miejsce musi zostać wyświetlone.
*Następnie wypychamy zakodowaną reprezentację ciągu biedronki na stos. Zasadniczo jest to zwykły ciąg, ale stał się nieco skomplikowany, gdy próbowałem wycisnąć go w luki w kodzie, aby źródło utworzyło prostokąt.
*W tym momencie jesteśmy gotowi rozpocząć pętlę wyjściową, przetwarzając znaki jeden po drugim, konwertując przypadki specjalne (plamy, podziały linii itp.) Za pomocą wcześniej utworzonej tabeli odnośników.
*Na koniec sprawdzamy, czy pokazaliśmy wszystkie wymagane biedronki, w przeciwnym razie przejdźmy do początku zewnętrznej pętli.

James Holderness
źródło
Fajnie, bardzo podobają mi się wzory twoich biedronek dla każdego etapu od 1 do 23. Zupełnie inne niż niektóre inne odpowiedzi. +1 ode mnie Czy mógłbyś dodać wyjaśnienie (po zakończeniu gry w golfa)?
Kevin Cruijssen
1
Cieszę się, że podobały ci się wzory. Spędziłem sporo czasu na wypróbowywaniu różnych kombinacji, aby znaleźć algorytm, który wyglądałby dobrze na jak największej liczbie etapów. Dodałem też trochę wyjaśnienia do mojej odpowiedzi.
James Holderness
3

Ruby , 203 193 190 bajtów

f=->n{s=%q{    _V_ 
  /(@I@)\
 /137x731\
|0596x6950|
 \248x842/
  ''-!-''
}
n-=d=n>0?n/(1+~-n/23):0
s.gsub!(/\d/){$&.to_i<d/2??o:' '}
x=[d%2,d<=>21]*2
s.gsub!(?x){"|O|"[x.pop]}
n>0?s+f[n]:s}

Wypróbuj online!

  • Zaoszczędź 10 bajtów dzięki Jordanowi
Przywróć Monikę iamnotmaynard
źródło
{|m|m.można zastąpić {$&.; b=(n-1)/23+1można zastąpić b=1+~-n/23; i x=[z=d>21,d%2>0,z]⏎s.gsub!(?x){x.pop ? ?O:?|}można go zastąpić x=[d%2,d<=>21]*2⏎s.gsub!(?x){"|O|"[x.pop]}.
Jordania,
Możesz zapisać kolejny bajt, używając %q{XY}zamiast 'X'+"Y"w pierwszych ośmiu wierszach i kilka innych, wykonując d=n>0?n/(b=1+~-n/23):b=0zamiast n>0?d=n/(b=(n-1)/23+1):d=b=0.
Jordania,
@Jordan Wow, dziękuję.
Przywróć Monikę iamnotmaynard