Pomóż mi otworzyć pudełko

33

Mam pudełko ASCII-art i potrzebuję programu, aby je otworzyć.

Przykłady

Wkład:

-------
|     |
|_____|

Wydajność:

      /
     /
    /
   /
  /
 /
/
|     |
|_____|

Specyfikacja

  • Pierwsza linia będzie się składać tylko z -co najmniej 3 z nich
  • Środkowe rzędy zaczynają się |od spacji, a kończą na|
    • Wszystkie środkowe rzędy będą takie same
  • Ostatni rząd zaczyna się od „ |mieć”, _a kończy na|
  • Wszystkie rzędy będą tej samej długości

Otwieranie pudełka:

  • Każdy -powinien zostać zastąpiony przez /linie rosnące i pozycję rosnącą.
Downgoat
źródło
2
W przeciwieństwie do gry „Shut the Box”?
Addison Crump
1
kaszel
Addison Crump
28
Po otwarciu pokrywa staje się dwa razy dłuższa? No cóż, obwiniaj sztukę ASCII.
Darrel Hoffman
8
Co jest w pudełku?
Williham Totland
2
Nie ma działającego tłumacza, więc chyba nie. Nie ma znaczenia; kiedy zrobię tłumacza (wkrótce, mam nadzieję), opublikuję odpowiedź.
ETHprodukcje

Odpowiedzi:

7

CJam, 14 bajtów

l,{N'/@S*}%W%q

Wypróbuj online!

Jak to działa

l               Read the first line from STDIN.
 ,              Compute the line's length. Result: L
  {      }%     Map; for each I in [0 ... L-1]:
                  (implicit) Push I.
   N              Push a linefeed.
    '/            Push a slash.
      @           Rotate I on top of the stack.
       S*         Turn I into a string of I spaces.
           W%   Reverse the resulting array of strings and characters.
             q  Read the remaining input from STDIN.
Dennis
źródło
12

JavaScript ES6, 57 bajtów

s=>s[r="replace"](/-+/,s=>s[r](/-/g,`
$'/`))[r](/-/g,' ')

Tworzy wiodący nowy wiersz. Działa, biorąc wiersz -si przekształcając je w trójkąt, a następnie zastępując -je spacjami.

Edycja: Zapisano 5 bajtów dzięki @ edc65.

Neil
źródło
1
+1 Nauczyłem się czegoś nowego ($ '). Zamiast tego ta stara sztuczka może dla ciebie zaoszczędzić 4 bajty:f=s=>s[R='replace'](/-+/,s=>s[R](/-/g,"\n$'/"))[R](/-/g,' ')
edc65
@ edc65 Dzięki, naprawdę robię to 5 bajtów; dziękuję również za naprawienie mojej literówki (jak można się domyślić, rozwijam \ni przekształcam później).
Neil
9

pb (NIEKOMPETUJĄCY), 125 bajtów

^w[B!0]{>}w[B!45]{<w[B=10]{t[T+1]b[0]}}v[X]vw[T!0]{vb[124]<[X]b[124]>w[B=0]{>}t[T-1]}w[X!1]{<b[95]}<w[B!0]{^}w[Y!-1]{b[47]>^}

Wersja pbi, której potrzebujesz, aby uruchomić tę odpowiedź, jest nowsza niż pytanie. Działałoby to w starszych wersjach, z wyjątkiem tego, że nigdy nie udało mi się pozwolić na wprowadzanie nowych wierszy. No cóż.

Po pierwsze, określa wysokość pola przez zliczanie nowych linii na wejściu. Kiedy się o tym dowie, idzie do miejsca Y prawej strony pudełka, zjeżdża w dół do miejsca, w którym musi być, i rysuje ściany i podłogę, kończąc pokrywką.

Sprawdź tę zabawną animację!

Długa pauza to przesuwanie pędzla nad wejściem.

Nie golfowany:

^w[B!0]{>}                # Go to the end of the input
w[B!45]{<                 # Head left until hitting a hyphen
    w[B=10]{                # For each newline on the way:
            t[T+1]                # Count it
            b[0]                  # Delete it
    }
}

v[X]                      # Move down as far as it is right + the number of \n
v                         # ...plus one

w[T!0]{                   # While the counting variable is nonzero:
    vb[124]                 # Go down and draw a pipe
    <[X]b[124]              # Draw a pipe on the left as well
    >w[B=0]{>}              # Go back to the right side
    t[T-1]                  # Decrement variable
}

w[X!1]{<b[95]}            # Draw the bottom of the box
<w[B!0]{^}                # Go up the left wall
w[Y!-1]{b[47]>^}          # Go up and right, drawing the lid
podziemny monorail
źródło
2
+1 za fajną animację. Jak to stworzyłeś?
Gowtham
@Gowtham Domyślam się, że nagrywasz ekran i przycinasz film. Następnie weź to i przekonwertuj na GIF. Oczywiście, zgaduję, nie znam rzeczywistej metody
Spotlight
@ awesomebing1 masz to
undergroundmonorail
9

Pyth, 16 14 bajtów

j+_m+*;d\/Uz.z

Wyjaśnienie

   m      Uz   - [V for d in range(len(input()))]
    +*;d\/     - " "*d + "/"
  _            - ^[::-1]
j+          .z - "\n".join(^+rest_of_input())

Dzięki @FryAmTheEggman za nowy algorytm!

Wypróbuj tutaj.

niebieski
źródło
8

Siatkówka, 34 20 bajtów

- (? = (- *)) ¶?
1 USD / ¶
-
 

W pierwszym kroku każdy -jest zastępowany przez -następujące po nim, a /i nową linię. Nowa linia na końcu oryginalnej pierwszej linii zostaje usunięta. W drugim kroku zmieniamy nowy -na spacje, co daje pożądany wynik.

Wypróbuj online tutaj.

randomra
źródło
2
Dla zabawy jest to możliwe również w jednym etapie: retina.tryitonline.net/… (choć te same bajty)
Martin Ender
Jeśli zjesz pierwszą linię nowego osobno, możesz użyć $%'do przechwytywania końcowych znaków, -co pozwala zaoszczędzić 5 bajtów: Wypróbuj online!
Neil
7

MATL , 14 15 bajtów

' /'jnXyPQ)`jt

Dane wejściowe powinny mieć końcowy znak nowej linii.

Wypróbuj online!

Wyjaśnienie

' /'       % push string (will be indexed into to generate the open lid)
jn         % read first line of input and push its length
Xy         % identity matrix with that size
P          % flip vertically
Q          % add 1. Now the matrix contains 1 and 2, to be used as indices
)          % index into string. Produces a 2D char array for the lid
`          % do-while loop
  j        %   push input line
  t        %   duplicate. Truthy if nonempty
           % implicitly end loop. The loop condition is the top of the stack,
           % that is, the input line that has just been read.
           % This is truthy if non-empty; and in that case another line will
           % be read in the next iteration.
           % implicitly display stack contents, bottom to top
Luis Mendo
źródło
5

Japt, 28 26 25 22 18 17 bajtów

Ur-@"
{SpUa- -Y}/

Przetestuj online!

Wyprowadza wiodącą nową linię, która jest akceptowalna według PO.

Jak to działa

Ur-@       // Replace each hyphen X in the input and its index Y with this function:
"          //  Start a string that contains a newline.
{        } //  Insert here:  
   Ua- -Y  //   Take the index of the last hyphen in the input, subtract Y,
 Sp        //   and return that many spaces.
/          //  Finish off the string with a slash.

Byłoby to 4 bajty krótsze, jeśli zawias może znajdować się na prawej krawędzi pudełka:

Ur-@"
{SpY}\\
ETHprodukcje
źródło
4

JavaScript (ES6), 66

b=>([a,t]=b.split`-
`,[...a+0].map(_=>(t=l+`/
`+t,l+=' '),l=''),t)

TEST

f=b=>([a,t]=b.split`-\n`,[...a+0].map(_=>(t=l+`/\n`+t,l+=' '),l=''),t)

var box = `-------
|     |
|_____|`

console.log=x=>O.textContent=x

console.log(f(box))
<pre id=O></pre>

edc65
źródło
3

Java 8, 158 118 bajtów

To dopiero początek, ale hej, FGITWFTW.

n->{String o="";int z=n.lastIndexOf("-"),i=z;for(;i-->0;o+="/\n")for(int y=i;y-->0;o+=" ");return o+n.substring(z+2);}

Oczekuje, że dane wejściowe są ciągiem, zwraca pole.

Addison Crump
źródło
3

Python 3, 1̶7̶0̶ 88 bajtów

Oto mój krótszy (e) kod: EDYCJA: Teraz o 82 bajty krótsze dzięki edycji kodu @Dennis!

f=open('f.txt')
d=len(f.readline())-1
a=f.read()
while d:d-=1;print(' '*d+'/')
print(a)

Python 3, 421 bajtów

Alternatywnie, dla zabawy możesz użyć tego, który otwiera go powoli:

import time
import os
f = open('f.txt', 'r')
e = f.readline()
a = f.read()
d = len(e)
c = 0
t = e + a
g = ''
clear = lambda: os.system('cls')
while c <= d - 1:
    clear()
    print(("\n" * ((d - 1) - (c))) + t)
    c += 1
    e1 = e[0:(d - c)  -1]
    e2 = e[(d - c):len(e)]
    e1 += '/'
    e2 = ' ' * len(e2)
    y = (' ' * len(e1)) + '/' + '\n'
    g += y
    t = (g + e1 + e2 + '\n' + a)[d:len(g + e1 + e2 + '\n' + a)]
    time.sleep(0.2)
f.close()

Aby użyć albo, musisz utworzyć plik tekstowy w tym samym katalogu, który zawiera pole ascii o dowolnej szerokości i głębokości, zwane „f.txt”. Następnie otworzy to pudełko.

Potwór
źródło
1
Możesz to jeszcze bardziej skrócić, skracając zmienne do pojedynczych liter i usuwając spacje między operatorami. Aby uzyskać ogólne wskazówki dotyczące gry w golfa w języku Python, zobacz tutaj .
Alex A.
Dlaczego, u licha , potrzebujesz czasu? To pytanie dotyczy tylko jednego wyjścia.
Addison Crump
Tak jak powiedziałem, moja interpretacja tej układanki była nieco niepoprawna, a jeśli ją wypiszesz, pokaże ci więcej niż zadane pytanie.
Monster
Ok, dodałem prostszą odpowiedź, która dokładnie odpowiada słowu, jakie rozumiem. To nie jest ładne, ale działa. Mój alternatywny kod jest dla każdego, kto jest na tyle niesamowity, że chce go oglądać
Monster
2
Kilka drobnych zmian powoduje zmniejszenie twojego bajtu do 81 (odczyt ze STDIN).
Dennis
3

Bash, 85 84 79 znaków

(Wersja Pure Bash, bez użycia zewnętrznych poleceń).

r(){
a="${a/-
/
$s/
}"
s+=\ 
[[ $a = -* ]]&&r
}
mapfile a
r
IFS=
echo "${a[*]}"

Tworzy wiodący nowy wiersz.

Przykładowy przebieg:

bash-4.3$ bash open-the-box.sh <<< $'-------\n|     |\n|_____|'

      /
     /
    /
   /
  /
 /
/
|     |
|_____|
człowiek w pracy
źródło
echojest zewnętrznym poleceniem - /usr/bin/echo;)
Levi
Plik echowykonywalny istnieje dla zgodności systemu operacyjnego ze standardami. Obecnie używa się go tylko wtedy, gdy ważna jest przenośność, ponieważ jest on zgodny ze standardem , ale większość współczesnych powłok ma własne wbudowane, echoktóre jest używane domyślnie: pastebin.com/RnxhweBv @Levi, jeśli zmienisz nazwę / przeniesiesz /usr/bin/echo, mój kod nadal będzie działał.
manatwork
(to był żart ....)
Levi
1
O. Dobrze. Przepraszam, już wcześniej spotkałem ludzi, którzy twierdzili to samo, ale poważnie.
manatwork
3

Perl, 61 54 33 + 3 = 36 znaków

s^-^" "x(length$')."/\n"^ge&chomp

Uruchom jako

perl -ple 's^-^" "x(length${chr 39})."/\n"^ge&chomp' closed_box_file

Każdy -w pierwszym wierszu jest zastępowany ciągiem, który jest wynikiem konkatenacji pewnej liczby , /i \n. ${chr 39}Zwraca Perl (nie) sławny $'aka $POSTMATCHzmiennej specjalnej. Wreszcie, chomp pozbywa się końcowego znaku nowej linii, który został dodany dla ostatniego -znaku.

Dzięki @manatwork za uratowanie 7 + więcej znaków.

Bonus - s^-^" "x$i++."\\\n"^ge&&chopotwiera okno od prawej krawędzi w 29 + 3 znakach :). Uruchom jako:

gowtham@ubuntu:~$ cat a
----
|  |
|__|
gowtham@ubuntu:~$ perl -plE 's^-^" "x$i++."\\\n"^ge&&chop' closed_box_file
\
 \
  \
   \
|  |
|__|
Gowtham
źródło
@manatwork Tylko pierwsza linia zawiera -, więc tak, mogę zagrać w nią jeszcze bardziej. Dzięki!
Gowtham
$.==1$.<2, &&chop&chopusuń dodatkową parę nawiasów wokół length, policz {chr 39}jako 1, ponieważ nie jest ona potrzebna tylko w wersji wiersza poleceń ze względu na składnię powłoki: $.<2&&s^-^" "x(length$')."/\n"^ge&chop+ 2 znaki dla opcji wiersza poleceń = 40 według mojego liczenia. pastebin.com/iDhUs9XX
manatwork
@manatwork Właściwie, $.==1lub $.<2można je wyeliminować, ponieważ zawiera tylko pierwszy wiersz-
Gowtham
Tak, widziałem co tam zrobiłeś. Byłem zdumiony. Nawiasem mówiąc, możesz użyć dosłownego zawijania wiersza w kodzie zamiast \n.
manatwork
Doh Znaleziono krótszy:s^-^$'=~y/-/ /r."/\n"^ge&chomp
manatwork
2

Pyth, 26 23 bajtów

jXK.z0jm+*\ t-lhKd\/lhK

Fuj Zdecydowanie może być krótszy; nadal nad tym pracuję.

Klamka
źródło
2

Python3, 76 bajtów

f=open(0)
w=len(f.readline())
while w:w-=1;print(' '*w+'/')
print(f.read())
  1. Uzyskaj długość pierwszego wiersza wprowadzania.
  2. Drukuj linie /poprzedzone malejącą liczbą spacji.
  3. Popchnij resztę stdinprosto do stdout.

EDYCJA: Właśnie zauważyłem, że mój kod jest prawie identyczny z edycją komentarza @Dennis o krótszym kodzie Python3 @ Monster, jedyną różnicą jest wydrukowanie pozostałej części stdinbezpośrednio zamiast przechowywania go w zmiennej. Świetne umysły!

josh2112
źródło
2

Płótno , 6 4 bajtów

jL/o

Wypróbuj tutaj!

Wyjaśnienie:

j      remove 1st line of the input
 L     get the width of the remaining input
  /    push a diagonal of that size
   o   and output that diagonal
       and implicitly output the remaining input
dzaima
źródło
1

Python 2, 100 bajtów

def o(b):
 m=b.split('\n')[1:]
 print"\n".join(["/".rjust(i)for i in range(len(m[0]),0,-1)]+m)

Definiuje funkcję, októra pobiera ciąg jako dane wejściowe. (W pytaniu nie podano pełnego programu).

Scimonster
źródło
1

PowerShell, 55 bajtów

$d,$b=$args-split"`n";($d.length-1)..0|%{" "*$_+"/"};$b

Pobiera dane wejściowe $argsjako ciąg znaków, -splits na nowych liniach `n ( odnośnik ) , zapisuje pierwszą linię w $d(jako ciąg), a pozostałe w $b(jako tablicę ciągów). Następnie zapętlamy od lengthpierwszego wiersza (minus 1) do 0każdej wyjściowej iteracji o tej liczbie spacji plus a /. Wreszcie wyjście $b(reszta ciągu wejściowego), które domyślnie wyprowadzi jeden w wierszu.

Przykładowy bieg

PS C:\Tools\Scripts\golfing> .\help-me-open-the-box.ps1 "----`n|  |`n|__|"
   /
  /
 /
/
|  |
|__|
AdmBorkBork
źródło
1

JavaScript (Node.js) , 56 bajtów

a=>a[b="replace"](/-+/,c=>c[b](d=/-/g,`
$'/`))[b](d,' ')

Wypróbuj online!

Powinien być napisany jako komentarzem @Neil „s odpowiedzi , ale nie mogę utworzyć jeszcze komentarzy

Any3nymous użytkownik
źródło
Witam i witam w PPCG. Zakładam, że masz na myśli odpowiedź Neila, na którą dalej grałeś. Możesz dodać link do odpowiedzi i poprawić nazwisko autora, aby wyrazić uznanie.
Jonathan Frech,
@JonathanFrech dzięki, zrobione
Any3nymous użytkownik
1

05AB1E (starsza wersja) , 9 bajtów

g'/1.Λ|»»

Wypróbuj online! (Tylko starsze)

Jak to działa

g'/1.Λ|»» – Full program. Takes input from STDIN.
g         - Length. Only takes the first line into account.
 '/       – Push a slash character, "/".
   1.Λ    – And diagonally up-right, draw a line of slashes of the given length.
      |»  – Push the remaining inputs (all other lines) joined on newlines.
        » – Then join the stack on newlines.
Pan Xcoder
źródło
1

Węgiel drzewny , 14 bajtów

↙L§⪪θ¶⁰M→✂⪪θ¶¹

Wypróbuj online (pełne) lub wypróbuj online (czyste) .

Wyjaśnienie:

Podziel wejście na nowe linie, weź długość pierwszego wiersza i wydrukuj wiersz o tej długości od prawego górnego rogu do lewego dolnego rogu:

Print(:DownLeft,Length(AtIndex(Split(q,"\n"),0)))
↙L§⪪θ¶⁰

Przesuń raz w prawo:

Move(:Right)
M→

Ponownie podziel dane wejściowe na nowe linie, usuń pierwszy element i wydrukuj to, co zostało niejawnie:

Slice(Split(q,"\n"),1)
✂⪪θ¶¹

(UWAGA: Umieszczenie danych wejściowych podzielonych na nowe wiersze w zmiennej (ponieważ robię to dwa razy powyżej) to 1 bajt dłuższy również 14 bajtów przy użyciu nieco innej metody (dzięki @Neil ):
≔⮌⪪θ¶θ↙L⊟θM→⮌θ Wypróbuj online (verbose) lub wypróbuj online (czysty) ).

Kevin Cruijssen
źródło
Jeśli odwrócisz wejście podzielone na nowe wiersze, możesz wyskoczyć z pierwszego wiersza, a następnie powrócić do 14 bajtów: Wypróbuj online!
Neil
0

JavaScript ES6, 106 bajtów

q=>(q=q.split`
`,n=q[0].length,eval('for(i=0,r="";i<n;i++)r+=" ".repeat(n-i-1)+"/\\n"'),r+q.slice(1).join`
`)

Dość proste: uzyskanie długości pierwszego wiersza, utworzenie trójkąta z odstępami /i dodanie go do oryginału, pociętego na plasterki i połączonego.

Przetestuj to! (Tylko ES6 :()

Conor O'Brien
źródło
2
Widzę, że rozwiązałeś problem XKCD za pomocą formatowania. Sprytny.
Kroltan
.repeat(n-i-1)=>.repeat(n+~i)
Downgoat
0

Python 2.7, 120 122 znaków

Potrzebuje pliku fz oryginalnym / zamkniętym pudełkiem, wyjściem jest otwarty. Pozdrawiam @Monster za pomysł ... spróbuje później dowiedzieć się, co to jest linia wielowierszowa, i sprawdź, czy jest krótsza.

for l in open('f').readlines():
 if l[1]==('-'):
  for x in range(1,len(l)):print(' '*(len(l)-x+1)+'/')
 else:print l[:-1]

Edytować

  • właśnie zauważyłem, że najbardziej na lewo /ma miejsce z przodu; +2 bajty
janrn
źródło
0

Ruby, 59 znaków

(Kod 57 znaków + 2 znaki opcji wiersza poleceń).

s=""
$_=$_.chars.map{(s<<" ")[1..-1]+?/}.reverse*$/if$.<2

Przykładowy przebieg:

bash-4.3$ ruby -ple 's="";$_=$_.chars.map{(s<<" ")[1..-1]+?/}.reverse*$/if$.<2' <<< $'-------\n|     |\n|_____|'
      /
     /
    /
   /
  /
 /
/
|     |
|_____|
człowiek w pracy
źródło
0

Bash, 129 znaków

Wymaga pliku wywoływanego az zamkniętym oknem, wyjście na standardowe wyjście.

for i in $(seq `cat a|awk 'NR==1{print length($1)-1}'` -1 1);{ for j in `seq 1 $i`;{ printf " ";};echo "/";};echo "/";tail -n2 a

Może być możliwe skrócenie go przez użycie sedi użycie stdin i orurowania.

Daniel Peukert
źródło
Dobra pierwsza odpowiedź na golfa. Kilka prostych sugestii dotyczących zmiany składni:for i in $(seq `awk 'NR<2&&$0=length-1' a` -1 1);{ for j in `seq 1 $i`;{ printf \ ;};echo /;};echo /;tail -n2 a
manatwork
0

PHP, 127 znaków

$s=$argv[1];$l=strlen(strtok($s,"\n"));for($i=0;$i<$l;$i++)$s=preg_replace("/-/","\n".str_repeat(" ",$l-$i-1)."/",$s,1);echo$s;

Wersja bez golfa:

$s=$argv[1];
$l=strlen(strtok($s,"\n"));

for($i=0;$i<$l;$i++){
    $v="\n".str_repeat(" ",$l-$i-1)."/";
    $s=preg_replace("/-/",$v,$s,1);
}
echo $s;
kuldeep.kamboj
źródło
W kodzie jest literówka: nie trafiłeś sigilu z $argv. Istnieje kilka drobnych sztuczek, które możesz zastosować: $l=strlen(strtok($s=$argv[1],"↵"));while($l)$s=preg_replace("/-/","↵".str_repeat(" ",--$l-$i)."/",$s,1);echo$s;(Użyj dosłownego nowego wiersza w kodzie, gdzie jest „↵”: pastebin.com/36t2fb0P )
manatwork
0

Python, 125 bajtów (110 bez pudełka)

i="\n---\n| |\n|_|"
l,b,r=i.count("-"),i.split('\n'),range
for x in r(1,l):print" "*(l-x)+"/"
for x in r(2,len(b)):print b[x]

Jeśli ktoś ma pomysł, jak go skrócić, daj mi znać!

Dave Lin
źródło
0

Awk, 47 46 znaków

(44-znakowy kod + 2 znaki opcji wiersza poleceń.)

/-/{OFS=RS;for(i=NF;i;i--){$i=s"/";s=s" "}}1

Przykładowy przebieg:

bash-4.3$ awk -F '' '/-/{OFS=RS;for(i=NF;i;i--){$i=s"/";s=s" "}}1' <<< $'-------\n|     |\n|_____|'
      /
     /
    /
   /
  /
 /
/
|     |
|_____|
człowiek w pracy
źródło
0

Gema, 51 49 31 znaków

-\P/-+/=@subst{-=\\ ;$1}/\n
-=/

Przykładowy przebieg:

bash-4.3$ gema -e '-\P/-+/=@subst{-=\\ ;$1}/\n;-=/' <<< $'-------\n|     |\n|_____|'
      /
     /
    /
   /
  /
 /
/
|     |
|_____|
człowiek w pracy
źródło