Zbuduj Tornado


31

Według mnie tornado wygląda następująco:

########
#######
 ######
  #####
   ####
   ###
    ##
     #

To tornado zaczyna się od szerokości ni w każdym następnym wierszu znak jest usuwany z lewej lub prawej strony, w zależności od danych wejściowych.

Wkład

Dane wejściowe będą listą dowolnych dwóch dowolnych wartości (ciąg dwóch unikalnych znaków również działa) i opcjonalną dodatnią liczbą całkowitą wskazującą szerokość początkową. Jeśli nie zostanie wybrana opcjonalna liczba całkowita, szerokość początkowa jest o 1 większa niż długość listy. Niech szerokość początkowa będzie n.

Jak zrobić tornado

W moim przykładzie wybieram moją listę, aby zawierała 1s i 0s, chociaż możesz wybrać dowolne dwie różne stałe wartości lub ciąg dowolnych dwóch różnych stałych znaków.

Pierwszy wiersz będzie się składał z ninnych niż białe znaki (możesz wybrać dowolny spójny znak; wybrałem #na przykład).

Następnie, dla każdego numeru na liście, jeśli jest nim 0, usuń lewy znak i utwórz nowy wiersz; jeśli to 1, usuń odpowiedni znak i utwórz nowy wiersz.

Tak więc powyższe tornado jest wyjściem dla 8, [1, 0, 0, 0, 1, 0, 0].

Wydajność

Dane wyjściowe mogą być listą ciągów, listą znaków lub łańcuchem wielowierszowym. Końcowe białe znaki w każdej linii są dozwolone, a końcowy nowy wiersz na końcu jest dozwolony.

Przypadki testowe

Te przypadki testowe obejmują szerokość początkową i listy zastosowań 1, 0.

5, [1,0,0,1]

#####
####
 ###
  ##
  #

10, [1,0,0,1,0,1,0,0,1]

##########
#########
 ########
  #######
  ######
   #####
   ####
    ###
     ##
     #

7, [1,1,1,1,1,1]

#######
######
#####
####
###
##
#

100,
 [1,0,0,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,1,0,0,1,1,0,1,1,1,1,0,1,0,1,1,0,0,1,0,1,1,0,0,1,1,1,0,0,1,1,1,1,1,0,0,0,1,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,1,0,0,0,0,1,1,1,1,0,1,0,1,0,0,1,1,0,0,0,0,1]

Długa walizka testowa

Zasady

  • Obowiązują standardowe luki
  • Najkrótszy kod w bajtach wygrywa!
  • Tło nie musi być spacją (zapomniałem podać to wcześniej).
  • Twój język musi obsługiwać tylko liczby (szerokości), które może obsłużyć, ale jeśli Twój tłumacz został przepisany z większym rozmiarem liczb, musi teoretycznie działać.

Wdrożenie referencyjne


3
Z twoich przykładów wynika, że ​​początek zawsze będzie o 1 większy niż długość listy. Czy możemy mieć przykład, w którym tak nie jest? Czy szerokość początkowa może być mniejsza niż długość listy?
Charlie,

@CarlosAlejo Nie ... To nie ma wtedy sensu, ponieważ wtedy nie będziesz mieć wystarczająco dużo elementów do usunięcia na końcu ...
HyperNeutrino

4
Okulary, które @HyperNeutrino widział podczas swojego pierwszego tornada: i.imgur.com/TzMm94a.png
Magic Octopus Urn

@MagicOctopusUrn ... lol
HyperNeutrino

Odpowiedzi:



9

Python 2 , 66 59 bajtów

-7 bajtów dzięki Arnoldowi Palmerowi

x,z=input()
for i in range(x):print' '*sum(z[:i])+'#'*(x-i)

Wypróbuj online!

0usunąć z prawej strony, 1aby usunąć z lewej strony


1
ninja'd me: (((
Koishore Roy

Ten sam człowiek: /
Arnold Palmer

Zapisz 7 bajtów zamieniając len(z)+1ze xjeśli „opcjonalnych dodatnia” oznacza, że nie trzeba go używać. Brzmienie pytania sprawia, że ​​brzmi to tak, jak to jest dozwolone, ponieważ mówi „Jeśli nie zostanie wybrana opcjonalna liczba całkowita” w porównaniu z „Jeśli nie podano opcjonalnej liczby całkowitej”.
Arnold Palmer,

6

vim, 85 82 bajtów

o"cp:s/#/ <C-v><CR>0"cy$<ESC>"ayy7hR$/<ESC>"bdd:s/[][, ]\+/<C-v><CR>@/g<CR>ggAa#<C-v><ESC><ESC>^D@"^"cy$:2,$:norm D@"

<ESC>to 0x1B, <CR>to 0x0D, <C-v>to 0x16. I <ESC>OHjest sekwencją wielobajtową reprezentującą klucz HOME.

Dane wejściowe są używane ajako wartość „usuń z lewej” i bjako wartość „usuń z prawej”.

" @a will remove from the left; @b will remove from the right.
o"cp:s/#/ <C-v><CR>0"cy$<ESC>"ayy
7hR$/<ESC>"bdd

" split the input into digestible chunks
:s/[][, ]\+/<C-v><CR>@/g<CR>
gg

" Create the first line
Aa#<C-v><ESC><ESC>
^D
@"^"cy$

" Create tornado
:2,$:norm D@"

Niestety nie ma linku do TIO. Nie mogłem sprawić, by działał pod V. Test, kopiując kod do tornado.vim (zastępując <ESC>itp. Ich rzeczywistymi bajtami) i uruchamiając w następujący sposób:

$ echo '8, [b, a, a, a, b, a, a]' > a.txt
$ { cat tornado.vim; echo ':wq'; } | vim a.txt
$ cat a.txt

-3 bajty z powodu sugestii Neila.


Nie możesz użyć ^zamiast ␛OH?
Neil

@Neil ^przechodzi do pierwszego niepustego znaku. ␛OHidzie do pierwszej postaci.
Ray

1
Ach, przepraszam, nie miałem na myśli 0...
Neil,

@Neil W takim przypadku tak, powinienem to zrobić. Dzięki.
Ray

5

05AB1E , 11 9 bajtów

-2 bajty dzięki Erikowi Outgolfer

0×=²v¨yú=

Usuń od lewej: 1
Usuń od prawej:0

Wypróbuj online!

0×        # Make a string of n 0s
  =       # Print without popping
   ²v     # For each character in input (call it y):
     ¨    #   Remove the last character of the current string
      yú  #   Pad with y spaces
        = #   Print without popping

0×ηsηOma tak duży potencjał, ale nie potrafię tego rozgryźć poniżej 11 bajtów.
Magic Octopus Urn

Te ostatnie Version I ðy×ìz o-2.
Erik the Outgolfer

4

Siatkówka , 30 28 bajtów

.?
$`#$&$'¶
T`d`#`#.*
T`d` _

Wypróbuj online! Pobiera tylko ciąg zer i jedynek i oblicza szerokość na podstawie ciągu. Objaśnienie: Pierwszy etap pobiera ciąg wejściowy i kopiuje go jeden raz dla każdego punktu granicznego, wstawiając #w tym punkcie. Drugi etap następnie zmienia wszystkie cyfry po #kolejnych #s, tworząc trójkąt. Trzeci stange następnie usuwa wszystkie pozostałe i zmienia zera na spacje, co powoduje „kołysanie” torndao.


3

J, 32 bajty

' #'#~[:(],.1+i.@-@#)0,(+/\@:-.)

bez golfa

' #'#~ [: ( ] ,. 1+i.@-@# )  0 , (+/\ @: -.)

Wypróbuj online!


19 bajtów ' #'#~0(,.#\.)@,+/\, w których dane wejściowe są odwrócone od próbki, ponieważ wyzwanie pozwala wybrać dwie różne wartości.
mile

@miles ty za to i twój inny komentarz. naprawdę je doceniam i proszę, nie przestawajcie.
Jonasz


3

R , 85 82 bajtów

3 bajty zapisane dzięki Giuseppe

function(n,l)for(k in 1:n)cat(rep(" ",sum(c(0,l)[1:k])),rep("%",n-k+1),"
",sep="")

Wypróbuj online!

Wyjaśnienie:

function(n,l){
  for(k in 1:n){                      # Proceed line by line
    cat(                              # Concatenate...
        rep(" ",sum(c(0,l)[1:k])),    # ...required number of leading spaces,...
        rep("%",n-k+1),               # ...required number of tornado characters...
        "\n",                         # ...and a new line.
        sep=""                        # Join without spaces
        )
  }
}

Wiedziałem, że zrobienie matrycy nie jest najlepszą opcją!
Giuseppe,

1
82 bajty - wygoliłem {}i użyłem dosłownie nowego wiersza zamiast'\n'
Giuseppe

3

Haskell, 50 bajtów

h n=scanl(\s i->[(' ':),id]!!i$init s)$'#'<$[1..n]

Wypróbuj online!

Jeśli lista wejściowa może być listą nazw funkcji, możemy zapisać bajt

Haskell, 49 bajtów

f=id
g=(' ':)
h n=scanl(flip id.init)$'#'<$[1..n]

Przykład użycia: h 5 [g,f,f,g].

Wypróbuj online!

Jak to działa:

           '#'<$[1..n]   -- build the first line of the tornado, i.e. n times '#'
scanl(    )              -- repeatedly apply the given function to the starting
                         -- value and the next element of the input list and
                         -- return a list of the intermediate results
  \s i->                 -- the function takes a string s and a number i
            init s       -- and first drops the last element of s
      [    ]!!i          -- and then picks and apply a funtion from the list
        (' ':)           --  i = 0:  prepend a space
        id               --  i = 1:  do nothing

2

Python 2, 58 57 bajtów

edycja: zapisano 1 bajt dzięki xnor

l,a=input()
s="#"*l
for i in a+[0]:print s;s=" "*i+s[:-1]

Wypróbuj online!

1, aby usunąć z lewej strony, 0, aby usunąć z prawej strony.


1
Myślę, że można to zrobić za s=" "*i+s[:-1]pomocą zamiany lewej i prawej.
xnor

2

R , 116 109 102 bajtów

-5 bajtów dzięki user2390246 (i kolejne 2 uratowałem siebie)

Outgolfed by user2390246

function(n,l){k=cumsum
m=matrix(' ',n,n)
for(i in 1:n)m[k(c(1,!l))[i]:k(c(n,-l))[i],i]='#'
write(m,'',n,,'')}

Wypróbuj online!

Zwraca anonimową funkcję, która bierze ni wektor lz 0do usuwania z lewej i 1do usuwania z prawej, i drukuje wynik na konsoli z odpowiednim formatowaniem.


1
Możesz zaoszczędzić trochę na obliczaniu końca linii, ponieważ wiesz, że liczba #s będzie n-i + 1: Wypróbuj online! Chociaż jest nieco lepsze podejście, jeśli drukujesz wiersz po wierszu zamiast konstruować matrycę: codegolf.stackexchange.com/a/133720/66252
user2390246

@ user2390246 bardzo miło! Udało mi się też zgolić kolejną parę bajtów :)
Giuseppe,

2

Japt , 14 13 bajtów

-1 bajt dzięki @ETH

å+ uP £X+QpV´

Dane wejściowe to tablica, a następnie rozmiar. Wartościami tablic są ""lub " ", które reprezentują usuwanie odpowiednio z prawej lub lewej strony. Używa "zamiast #i zwraca jako tablicę ciągów.

Chodziło o to, aby najpierw utworzyć tablicę lewego wypełnienia dla każdej linii, stąd ciągi wejściowe. Następnie do każdego wiersza "dodaje się s, wykorzystując fakt, że ilość "s zmniejsza się za każdym razem o 1.

Wypróbuj online!

Wszystkie używają -Rflagi do sformatowania wyniku, łącząc go z znakami nowej linii.

Wyjaśnienie

å+ uP £X+QpYnV

Implikowany: U= tablica wejściowa, V= numer wejściowy.

å+ uP

Łącznie zmniejsz tablicę wejściową ( å) za pomocą funkcji konkatenacji ciągów ( +). Daje to tablicę każdej wartości pośredniej redukcji. Następnie dodaj do tablicy upusty ciąg ( P).

£X+

Odwzoruj £każdą wartość na siebie ( X) połączoną z ...

QpV´

Cudzysłów ( Q) powtórzył ( p) V--( ) razy. To również zmniejsza się za Vkażdym razem.


Dobry. Myślę, że możesz zaoszczędzić bajt, zmieniając YnVna
ETHproductions

@ETHproductions Niesamowite, dzięki! Zupełnie zapomniałem o użyciu ++lub --w Japt.
Justin Mariner

2

ArnoldC , 3132 bajtów

ArnoldC nie ma konkatenacji łańcuchów, więc to buduje tornado ze 8s i używa 1s, aby je rozdzielić . ArnoldC obsługuje również tylko 16-bitowe liczby całkowite, więc przepełnia się wejściem dłuższym niż 7 cyfr. (Czyli będzie to tylko mini-tornada)

1jest pozostała, każda inna cyfra ma rację (chociaż nie polecałabym 0, ponieważ nie można zacząć od tego).

Wkład: 1221122

Wydajność:

88888888
18888888
18888881
18888811
11888811
11188811
11188111
11181111

Kod do gry w golfa:

IT'S SHOWTIME
HEY CHRISTMAS TREE d
YOU SET US UP 0
HEY CHRISTMAS TREE e
YOU SET US UP 0
HEY CHRISTMAS TREE m
YOU SET US UP 0
GET YOUR ASS TO MARS m
DO IT NOW
I WANT TO ASK YOU A BUNCH OF QUESTIONS AND I WANT TO HAVE THEM ANSWERED IMMEDIATELY
HEY CHRISTMAS TREE l
YOU SET US UP 0
GET YOUR ASS TO MARS l
DO IT NOW g m
DO IT NOW h l m
YOU HAVE BEEN TERMINATED
LISTEN TO ME VERY CAREFULLY g
I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE m
GIVE THESE PEOPLE AIR
HEY CHRISTMAS TREE i
YOU SET US UP 2
HEY CHRISTMAS TREE n
YOU SET US UP m
STICK AROUND n
GET TO THE CHOPPER n
HERE IS MY INVITATION n
HE HAD TO SPLIT 10
ENOUGH TALK
BECAUSE I'M GOING TO SAY PLEASE n
GET TO THE CHOPPER i
HERE IS MY INVITATION i
GET UP 1
ENOUGH TALK
YOU HAVE NO RESPECT FOR LOGIC
CHILL
I'LL BE BACK i
HASTA LA VISTA, BABY
LISTEN TO ME VERY CAREFULLY h
I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE l
I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE m
GIVE THESE PEOPLE AIR
HEY CHRISTMAS TREE o
YOU SET US UP -2
GET TO THE CHOPPER o
HERE IS MY INVITATION o
GET UP l
ENOUGH TALK
HEY CHRISTMAS TREE k
YOU SET US UP 1
STICK AROUND o
GET TO THE CHOPPER k
HERE IS MY INVITATION k
YOU'RE FIRED 10
ENOUGH TALK
GET TO THE CHOPPER o
HERE IS MY INVITATION o
GET DOWN 1
ENOUGH TALK
CHILL
HEY CHRISTMAS TREE p
YOU SET US UP 0
HEY CHRISTMAS TREE f
YOU SET US UP 0
HEY CHRISTMAS TREE i
YOU SET US UP 0
HEY CHRISTMAS TREE q
YOU SET US UP l
HEY CHRISTMAS TREE d
YOU SET US UP 0
HEY CHRISTMAS TREE e
YOU SET US UP 1
HEY CHRISTMAS TREE a
YOU SET US UP 0
HEY CHRISTMAS TREE b
YOU SET US UP 0
HEY CHRISTMAS TREE c
YOU SET US UP l
STICK AROUND q
GET TO THE CHOPPER i
HERE IS MY INVITATION 0
ENOUGH TALK
GET TO THE CHOPPER a
HERE IS MY INVITATION d
ENOUGH TALK
GET TO THE CHOPPER b
HERE IS MY INVITATION e
ENOUGH TALK
GET TO THE CHOPPER c
HERE IS MY INVITATION l
ENOUGH TALK
STICK AROUND c
BECAUSE I'M GOING TO SAY PLEASE a
GET TO THE CHOPPER i
HERE IS MY INVITATION i
GET UP 1
YOU'RE FIRED 10
ENOUGH TALK
GET TO THE CHOPPER a
HERE IS MY INVITATION a
GET DOWN 1
ENOUGH TALK
BULLSHIT
GET TO THE CHOPPER f
HERE IS MY INVITATION b
LET OFF SOME STEAM BENNET c
ENOUGH TALK
BECAUSE I'M GOING TO SAY PLEASE f
GET TO THE CHOPPER i
HERE IS MY INVITATION i
GET UP 1
YOU'RE FIRED 10
ENOUGH TALK
BULLSHIT
GET TO THE CHOPPER i
HERE IS MY INVITATION i
GET UP 8
YOU'RE FIRED 10
ENOUGH TALK
YOU HAVE NO RESPECT FOR LOGIC
YOU HAVE NO RESPECT FOR LOGIC
GET TO THE CHOPPER c
HERE IS MY INVITATION c
GET DOWN 1
ENOUGH TALK
CHILL
GET TO THE CHOPPER i
HERE IS MY INVITATION i
HE HAD TO SPLIT 10
ENOUGH TALK
TALK TO THE HAND i
GET TO THE CHOPPER q
HERE IS MY INVITATION q
GET DOWN 1
ENOUGH TALK
GET TO THE CHOPPER p
HERE IS MY INVITATION m
HE HAD TO SPLIT k
I LET HIM GO 10
ENOUGH TALK
GET TO THE CHOPPER k
HERE IS MY INVITATION k
HE HAD TO SPLIT 10
ENOUGH TALK
GET TO THE CHOPPER f
HERE IS MY INVITATION p
YOU ARE NOT YOU YOU ARE ME 1
ENOUGH TALK
BECAUSE I'M GOING TO SAY PLEASE f
GET TO THE CHOPPER d
HERE IS MY INVITATION d
GET UP 1
ENOUGH TALK
BULLSHIT
GET TO THE CHOPPER e
HERE IS MY INVITATION e
GET UP 1
ENOUGH TALK
YOU HAVE NO RESPECT FOR LOGIC
CHILL
I'LL BE BACK i
HASTA LA VISTA, BABY

Wypróbuj online!

Nieskluczony kod (5178 bajtów):

IT'S SHOWTIME
    HEY CHRISTMAS TREE left
        YOU SET US UP 0
    HEY CHRISTMAS TREE right
        YOU SET US UP 0
    HEY CHRISTMAS TREE input
        YOU SET US UP 0
        GET YOUR ASS TO MARS input
        DO IT NOW
        I WANT TO ASK YOU A BUNCH OF QUESTIONS AND I WANT TO HAVE THEM ANSWERED IMMEDIATELY
    HEY CHRISTMAS TREE width
    YOU SET US UP 0
    GET YOUR ASS TO MARS width
    DO IT NOW calcwidth input
    DO IT NOW buildline width input
YOU HAVE BEEN TERMINATED

LISTEN TO ME VERY CAREFULLY calcwidth
    I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE input
    GIVE THESE PEOPLE AIR
    HEY CHRISTMAS TREE result
    YOU SET US UP 2
    HEY CHRISTMAS TREE calc
    YOU SET US UP input
    STICK AROUND calc
        GET TO THE CHOPPER calc
        HERE IS MY INVITATION calc
        HE HAD TO SPLIT 10
        ENOUGH TALK
        BECAUSE I'M GOING TO SAY PLEASE calc
            GET TO THE CHOPPER result
        HERE IS MY INVITATION result
        GET UP 1
        ENOUGH TALK
    YOU HAVE NO RESPECT FOR LOGIC
    CHILL
    I'LL BE BACK result
HASTA LA VISTA, BABY

LISTEN TO ME VERY CAREFULLY buildline
    I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE width
    I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE input
    GIVE THESE PEOPLE AIR

    HEY CHRISTMAS TREE ctr
        YOU SET US UP -2
        GET TO THE CHOPPER ctr
            HERE IS MY INVITATION ctr
            GET UP width
        ENOUGH TALK
    HEY CHRISTMAS TREE mask
        YOU SET US UP 1
        STICK AROUND ctr
            GET TO THE CHOPPER mask
                HERE IS MY INVITATION mask
                YOU'RE FIRED 10
            ENOUGH TALK
            GET TO THE CHOPPER ctr
                HERE IS MY INVITATION ctr
                GET DOWN 1
            ENOUGH TALK
        CHILL
    HEY CHRISTMAS TREE digit
        YOU SET US UP 0
    HEY CHRISTMAS TREE decider
        YOU SET US UP 0
    HEY CHRISTMAS TREE result
        YOU SET US UP 0
    HEY CHRISTMAS TREE lines
        YOU SET US UP width
    HEY CHRISTMAS TREE left
        YOU SET US UP 0
    HEY CHRISTMAS TREE right
        YOU SET US UP 1
    HEY CHRISTMAS TREE leftcounter
        YOU SET US UP 0
    HEY CHRISTMAS TREE rightcounter
        YOU SET US UP 0
    HEY CHRISTMAS TREE widthcounter
    YOU SET US UP width
    STICK AROUND lines
        GET TO THE CHOPPER result
            HERE IS MY INVITATION 0
        ENOUGH TALK
        GET TO THE CHOPPER leftcounter
            HERE IS MY INVITATION left
        ENOUGH TALK
        GET TO THE CHOPPER rightcounter
            HERE IS MY INVITATION right
        ENOUGH TALK
        GET TO THE CHOPPER widthcounter
            HERE IS MY INVITATION width
        ENOUGH TALK
        STICK AROUND widthcounter
            BECAUSE I'M GOING TO SAY PLEASE leftcounter
                GET TO THE CHOPPER result
                    HERE IS MY INVITATION result
                    GET UP 1
                    YOU'RE FIRED 10
                ENOUGH TALK
                GET TO THE CHOPPER leftcounter
                    HERE IS MY INVITATION leftcounter
                    GET DOWN 1
                ENOUGH TALK
            BULLSHIT
                GET TO THE CHOPPER decider
                    HERE IS MY INVITATION rightcounter
                    LET OFF SOME STEAM BENNET widthcounter
                ENOUGH TALK
                BECAUSE I'M GOING TO SAY PLEASE decider
                    GET TO THE CHOPPER result
                        HERE IS MY INVITATION result
                        GET UP 1
                        YOU'RE FIRED 10
                    ENOUGH TALK
                BULLSHIT
                    GET TO THE CHOPPER result
                        HERE IS MY INVITATION result
                        GET UP 8
                        YOU'RE FIRED 10
                    ENOUGH TALK
                YOU HAVE NO RESPECT FOR LOGIC
            YOU HAVE NO RESPECT FOR LOGIC

            GET TO THE CHOPPER widthcounter
                HERE IS MY INVITATION widthcounter
                GET DOWN 1
            ENOUGH TALK
        CHILL
        GET TO THE CHOPPER result
            HERE IS MY INVITATION result
            HE HAD TO SPLIT 10
        ENOUGH TALK
        TALK TO THE HAND result
        GET TO THE CHOPPER lines
            HERE IS MY INVITATION lines
            GET DOWN 1
        ENOUGH TALK
        GET TO THE CHOPPER digit
            HERE IS MY INVITATION input
            HE HAD TO SPLIT mask
            I LET HIM GO 10
        ENOUGH TALK
        GET TO THE CHOPPER mask
            HERE IS MY INVITATION mask
            HE HAD TO SPLIT 10
        ENOUGH TALK
        GET TO THE CHOPPER decider
            HERE IS MY INVITATION digit
            YOU ARE NOT YOU YOU ARE ME 1
        ENOUGH TALK
        BECAUSE I'M GOING TO SAY PLEASE decider
            GET TO THE CHOPPER left
                HERE IS MY INVITATION left
                GET UP 1
            ENOUGH TALK
        BULLSHIT
            GET TO THE CHOPPER right
                HERE IS MY INVITATION right
                GET UP 1
            ENOUGH TALK
        YOU HAVE NO RESPECT FOR LOGIC
    CHILL
    I'LL BE BACK result
HASTA LA VISTA, BABY

Niestety nie sądzę, aby ta odpowiedź była poprawna, ponieważ zbyt mocno ogranicza dane wejściowe i modyfikuje dane wyjściowe w sposób, który jest niedozwolony (przy użyciu tła innego niż białe znaki). Przepraszam!
HyperNeutrino

@HyperNeutrino Dość uczciwie, to jest tak dobre, jak można uzyskać od ArnoldC.
TemporalWolf

To niefortunne. Przepraszam za marnowanie czasu i wysiłku, ale uważam, że musisz to usunąć, ponieważ jest to nieprawidłowe ze względu na specyfikację wyzwania. Możesz zapytać Meta, czy uważasz, że to zły wybór, a społeczność może tam zdecydować, co robić. Dzięki :)
HyperNeutrino

1
@HyperNeutrino Nie jestem przekonany, że ArnoldC jest automatycznie nieważny: działa dla całego zakresu prawidłowych liczb całkowitych obsługiwanych przez ArnoldC i nie „nadużywa” go za pomocą mniejszej spacji: Jeśli napisałeś w 32-bitowej obsłudze ArnoldC, moja odpowiedź działałby bez zmian z taką precyzją. Zasady nie określają wymagań dla znaków wypełniających ani tornada o minimalnej wysokości, które muszą być osiągalne. Ale otworzę pytanie na temat meta, jeśli wolisz.
TemporalWolf

1
Masz rację. W porządku, kontynuuj; Źle oceniłem. Ładna odpowiedź :)
HyperNeutrino

1

Haskell , 67 64 bajtów

Dane wejściowe są odwrócone: 0oznacza usuń w prawo i 1usuń w lewo:

f n=zipWith(\x y->(' '<$[1..y])++('#'<$[1..n-x]))[0..].scanl(+)0

Wypróbuj online!

„Niegolfowany”

f n = zipWith (\x y-> replicate y ' ' ++ replicate (n-x) '#') [0..] . scanl (+) 0


1

C, 68 63 bajtów

s;f(w,i)int*i;{for(;w;s+=!*i++)printf("%*s%0*d\n",s,"",w--,0);}

Wykorzystuje to dynamiczną specyfikację szerokości pola w ciągu printf()formatu. Funkcja nazywa się tak:

#include <stdio.h>

s;f(w,i)int*i;{for(;w;s+=!*i++)printf("%*s%0*d\n",s,"",w--,0);}

int main() {
    f(8, (int[]){1, 0, 0, 0, 1, 0, 0});
}

Zaoszczędź 5 bajtów, usuwając int s=0;i umieszczając s;przed f(w,i). Tak to
wygląda

1

JavaScript (ES6), 64 bajty

Anonimowa funkcja pobierająca parametry w składni curry (a) (b). W tablicy b pusty ciąg reprezentuje usuwanie z prawej strony, a spacja oznacza usuwanie z lewej strony.

a=>b=>b.reduce((t,v)=>t+'\n'+(a.pop(),p+=v)+a,a=Array(a+1),p='')

Używając 1 i 0 jak w przykładach, wynik wynosi 70

a=>b=>b.reduce((t,v)=>t+'\n'+(a.pop(),v?p:p+=' ')+a,a=Array(a+1),p='')

Test

F=
a=>b=>b.reduce((t,v)=>t+'\n'+(a.pop(),p+=v)+a,a=Array(a+1),p='')

function update() {
  var b=B.value.match(/\d/g)
  
  if (b) {
    b=b.map(v=>+v?'':' ')
    O.textContent = F(b.length+1)(b)
  }
  else
    O.textContent = 'invalid input'
}

update()
  
Input B (0 and 1) <input id=B value='1001' oninput='update()'>
<pre id=O></pre>


0

PowerShell , 53 bajty

param($a,$b)"#"*$a;0..$a|%{" "*($i+=$b[$_])+"#"*--$a}

Wypróbuj online!

Pobiera dane wejściowe $ajako opcjonalną liczbę całkowitą oraz $btablicę 1i 0s. (Zauważ, że moja tablica 1i 0jest przerzucana z wyzwania.) Konstruuje linię początkową #i pozostawia ją w potoku. Następnie pętle od 0do $a. Każdej iteracji generujemy możliwie zwiększoną liczbę spacji, a następnie wstępnie zmniejszoną liczbę spacji #. Tak, to wypluje pusty końcowy znak nowej linii na końcu, ponieważ zapętlamy w górę do $aliczby elementów na liście zamiast do niej.

Wszystkie pojedyncze ciągi znaków są pozostawione w potoku, a dane wyjściowe z separatorem nowej linii między nimi są niejawne po zakończeniu programu.


0

C #, 181 bajtów

n=>a=>{var r=new string[n];r[0]=new string('#',n);for(int i=1,p;i<n;++i){r[i]=r[i-1];p=a[i-1]?r[i].LastIndexOf('#'):r[i].IndexOf('#');r[i]=r[i].Remove(p,1).Insert(p," ");}return r;}

Wypróbuj online!

Pełna / sformatowana wersja:

class P
{
    static void Main()
    {
        System.Func<int, System.Func<bool[], string[]>> f = n => a =>
        {
            var r=new string[n];
            r[0]=new string('#',n);

            for (int i = 1, p; i < n; ++i)
            {
                r[i] = r[i - 1];
                p = a[i - 1] ? r[i].LastIndexOf('#') : r[i].IndexOf('#');
                r[i] = r[i].Remove(p, 1).Insert(p, " ");
            }

            return r;
        };

        System.Console.WriteLine(string.Join("\n", f(5)(new[] { true, false, false, true })));

        System.Console.ReadLine();
    }
}

0

Węgiel drzewny , 17 bajtów

FN«P×#⁺¹ι¿I§⮌ηι↑↖

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

FN«

Pierwsze wejście podaje liczbę iteracji pętli.

P×#⁺¹ι

Ponieważ indeksy pętli są domyślnie indeksowane na zero, dodajemy tutaj jeden, aby uzyskać prawidłową liczbę #s.

¿I§⮌ηι

Zaczynając od dolnej części tornada i praca w górę oszczędza bajt, ale następnie musimy odwrócić drugie wejście, abyśmy mogli zindeksować bieżącą cyfrę.

Jeśli bieżącą cyfrą jest a 1, przejdź w górę. To sprawia, że ​​poprzedni wiersz ma dodatkowy #na końcu.

Jeśli bieżąca cyfra to a 0, przesuń w górę i w lewo. To sprawia, że ​​poprzedni wiersz ma dodatkowy #na początku.


0

C # , 159 bajtów

using System.Linq;n=>a=>new[]{new string('#',n)}.Concat(a.Select((_,i)=>{var s=a.Take(i+1).Count(j=>j==0);var h=n-i-1;return new string('#',h).PadLeft(s+h);}))

Wyjaśnienie

 new[] { new string('#', n) }                //start with n number of hashes
                .Concat(                     //append...
                    a.Select((_, i) =>       //    map each element of array
                    {
                        var s = a.Take(i + 1).Count(j => j == 0);  // count the number of 0's up to, and including, this point
                        var h = n - i - 1;                         // number of hashes for this step
                        return new string('#', h).PadLeft(s + h);  // number of hashes padded left with number of 0s
                    }));

Wypróbuj online!


0

PHP, 136 bajtów

$b=explode(',',end($argv));$a=$argc==3?$argv[1]:count($b)+1;$c=0;for(;$a;--$a){printf("% {$c}s%'#{$a}s\n",'','');$c+=!array_shift($b);}

Zapisz w pliku php i przetestuj za pomocą php file.php 8 '1,0,0,0,1,0,0'. Wydajność:

########
#######
 ######
  #####
   ####
   ###
    ##
     #

Niestety, przygotowanie danych wejściowych to połowa zadania.

Kolejna wersja (158 bajtów) wykorzystująca str_repeatzamiast printfi ... gotowszystkich rzeczy:

$b=explode(',',end($argv));$a=$argc==3?$argv[1]:count($b)+1;$c=0;z:
echo str_repeat(' ',$c).str_repeat('#',$a)."\n";while(--$a){$c+=!array_shift($b);goto z;}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.