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

2
W przeciwieństwie do gry „Shut the Box”?
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.

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.


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

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


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.


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

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

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>


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.


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.


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|_____|'

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

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

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


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!


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

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


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|__|"
   /
  /
 /
/
|  |
|__|


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


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.

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


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 :()


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

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|_____|'
      /
     /
    /
   /
  /
 /
/
|     |
|_____|

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.


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;

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ć!


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|_____|'
      /
     /
    /
   /
  /
 /
/
|     |
|_____|

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|_____|'
      /
     /
    /
   /
  /
 /
/
|     |
|_____|


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.