Wspinaj się do Ameryki

11

Teraz, gdy inni użytkownicy pomogli Trumpowi zbudować ścianę , czas wspiąć się na nią.

Jest to wyzwanie w stylu ascii, w którym musisz wykonać ścianę wspinaczkową z losowo umieszczonymi uchwytami.

Ściana wspinaczkowa składa się z paneli, z których każdy ma od 3 do 10 uchwytów i ma 5 paneli wysokości. Każdy panel ma 4 znaki i 10 znaków

Używamy |do reprezentowania boku ściany (arête) i a -do reprezentowania krawędzi paneli. Narożniki paneli są oznaczone symbolem, +a uchwyty są oznaczone jako o.

Wreszcie, ściana musi mieć America!na górze i Mexicona dole.

Twój program nie powinien pobierać danych wejściowych, chyba że jest wymagany do uruchomienia i powinien wypisać coś, co wygląda podobnie do poniższego

To jest przykładowy wynik:

  America!
+----------+
|  o       |
|    o o   |
| o    o   |
|  o    o  |
+----------+
|  o       |
|    o o   |
| o    o   |
|  o    o  |
+----------+
|  o       |
|    o o   |
| o    o   |
|  o    o  |
+----------+
|  o       |
|    o o   |
| o    o   |
|  o    o  |
+----------+
|  o       |
|    o o   |
| o    o   |
|  o    o  |
+----------+
   Mexico

Może to być myląco przedstawione, więc jego struktura jest bardziej przejrzysta poniżej

Wejście

Zilcho. Nie powinieneś brać absolutnie danych wejściowych.

Wynik

Ascii-art ścianka wspinaczkowa złożona z 5 paneli, każda z 6 liniami po 12 kolumn z America!wyśrodkowanym u góry i Mexicowyśrodkowanym u dołu. Każdy panel ma identyczny wzór, który jest generowany losowo przez program. Wzór panelu składa się z losowo rozmieszczonej losowej liczby chwytów, od 3 do 10.

Zasady

  • Brak danych wejściowych
  • Powiedziałbym „brak wbudowanych”, ale jeśli twój język ma wbudowane do tego, automatycznie zaakceptuję go jako zwycięzcę.
  • To jest więc wygrywa najkrótszy kod (w bajtach).
  • Wyjście bez blokad musi być dokładnie takie samo jak powyżej, ponownie bez blokad.
  • Losowy jest tu zdefiniowanym losowym
Cairney Coheringaahing
źródło
5
Czy losowe oznacza równomiernie losowe, czy też każdy możliwy układ potrzebuje po prostu niezerowej szansy wystąpienia, czy też po prostu muszę mieć co najmniej dwie możliwości?
Pavel
@ Notts90 Powinny być takie same i losowo wybierać ilość. Zostało to wspomniane w poście, ale losowość nie jest zdefiniowana.
Pavel
2
Nadal uważam, że byłoby to lepsze wyzwanie, gdyby każdy panel musiał być inny.
Shaggy
3
To właśnie jest mój problem z piaskownicą. Miałem to wyzwanie przez ponad miesiąc i właśnie postanowiłem wyczyścić tam swoje posty. Więc zamieszczam to, myśląc, że każdy problem został rozwiązany i tak się dzieje!
caird coinheringaahing
1
@WORNGALL Fałszywe wiadomości! Kłamstwa! Losowanie jest bardzo ważne. Trumpscript ma NAJLEPSZY GENERATOR RANDOMU, jaki kiedykolwiek widziałeś. (Wszystko, co musisz zrobić, to link do twitterowego kanału prezydenta!)
Level River St

Odpowiedzi:

5

Galaretka , 65 57 bajtów

Pierwsze użycie literałowego ciągu liczb całkowitych o dwóch liczbach całkowitych ( ⁽¥0= 2049)

⁽¥0ṃ⁾+-W
“K2X)»Ṅø40RẊ<8X+3¤s⁵ị⁾o j@€⁾||Yṭ¢µṄ€5¡Ṗ;⁷“Ç€:;#»

Pełny program nie wymaga wprowadzania danych i drukowania ściany.

Wypróbuj online!

W jaki sposób?

⁽¥0ṃ⁾+-W - Link 1, panel separator: no arguments
⁽¥0      - literal 2049
    ⁾+-  - literal "+-"
   ṃ     - convert 2049 to base "+-" as if they were [1,0]
       W - wrap in a list   -> ["+----------+"]

“K2X)»Ṅø40RẊ<8X+3¤s⁵ị⁾o j@€⁾||Yṭ¢µṄ€5¡Ṗ;⁷“Ç€:;#» - Main link: no arguments
“K2X)»                                           - "  America!"
      Ṅ                                          - print with line feed
       ø                                         - niladic chain separation
        40                                       - literal 40
          R                                      - range -> [1,2,...,40]
           Ẋ                                     - random shuffle
                 ¤                               - nilad and link(s) as a nilad:
             8X                                  -   random integer between 1 and 8
                3                                -   literal 3
               +                                 -   add
            <                                    - less than? (vectorises)
                   ⁵                             - literal 10
                  s                              - split into chunks of length 10
                     ⁾o <-- a space              - literal "o "
                    ị                            - index into
                           ⁾||                   - literal "||"
                        j@€                      - join with reversed @rguments
                              Y                  - join with line feeds
                                ¢                - call last link (1) as a nilad
                               ṭ                 - tack left to right
                                 µ               - call that p... (monadic chain separation)
                                    5¡           - repeat five times:
                                   €             -   for €ach (separator & panel)
                                  Ṅ              -     print with trailing line feed(separator and panel):
                                      Ṗ          - pop (just the separator now)
                                        ⁷        - literal line feed
                                       ;         - concatenate
                                                 - unused value printed
                                         “Ç€:;#» - "   Mexico"
                                                 - implicit print
Jonathan Allan
źródło
4
To najdłuższy program na galaretki, jaki kiedykolwiek widziałem.
Pavel
Dwuznaczność została zmieniona. Zdecydowałem z 3-10, aby pozwolić ci zostać.
caird coinheringaahing
+1 za )o <-- a space. Naprawdę mnie rozśmieszył!
caird coinheringaahing
@Phoenix jest krótszy, ale nic nie poradzę, ale myślę, że powinien być jeszcze krótszy.
Jonathan Allan
@ Satan'sSon to prawie statek kosmiczny!
Jonathan Allan
4

PHP, 138 bajtów

<?=($p=str_pad)("  America!",349,strtr("
+----------+
|0|
|1|
|2|
|3|",str_split(str_shuffle($p($p(o,rand(3,10),o),40)),10)))."   Mexico";

Wypróbuj online!

Rozszerzony

<?=($p=str_pad)("  America!",349, 
#fill the string till a length of 349 with
strtr("
+----------+
|0|
|1|
|2|
|3|",
# before replace the digits with strings in the array
str_split(str_shuffle($p($p(o,rand(3,10),o),40)),10))) 
# make a string with o length 3- 10 fill it with spaces to length 40
# shuffle the resulting string and split it into a array of strings with length 10
."   Mexico"; # add the end
Jörg Hülsermann
źródło
4

JavaScript (ES6), 194 160 bajtów

(h=0,g=p=>h>2?p:g(p.replace(/ /g,_=>" o"[(h+=s=Math.random()>.8)<11&s])))=>`  America!
${t=`+----------+
`}${g(`|          |
`.repeat(4)+t).repeat(5)}   Mexico`

Spróbuj

Wzór bloków będzie się zmieniać co 2 sekundy we fragmencie poniżej.

f=
(h=0,g=p=>h>2?p:g(p.replace(/ /g,_=>" o"[(h+=s=Math.random()>.8)<11&s])))=>`  America!
${t=`+----------+
`}${g(`|          |
`.repeat(4)+t).repeat(5)}   Mexico`
o.innerText=f()
setInterval("o.innerText=f()",2e3)
<pre id=o>


Wyjaśnienie

  • Tworzymy anonimową funkcję, która choć nie wymaga żadnych danych wejściowych, ma 2 parametry z wartościami domyślnymi:
    • h, któremu podano wartość początkową 0; spowoduje to zliczenie liczby blokad w panelu, gdy przejdziemy do ich dodania.
    • g, która jest funkcją rekurencyjną, której użyjemy do utworzenia losowego wzoru blokad na panelu. Wrócimy do tego za chwilę.
  • W głównej funkcji funkcji wypisujemy literał szablonu, zaczynając od America!\n.
  • Następnie tworzymy panel divider ( +----------+\n) i przypisujemy go do zmiennej t, dodając go do wyniku w procesie.
  • Następnie tworzymy pojedynczy wiersz panelu ( | |\n), powtarzamy go 4 razy i dołączamy t.
  • Wywołujemy g, przekazując ciąg z powyższego kroku jako argument, poprzez parametr p.
  • Teraz dla wzoru wstrzymania. W ciągu g:
    • Sprawdzamy, czy h>2(tj. Czy mamy 3 lub więcej blokad).
    • Jeśli tak, zwracamy ciąg p.
    • Jeśli nie, dzwonimy gponownie, tym razem przekazując zmodyfikowaną kopię pargumentu.
    • Zmodyfikowana kopia pma zastosowaną replacemetodę, zastępując wszystkie <space>znaki a <space>lub a o, odwołując się do indeksu znaków (0 lub 1) ciągu <space>o.
    • Indeks znaków określamy na podstawie
      1. Wywołanie Math.random(), które zwraca liczbę dziesiętną od 0 do 1, wyłączne.
      2. Sprawdzanie, czy jest to większa niż .8. Mając 40 pól w panelu i maksymalnie 10 chwytów, poprawia to rozkład chwytów w panelu (.75 byłoby bardziej dokładne, ale mam nadzieję, że pozwolisz mi na ustępstwo ze względu na zapisywanie bajtu!).
      3. Wartość logiczna tego czeku jest przypisana do zmiennej s.
      4. sjest przymuszany do liczby całkowitej (0 lub 1) i dodawany do h.
      5. Sprawdzamy, czy hjest teraz mniej niż 11 (tj. Czy obecnie mamy mniej niż 10 blokad) i czy sbyło to prawdą.
      6. Ta wartość logiczna jest z kolei wymuszana na liczbę całkowitą, co daje nam indeks w ciągu.
  • Wróć do naszej produkcji! Powtarzamy ciąg zwrócony g5 razy.
  • A następnie po prostu dodaj Mexicona końcu łańcucha, aby zakończyć. Uff!

Alternatywny

I po prostu dlatego, że myślałem, że byłoby to miłym dodatkiem do wyzwania: dla zaledwie 12 dodatkowych bajtów możemy mieć unikalny wzór blokad na każdym panelu, zamiast wszystkich identycznych.

(g=(p=`|          |
`.repeat(4)+t,h=0)=>h>2?p:g(p.replace(/ /g,_=>" o"[(h+=s=Math.random()>.8)<11&s]),h))=>`  America!
${t=`+----------+
`}${g()+g()+g()+g()+g()}    Mexico`

Spróbuj

Ponownie wzory bloków będą się zmieniać co 2 sekundy.

Kudłaty
źródło
3

Pyth - 58 57 bajtów, ewentualnie 47

Ks(b\+*\-T\+*+++b\|*dT\|4)J<.SxdmdK+3O8+*s.e?/Jk\obK5<K13

Spróbuj

Wyjaśnienie starego rozwiązania (zaktualizuję, kiedy będę miał czas):

J+++b\+*\-T\+K+J*+++b\|*dT\|4=Y<.SxdmdK+3O8+*s.e?/Yk\obK5J
J+++b\+*\-T\+                                                Create the +----------+, and store as J
             K+J*+++b\|*dT\|4                                Create a full panel (minus bottom border, and without holes), store as K
                                  xdmdK                      Get indices of spaces
                                .S                           Create random permutation of these indices
                               <       +3O8                  Get first several indices (a random number from 3 to 10)
                                             s.e?/Yk\obK     Replace space with 'o' at these indices
                                           +*           5J   Create 5 copies, and add bottom border

Myślę, że mogę zdobyć 47, jednocześnie technicznie przestrzegając zasad:

JhO2Ks(b\+*\-T\+*+++b\|.S+*\oJ*d-TJ\|4)+*K5<K13

Tutaj liczba otworów jest nadal losowo wybierana (ze zbioru {4,8}), a konfiguracja tych otworów jest losowo wybierana (ze zbioru konfiguracji, w których każdy rząd jest identyczny)

Spróbuj

Maria
źródło
2

Mathematica, 201 bajtów

c=Column;s=RandomSample[Tuples[{" ",o," "," "},10],4];t="+----------+";w=c[{t,c[Row/@Table[AppendTo[s[[i]],"|"];PrependTo[s[[i]],"|"],{i,Length@s}]]}];c[Flatten@{"  America!",Table[w,5],t,"   Mexico"}]
J42161217
źródło
+1 za używanie języka, którego nie mogę przetestować?
caird coinheringaahing
@ Satan'sSon, możesz uruchomić większość programów Mathematica za darmo tutaj w Wolfram Sandbox. (Wklej i wciśnij Shift-Enter.)
To nie drzewo
Jeśli chodzi o drukowanie, ta strona drukuje w zabawny sposób. Wyjście jest zniekształcone, ponieważ wykorzystuje specjalne
charachters
1

PowerShell (255 bajtów)

echo "  America!"
for($l=0;$l-lt4;$l++){$a=," "*12;$a[0]="|";$a[11]="|";$i=get-random -Max 10 -Min 6;$j=get-random -Max 5 -Min 1;$a[$i]=$a[$j]="o";$b+=($a-join"")}
for($k=0;$k-lt5;$k++){echo +----------+($b-join"`n")} 
echo +----------+`n"   Mexico" 
Sivaprasath Vadivel
źródło
1

Python 2 , 259 224 221 218 bajtów

from random import*
b=[' ']*40
for x in sample(range(40),randint(3,10)):b[x]='o'
a=["+"+"-"*10+"+"]+['|'+''.join(o)+'|'for o in[b[x*10:x*10+10]for x in 0,1,2,3]] 
print'\n'.join(['  America!']+a*5+[a[0]]+['   Mexico'])

Wypróbuj w repl.it

-35 w tym kilka wskazówek od @ Satan'sSon - dzięki!

-3 dzięki dzięki @Wondercricket

ElPedro
źródło
czy możesz zapisać bajty, po prostu wypisując je tzamiast zapisywać w zmiennej i jeśli usuniesz spacje po America!i Mexico? print" America!" <NEWLINE> d,a,b,c=[" Mexico"],["+"+"-"*10+"+"],[" "]*40,0?
caird coinheringaahing
Dzięki @ Satan'sSon. To była „przerwa na lunch” i prawdopodobnie będę mogła grać w golfa o wiele więcej, kiedy będę miał czas. Jeszcze raz dziękuję za podpowiedzi.
ElPedro
Możesz także zapisać kilka bajtów, zmieniając import na from random import*i usuwając r.z funkcji
Wondercricket
Dzięki @Wondercricket. Nie jestem pewien, jak udało mi się tęsknić :)
ElPedro
Szatan był pomocny! (Pierwszy i ostatni raz na wszystko> :(
caird coinheringaahing
0

Python 2, 197 bajtów

from random import*
n=randint(3,10)
s=list('o'*n+' '*(40-n))
shuffle(s)
t=10
S='+'+'-'*t+'+'
print'\n'.join(['  America!']+([S]+['|'+''.join(s[x:x+t])+'|'for x in range(0,40,t)])*5+[S,'   Mexico'])
TFeld
źródło