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,


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!


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

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

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"

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

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


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


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,


@ Tylko ASCII: P -
całkowicie ludzki,


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

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


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.



@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ą.


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, 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.


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
 \¶| | |¶

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> <>.)


To wygląda jak Lumpy Space Princess z Adventure Time :)
YSC



1

Excel, 60 bajtów

="  ^
 / \
"&REPT("| | |
 \ \
",A1-1)&"| | |
 \ /
  v"

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.

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

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.

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.

“\|||\”ẋ“ ^ /“/ v”jKs5Y
Erik the Outgolfer,

1

Węgiel , 25 bajtów

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

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


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


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.