Narysuj łańcuch S.

27

tło

Kiedy byłem młodszy, nauczyłem się metody rysowania dziwnego kształtu litery „S”, który mnie (wraz z kolegami z klasy) był fascynujący. Dziś odkryłem go na nowo, a ze względu na jego formalne podejście do rysowania, pomyślałem, że może to prowadzić do interesującego wyzwania: P

Rysowanie litery „S”

Litera S może być narysowana w następujący sposób:

Najpierw narysuj 2 rzędy trzech pionowych linii

| | |

| | |

Następnie połącz górną lewą linię z dolną środkową linią i górną środkę z dolną prawą linią, aby wytworzyć

| | |
 \ \
| | |

Na koniec narysuj górę i dół na aktualnie narysowanym obrazie, aby wyglądał tak

  ^
 / \
| | |
 \ \
| | |
 \ /
  v

Jak widać, daje to kształt litery „S”. Po rozszerzeniu (rysując go z więcej niż 2 rzędami) tworzy bardzo interesujący wzór. Twoim zadaniem jest odtworzenie tego interesującego wzoru.

Zadanie

Biorąc pod uwagę liczbę całkowitą n >= 2, wyprowadzić literę S z nwierszami, które zostaną z niej wykonane. Dane wyjściowe mogą być zwracane z funkcji, a dane wejściowe mogą być pobierane standardowymi metodami. Końcowe / wiodące białe znaki zarówno dla całego obrazu, jak i dla każdej linii, są w porządku. Jednak odstępy między wierszami muszą być spójne, aby znak „nie był łamany. Możesz wyprowadzać dane jako listę wierszy.

Przypadki testowe

input
output
---

2

  ^
 / \
| | |
 \ \
| | |
 \ /
  v

---

8
  ^
 / \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ /
  v

---

10

  ^
 / \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ /
  v

To jest więc wygrywa najkrótszy kod! Powodzenia,

Cairney Coheringaahing
źródło
13
Wikipedia nazywa Ssię super S i zwraca nieskończoną wersję AnS Chain
Stephen
Czy możemy wyprowadzać dane jako listę wierszy?
Pan Xcoder,
@ Mr.Xcoder you may
caird coinheringaahing 20.09.17
@Stephen 10 minut googlingu, a to się nie pojawiło. Zmienię nazwę pytania
caird coinheringaahing
@cairdcoinheringaahing Szukałem zdjęć, które mogły być tym: P
Stephen

Odpowiedzi:

10

C # (.NET Core) , 73 69 66 64 62 bajtów

Dwa mniej bajtów i wygląd podobny do perla dzięki Barodusowi. Nie myślałeś o użyciu int? dla zer.

n=>$@"  ^
 / {string.Join(@"\
| | |
 \ ",new int?[++n])}/
  v"

Wypróbuj online!

mój zaimek to monicareinstate
źródło
1
Gdyby to był golf z istniejącej odpowiedzi w języku C #, nigdy bym nie wiedział. Dobra robota :-)
ETHprodukcje
Czy możesz wyjaśnić, co to new string[n+1]robi? Nigdy wcześniej tego nie widziałem.
Ian H.,
Tworzy tablicę pustych ciągów AFAIK. Użyłem hacka z ciągiem. Dołącz, aka dołącz {"", "", "", ""} z separatorem "\ \ n | | | \ n \"
mój zaimek to monicareinstate
@someone Woah, nigdy wcześniej nie uznałem tej sztuczki. Bardzo fajny! (Również mój zły, ale myślałem, że new string[n+1]był to jakiś podstępny konstruktor ciągów, a nie deklaracja tablicowa.
Ian H.,
6

Python 3 , 48  56 59 61  bajtów

lambda k:'  ^\n / %s/\n  v'%('\\\n| | |\n \ '*k)

Wypróbuj online!

Pan Xcoder
źródło
Możesz zapisać 2 bajty, odznaczając samotne ukośniki odwrotne.
L3viathan
@ L3viathan Właśnie aktualizuję
Mr. Xcoder
56 bajtów; nie jestem pewien, czy to uczciwa gra ; nie działa na TIO
L3viathan
@ L3viathan To nie jest poprawne. Extra \ \.
Pan Xcoder,
W TIO: tak. W moim terminalu: nie.
L3viathan
6

05AB1E , 27 26 bajtów

…^
/ð"\
| | |
\ "I×…/
vJ.c

Wypróbuj online!

Alternatywna wersja 27-bajtowa

'^…/ \©IF…| |û…\ \}\®R'v».c

Wypróbuj online!

Wyjaśnienie

'^                             # push "^"
  …/ \©                        # push "/ \" and store a copy in register
       IF                      # input times do:
         …| |û                 # push "| | |"
              …\ \             # push "\ \"
                  }            # end loop
                   \           # discard top of stack (the extra "\ \")
                    ®R         # push "/ \" reversed = "\ /"
                      'v       # push "v"
                        »      # join stack on newlines
                         .c    # center each row
Emigna
źródło
5
Twój kod wygląda mi trochę jak słoń :)
Wojowu
DOSKONAŁE jest, jak blisko moja odpowiedź była do ciebie: '^…/ \©IF„| ûû„\ û}\®R'v).Cnie patrząc.
Magic Octopus Urn
6

Japt , 34 25 23 bajtów

" ^ /{ç'\²i|³1}/ v"¬¸ò5

Przetestuj online! Dane wyjściowe jako tablica linii; -Rdodano flagę, aby dołączyć do nowej linii. (Dzięki @Shaggy)

Pierwsza druga próba może być możliwa do poprawy ...

Jak to działa

" ^ /{ ç'\²  i |³  1}/ v"¬ ¸  ò5
" ^ /{Uç'\p2 i'|p3 1}/ v"q qS ò5   Ungolfed
                                   Implicit: U = input number
        '\p2                       Repeat a backslash twice, giving "\\".
             i     1               Insert at index 1
              '|p3                   3 vertical bars. This gives "\|||\".
      Uç                           Make U copies of this string. U = 2: "\|||\\|||\"
" ^ /{              }/ v"          Insert this into this string.    " ^ /\|||\\|||\/ v"
                         q qS      Split into chars; join on spaces."  ^   / \ | | | \ \ | | | \ /   v"
                              ò5   Split into rows of length 5.    ["  ^  "," / \ ","| | |"," \ \ ","| | |"," \ / ","  v"]
                                   Joining on newlines gives "  ^  
                                                               / \ 
                                                              | | |
                                                               \ \
                                                              | | |
                                                               \ /
                                                                v"
ETHprodukcje
źródło
Pokonywanie węgla drzewnego i wiązanie SOGL? Wspaniała robota!
Shaggy
Nawiasem mówiąc, możesz wypisać tablicę wierszy, abyś mógł porzucić ostatnie 2 znaki.
Shaggy
@Shaggy To świetnie, teraz wygrywamy!
ETHprodukcje
Ostatnio dobrze nam idzie :)
Shaggy,
6

SOGL V0.12 , 26 25 18 bajtów

°I-‘*"∑ūCƨΩ)¹‘@∑5n

Wypróbuj tutaj!

Używa tej samej strategii, co odpowiedź Japt ETHproductions

Wyjaśnienie:

..‘           push "\|||\"
   *          repeat input times
    "..‘      push " ^ /ŗ/ v ", with ŗ replaced with POP. The reason why there's a trailing
              space is because otherwise it didn't have enough repeating characters to compress
        @∑    join with spaces
          5n  split to line lengths of 5
dzaima
źródło
2
push "|" and " "co do cholery jest wbudowane
Steven H.
1
@StevenHewitt są to właściwie dwa wbudowane, ale dołączyłem do nich razem (tak jak robię to z innymi rzeczami), ponieważ nie sądzę, że nie jest konieczne oddzielanie rzeczy, które wkrótce się
zużyją
5

JavaScript (ES6), 60 bajtów

n=>`  ^
 / \\
${`| | |
 \\ \\
`.repeat(n-1)}| | |
 \\ /
  v`

Test Snippet

Justin Mariner
źródło
1
57: n=>' ^\n /${' \\ \\\n| | |\n'.repeat(n).slice(2)} \\ /\n v'(przy użyciu
odwrotnych
5

Węgiel drzewny , 27 26 25 bajtów

-1 bajt dzięki Carlos Alejo. -1 bajt dzięki tylko ASCII.

  ^⸿ / ×\⸿| | |⸿ \ N/⸿  v

Wypróbuj online! Link jest do pełnej wersji. # charcoal-verbose-obfucation

całkowicie ludzki
źródło
1
Możesz zapisać 1 bajt, po prostu wywołując Print (zamiast dodawać ciągi znaków) i używając \r: `^ ⸿ / × \ ⸿ | | | ⸿ \ Iθ / ⸿ v`. Pełna wersja .
Charlie,
Ach ... Będę musiał pamiętać \ro sposobie, by uzyskać nowe linie rozsądnym sposobem. Dzięki!
całkowicie ludzki,
25 bajtów
tylko ASCII,
@ Tylko ASCII: P -
całkowicie ludzki,
4

Perl 5 , 39 37 bajtów

say"  ^
 / ".'\
| | |
 \ 'x<>."/
  v"

Wypróbuj online!

Ogolono dwa bajty z sugestią @DomHastings

Xcali
źródło
Jeśli używasz pojedynczych cudzysłowów, nie musisz uciekać przed odwrotnym ukośnikiem za -2! :)
Dom Hastings
3

Właściwie 49 bajtów

"| | |"@α;lD" \ \"@α@Z♂ii"  v"" \ /"))" / \""  ^"

Wypróbuj online!

Wyjaśnienie:

"| | |"@α;lD" \ \"@α@Z♂ii"  v"" \ /"))" / \""  ^"
"| | |"@α                                          push a list containing n copies of the vertical lines
         ;lD" \ \"@α                               push a list containing n-1 copies of the diagonal connections
                    @Z♂i                           interleave
                        i                          flatten
                         "  v"" \ /"))             make the bottom
                                      " / \""  ^"  make the top
Mego
źródło
3

05AB1E , 38 bajtów

…| |ûU"  ^
 / \"XI<F„ \2×X}" \ /
  v"»

Wypróbuj online!

…| |                         # Push "| |"
    û                        # Palindromize
     U                       # Store in X
      "..."X                 # Push the top three rows
            I<F      }       # One less than input times do:
               „ \           #   Push " \"
                  2×         #   Concatenate that with itself
                    X        #   Push "| | |"
                      "..."  # Push the last two rows
                           » # Join stack with newlines
Riley
źródło
3

C (gcc) , 82 bajty

f(n){for(puts("  ^\n / \\");--n;puts("| | |\n \\ \\"));puts("| | |\n \\ /\n  v");}

Wypróbuj online!

cleblanc
źródło
3

C # (.NET Core) , 101 77 73 bajtów

Zaoszczędziłem 24 bajty dzięki i cri everytim !
Zaoszczędzono 4 bajty dzięki Kevinowi Cruijssenowi !

n=>{var s="  ^\n / ";for(;n-->0;s+="\\\n| | |\n \\ ");return s+"/\n  v";}

Wypróbuj online!

Jak zwykle ciąg powtarzający się w C # jest uciążliwy.

Ian H.
źródło
77 bajtów.
całkowicieludzki
@icrieverytim Ahhh, oczywiście, o wiele lepiej.
Ian H.,
Można zmienić --n>=0, aby n-->0i s+="/\n v";return s;do return s+"/\n v";zaoszczędzić kilka bajtów.
Kevin Cruijssen
1
@KevinCruijssen Dzięki, naprawiono!
Ian H.
3

Siatkówka , 38 bajtów

.+
$*
1
¶|||¶x\\
^
 ^¶x/\
.$
/¶ v
x?
 

Wypróbuj online!

Drukuje kolumnę początkowych spacji i końcowych spacji w każdej linii.

Wyjaśnienie

Główne oszczędności w bajtach wynikają z pominięcia spacji we wszystkich dosłownych częściach i wstawienia ich na końcu. Figura ma taką strukturę, że nigdy nie ma obok siebie dwóch spacji, więc jeśli usuniemy je wszystkie, możemy prawie naprawić kształt, wstawiając spację w każdej pozycji na końcu:

^
/\
|||
\\
|||
\/
v

staje się:

 ^ 
 / \ 
 | | | 
 \ \ 
 | | | 
 \ / 
 v 

To prawie poprawne, z wyjątkiem wcięć. W ^i vbrakuje dwóch spacji. W rzeczywistości jest to łatwiejsze do naprawienia, ponieważ jeśli po prostu wstawimy wyraźne spacje przed każdym z nich, spowoduje to dodanie dwóch dodatkowych spacji na końcu. Linie z ukośnikami są trudniejsze, ponieważ wymagają tylko jednego dodatkowego miejsca. Aby to naprawić, wstawiamy tam znak zastępczy ( x). Kiedy wstawiamy spacje na końcu, nie wstawiamy ich tylko dla każdego pustego dopasowania, ale opcjonalnie dopasowujemy to x. Oznacza to, że zamiast wstawiać spację przed x, xsam zostaje zastąpiony. A potem będzie nadal pusty mecz zaraz po x. To znaczy, każdyxdodaje dokładnie jedną spację bez zmiany czegokolwiek innego. Więc chcemy to skonfigurować:

 ^
x/\
|||
x\\
|||
x\/
 v

co da nam pożądany rezultat. Oto kod:

.+
$*

Przekształć dane wejściowe w jednoargumentowe.

1
¶|||¶x\\

Przekształć każdą 1z nich w dwie linie za pomocą |||i x\\(i wiodącego podawania linii).

^
 ^¶x/\

Wstaw pierwsze dwie linie za pomocą ^i x/\.

.$
/¶ v

Napraw finał x\\, zamieniając ostatni \w /i dodając linię za pomocą v.

x?
 

Zamień każde xlub puste dopasowanie spacją.

Martin Ender
źródło
Schludne podejście. Próbowałem wymyślić sposób użycia funkcji łączenia na spacje dla mojego rozwiązania Pip, ale to nie zadziałało z powodu różnej liczby wiodących spacji w różnych wierszach.
DLosc
2

Pyth, 46 bajtów

"  ^
 / \\"
+*j[jd*\|3" \ \\"k))Q" \ /
  v

Zestaw testowy.

Steven H.
źródło
36 bajtów:%" ^\n / %s/\n v"*Q"\\\n| | |\n \
Pan Xcoder,
31 bajtów .
Pan Xcoder,
2

Pyth, 40 bajtów

K" / \ ""  ^"Kj+b+*2+d\\b*Q]*3"| "_K"  v

Dość podobny do Stevena Hewitta, ale rozwijał się niezależnie.

Wypróbuj online

Wyjaśnienie

K" / \ ""  ^"Kj+b+*2+d\\b*Q]*3"| "_K"  v
K" / \ ""                                 Set K = " / \ "
        "  ^"                       "  v  Draw the end points.
             K                    _K      Draw the slants.
                         *Q]*3"| "        Draw the vertical bars...
              j+b+*2+d\\b                 ... interspersed with slants.

źródło
2

Siatkówka , 45 bajtów

To dość proste rozwiązanie.

.+
$*
^1
  ^¶ /x
$
 \ /¶  v
1
 \x
x
 \¶| | |¶

Wypróbuj online

Jeśli sztuka mogłaby być zamiast tego indeksowana 1, byłaby nieco krótsza (44 bajty):

.+
  ^¶ /x$0$*1
$
 \ /¶  v
1
 \x
x
 \¶| | |¶
mbomb007
źródło
2

Pip , 45 42 33 bajtów

"  ^
 / "."\
| | |
 \ "Xa."/
  v"

Wypróbuj online!

Wyjaśnienie

Kod jest naprawdę prosty, choć nowe wiersze utrudniają czytanie. Oto lepszy sposób, aby zobaczyć strukturę:

"prefix" . "repeated" X a . "suffix"

Powtarzającym się elementem w łańcuchu S jest

   \
| | |
 \

Weź to jako dosłowny ciąg i powtórz go arazy (gdzie ajest pierwszym argumentem wiersza poleceń). Następnie dodaj prefiks:

  ^
 /

i dodaj przyrostek:

   /
  v

i wydrukuj.

(Podoba mi się, jak to wyglądało trochę jak program> <>.)

DLosc
źródło
To wygląda jak Lumpy Space Princess z Adventure Time :)
YSC
2

MATL , 47 44 43 bajty

-3 bajty dzięki Giuseppe

'  ^' ' / \ 'XK'| | |'XJGq:"' \'thJ]KP'  v'

Wypróbuj online!

Cinaski
źródło
' ^' ' / \ 'XK'| | |'XJ`' \ \'JGq@-]KP' v'ma 44 bajty.
Giuseppe,
1

Excel, 60 bajtów

="  ^
 / \
"&REPT("| | |
 \ \
",A1-1)&"| | |
 \ /
  v"
Wernisch
źródło
Powinieneś rozważyć sprawdzenie, czy jest to poliglota z Arkuszami Google
Taylor Scott,
1

PowerShell , 83 , 57 bajtów

"  ^
 / \"
1..--$args[0]|%{"| | |
 \ \"}
"| | |
 \ /
  v"

Wypróbuj online!

Per @ AdmBorkBork sugestie,

  • Uproszczone fordzięki zakresowi liczb.
  • Zamienione ;i połączone ciągi znaków.
  • Usunięto niepotrzebną definicję zmiennej.
korzeń
źródło
Używając, możesz fordużo zagrać w golfa 1..--$args[0]|%{ }.
AdmBorkBork
Możesz także użyć dosłownych znaków nowej linii między sąsiednimi łańcuchami, aby zaoszczędzić, ";"a taniej $scałkowicie się go pozbyć . 57 bajtów
AdmBorkBork
Przysiek. Lubię zapisywanie nowej linii. Zabawne, że przegapiłem 1..$argsokazję. Nie jestem pewien, jaka etykieta znajduje się na tej stronie. Czy wprowadzę zmiany w mojej odpowiedzi i uznam cię, czy publikujesz swoje rozwiązanie jako osobną odpowiedź?
korzeń
Edycja zmian i uznanie jest właściwą etykietą. Witamy w PPCG.
AdmBorkBork
1

Galaretka , 32 bajty

Nudny port rozwiązania Python Lynna .

“\¶| | |¶ \ ”ẋṭ“  ^¶ / ”;“/¶  v”

Wypróbuj online!

Wyjaśnienie:

“\¶| | |¶ \ ”ẋṭ“  ^¶ / ”;“/¶  v”    Example input: 5
“\¶| | |¶ \ ”                       Literal string "\¶| | |¶ \ " (¶ = newline). Result: "\¶| | |¶ \ "
             ẋ                      Repeat as many times as the (implicit) input. Result: "\¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ "
              ṭ                     Tack that on the end of...
               “  ^¶ / ”            ...the string "  ^¶ / ". Result: "  ^¶ / \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ "
                        ;           Append...
                         “/¶  v”    The string "/¶  v". Result: "  ^¶ / \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ /¶  v"
                                    Implicit print
Towarzyszu SparklePony
źródło
1

Właściwie 30 bajtów

Działa to na tej samej zasadzie, co odpowiedź Japt ETHproductions , w której dodatkowe spacje są dodawane później, a cały ciąg jest dzielony na rzędy po 5 w celu niejawnego drukowania. Wypróbuj online!

"\|||\"*" ^ /"+"/ v"@+#' j5@╪i

Ungolfing

            Implicit input.
"\|||\"*    Add the middle portion and multiply that by the input.
" ^ /"+     Append the top.
"/ v"@+     Append the bottom.
#           Convert into a list of strings
' j         Join with spaces.
5@╪         Split into a list of length-5 strings.
i           Flatten list onto the stack for implicit printing with newlines.
Sherlock9
źródło
Dobra robota obezwładniająca Mego we własnym języku!
caird coinheringaahing
1

Galaretka , 25 23 bajtów

Działa to na tej samej zasadzie, co odpowiedź Japt ETHproductions , w której dodatkowe spacje są dodawane później, a cały łańcuch jest przed drukowaniem dzielony na łańcuchy o długości 5. Wypróbuj online!

Edycja: Wiedziałem, że istnieje sposób na połączenie górnej i dolnej części łańcucha S w golfistyczny sposób. Dzięki Erikowi Outgolfer za -2 bajty.

“\|||\”ẋ“ ^ /“/ v”jKs5Y

Ungolfing

                Left argument: n
“\|||\”ẋ        Repeat the middle portion n times.
“ ^ /“/ v”j     Append the top and bottom.
K               Join with spaces.
s5              Split into a list of length-5 strings.
Y               Print the strings with linefeeds.
Sherlock9
źródło
“\|||\”ẋ“ ^ /“/ v”jKs5Y
Erik the Outgolfer,
1

Węgiel , 25 bajtów

↘^\¶/¶G→⁵↓⊕⊗N←⁵|¶ \↗¶\¶v/

Wypróbuj online! Link jest do pełnej wersji kodu.

Neil
źródło
Zabawne, że inna odpowiedź na węgiel drzewny ma tę samą liczbę bajtów, stosując zupełnie inne podejście. Ale bardziej lubię twoją. Drugi jest prawie zakodowany na sztywno, ale twój tak naprawdę wykorzystuje siłę węgla drzewnego.
Kevin Cruijssen
@KevinCruijssen Mówisz siłę, ale to naprawdę powinno być drukowane po przekątnej; niestety najlepsze, co mogłem zrobić, to 29 bajtów:↘^\|¶/|\|¶|F⊖N↘\|\|¶|↘\|/¶|\v
Neil
1

bash, 67 bajtów

printf -v a %\*s $1 \ ;echo '  ^
 / '"${a// /\\
| | |
 \\ }"'/
  v'

Wypróbuj online

Nahuel Fouilleul
źródło
0

Java 8, 93 76 bajtów

n->{String r="  ^\n / ";for(;n-->0;r+="\\\n| | |\n \\ ");return r+"/\n  v";}

Port @IanH. Odpowiedź w języku C # .NET po tym, jak trochę bardziej grałem w golfa.

Wypróbuj tutaj.

Kevin Cruijssen
źródło
To zabawne, że jest to prawie dokładnie identyczna oczekiwana część stringvs. var
Ian H.
@IanH. A n->vs n=>;)
Kevin Cruijssen