Kutuyu Açmama Yardım Et


33

Bir ASCII-sanat kutum var ve açmak için bir programa ihtiyacım var.

Örnekler

Giriş:

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

Çıktı:

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

Şartname

  • İlk satır sadece -en az 3 tanesinden oluşacaktır.
  • Ortadaki satırlar |boşluklarla başlayacak ve bitecek|
    • Tüm orta sıralar aynı olacak
  • Son satır ile başlayacak |olan _ve a ile sona|
  • Tüm satırlar aynı uzunlukta olacak

Kutuyu açmak:

  • Her -bir değiştirilmelidir /hatları ve pozisyon artan içinde.

2
Oyunun aksine "Kutuyu Kapat"?
Addison Crump,


28
Kapak açıldığında iki kat daha uzun olur? Pekala, ASCII sanatını suçla.
Darrel Hoffman,

8
Kutuda ne var?
Williham Totland,

2
Çalışan bir tercüman yok, o zaman sanırım olmaz. Önemli değil; tercüman yaptığımda (yakında, umarım), cevabı ben gönderirim.
ETHProductions

Yanıtlar:


7

CJam, 14 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

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

Önde gelen bir yeni hat çıkarır. -S satırını alıp bunları bir üçgene dönüştürerek çalışır, sonra -s'yi boşluklarla değiştirir .

Düzenleme: @ edc65 sayesinde 5 bayt kaydedildi.


1
+1 Yeni bir şey öğrendim ($ '). Bunun yerine bu eski numara sizin için 4 byte kazandırabilir:f=s=>s[R='replace'](/-+/,s=>s[R](/-/g,"\n$'/"))[R](/-/g,' ')
edc65

@ edc65 Teşekkürler, aslında 5 bayt yapıyorum; ayrıca yazım hatalarını düzelttiğiniz için teşekkür ederim (tahmin edebileceğiniz gibi, \ndaha sonra geliştirip dönüştüreceğim).
Neil

9

pb (NONCOMPETING), 125 bayt

^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]>^}

Bu cevabı çalıştırmanız gereken pbi sürümü, sorudan daha yeni. Girdide yeni satırlara izin vermek için hiç uğraşmamam dışında, eski sürümlerde işe yarayacaktı. Oh iyi.

İlk olarak, bu girdideki yeni satırları sayarak kutunun yüksekliğini belirler. Bunu bir kez öğrendiğinde, kutunun sağ tarafının Y konumuna gider, olması gereken yere iner ve duvarları ve zemini çizerek kapakla bitirir.

Bu eğlenceli animasyona göz atın!

Uzun duraklama, girişin üzerinden geçen fırçadır.

Ungolfed:

^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
Serin animasyon için +1. Nasıl yarattın?
Gowtham

@Gowtham Sanırım ekranınızı kaydedip videoyu kırpabilirsiniz. Ardından, bunu alın ve bir GIF'e dönüştürün. Tabii ki, sadece tahmin, gerçek yöntemi bilmiyorum
Spotlight

@ awesomebing1 tamamdır
undergroundmonorail

9

Pyth, 16 14 bayt

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

açıklama

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

Yeni algoritma için @FryAmTheEggman teşekkürler !

Burada dene.


8

Retina, 34 20 bayt

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

İlk adımda her -biri -onu takip eden, a /ve newline ile değiştirilir. Orijinal ilk satırın sonundaki yeni satır silinir. İkinci adımda, yenilerini -istenen çıktıya yol açan boşluklara değiştiririz .

Burada çevrimiçi deneyin.


2
Sadece eğlenmek için, tek bir aşamada da mümkün: retina.tryitonline.net/… (aynı byte bile)
Martin Ender

İlk yeni satırı ayrı ayrı yerseniz, 5 bayttan tasarruf $%'eden izleri yakalamak için kullanabilirsiniz -: Çevrimiçi deneyin!
Neil

7

Matl , 14 15 bayt

' /'jnXyPQ)`jt

Girdide izleyen bir satırsonu olmalı.

Çevrimiçi deneyin!

açıklama

' /'       % 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 bayt

Ur-@"
{SpUa- -Y}/

Çevrimiçi test edin!

OP'ye göre kabul edilebilir bir öncü yeni satır çıkarır.

Nasıl çalışır

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.

Menteşenin kutunun sağ kenarında olmasına izin verilirse, bu 4 bayt daha kısa olacaktır:

Ur-@"
{SpY}\\

4

JavaScript (ES6), 66

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

ÖLÇEK

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 bayt

Bu sadece bir başlangıç, ama hey, 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);}

Bir dize olarak girdi bekliyor, kutuyu döndürür.


3

Python 3, 1̶7̶0̶ 88 bayt

İşte kısa (er) kodum: EDIT: Şimdi 82 bytes @Dennis'in Kodu ile Daha Kısa.

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

Python 3, 421 bayt

Alternatif olarak, sadece eğlence için, yavaşça açan bir tane kullanabilirsiniz:

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

Her ikisini de kullanmak için, aynı dizinde 'f.txt' adında herhangi bir genişlik veya derinlikte bir ascii kutusu içeren bir metin dosyası oluşturmanız gerekir. Daha sonra o kutuyu açacaktır.


1
Değişkenleri tek harflere kısaltarak ve operatörler arasındaki boşlukların çoğunu kaldırarak bunu daha da kısaltabilirsiniz. Python'da golf oynamak için genel ipuçları için buraya bakın .
Alex A.

Neden dünyada zamana ihtiyacın var? Bu soru sadece tek bir çıktı ister.
Addison Crump,

Dediğim gibi, bu bulmacanın yorumlanması biraz kapalıydı ve eğer çıktısını alırsanız, sorulandan daha fazlasını size gösterir.
Canavar

Tamam, şimdi tam olarak anladığım kadarıyla sorunun söylediğini yapan daha basit bir cevap ekledim. Güzel değil ama işe yarıyor. Alternatif kodum, açık izlemek istemek için yeterince harika olan herkes için
Monster

2
Birkaç küçük değişiklik , bayt sayınızı 81'e düşürür (STDIN'den okuma).
Dennis,

3

Bash, 85 84 79 karakter

(Saf Bash sürümü, kullanılan harici komut yok.)

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

Önde gelen bir yeni hat çıkarır.

Örnek çalışma:

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

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

echoharici bir komuttur - /usr/bin/echo;)
Levi

echoYürütülebilir standartlarına işletim sisteminin uygunluk için vardır. Günümüzde tek tek kullanıldığında bu, bir kadar olduğu gibi taşınabilirlik, önemliyse standart , Ama en modern kabukları kendi yerleşiğini sahip echovarsayılan olarak kullanılır: pastebin.com/RnxhweBv Yeniden adlandırmak eğer / your hareket @Levi /usr/bin/echo, gözlerimi kod hala çalışacak.
Manatwork

(şakaydı ....)
Levi

1
Ah. Tamam. Üzgünüm, daha önce aynı şeyi iddia eden, ancak ciddiye alan insanlarla tanıştım.
Manatwork

3

Perl, 61 54 33 + 3 = 36 karakter

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

Olarak çalıştır

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

Her -ilk satırında bazı sayısının birleştirme bir sonucudur bir dize ile değiştirilir , /ve \n. ${chr 39}perl'in (in) ünlü $'aka $POSTMATCHözel değişkenini değerlendirir. Son olarak, chomp sonuncusu için eklenen sondaki yeni satır karakterinden kurtulur.- karakter .

7 + daha fazla karakter tasarrufu için @ manatwork sayesinde.

Bonus - s^-^" "x$i++."\\\n"^ge&&chopkutuyu sağ taraftan 29 + 3 karakterle açar :). Olarak çalıştır:

gowtham@ubuntu:~$ cat a
----
|  |
|__|
gowtham@ubuntu:~$ perl -plE 's^-^" "x$i++."\\\n"^ge&&chop' closed_box_file
\
 \
  \
   \
|  |
|__|

@ manatwork Sadece ilk satır içeriyor -, bu yüzden evet, daha da çok golf oynayabilirim. Teşekkürler!
Gowtham

$.==1$.<2, &&chop&chop, etrafındaki fazla parantez çiftini kaldırın, kabuğun sözdizimi nedeniyle sadece komut satırı sürümü için gerekli olmadığından 1 olarak lengthsayın {chr 39}: $.<2&&s^-^" "x(length$')."/\n"^ge&chopsayıma göre komut satırı seçenekleri için + 2 karakter = 40. pastebin.com/iDhUs9XX
manatwork 19

@manatwork Aslında, $.==1veya $.<2sadece ilk satırın içerdiği için elimine edilebilir-
Gowtham

Evet, orada ne yaptığını gördüm. Ve ben şaşırdım. Bu arada, kodda değişmez bir satır kaydırma kullanabilirsiniz \n.
Manatwork

Hamuru. Daha kısa olanı s^-^$'=~y/-/ /r."/\n"^ge&chomp
buldum

2

Pyth, 26 23 bayt

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

Yuck. Kesinlikle daha kısa olabilir; hala üzerinde çalışıyor.


2

Python3, 76 bayt

f=open(0)
w=len(f.readline())
while w:w-=1;print(' '*w+'/')
print(f.read())
  1. İlk giriş satırının uzunluğunu alın.
  2. /Azalan boşluk sayısından önce gelen satırları yazdırın .
  3. Geri kalanını stdindümdüz itin stdout.

EDIT: Kodumun, @ Monster'ın kısa Python3 kodunun @Dennis'in yorum düzenleme ile neredeyse aynı olduğunu fark ettim, tek fark, geri kalanını stdinbir değişkende saklamak yerine doğrudan yazdırmak . Büyük beyinler!


2

Tuval , 6 4 bayt

jL/o

Burada dene!

Açıklama:

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 bayt

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

Dizeyi ogirdi olarak alan bir işlevi tanımlar . (Tam program soruda belirtilmedi).


1

PowerShell, 55 bayt

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

Girişi alır $args, bir dizi olarak -splityeni satırlar üzerinde s `n ( referans renkli ) , mağaza içinde ilk satırı $d(bir karakter dizisi) içine geri kalan $b(şeritlerinin bir dizi olarak). Daha sonra lengthilk satırın içinden (eksi 1) 0ve her yinelemede bu boşluk sayısını artı a /. Sonunda çıktı$b varsayılan olarak her satıra bir tane çıkacak olan (giriş dizesinin geri kalanı).

Örnek Çalıştırma

PS C:\Tools\Scripts\golfing> .\help-me-open-the-box.ps1 "----`n|  |`n|__|"
   /
  /
 /
/
|  |
|__|



1

05AB1E (eski) , 9 bayt

g'/1.Λ|»»

Çevrimiçi deneyin! (Eski okunur)

Nasıl çalışır

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

Kömür , 14 bayt

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

Çevrimiçi deneyin (ayrıntılı) veya çevrimiçi deneyin (yalnızca saf) .

Açıklama:

Girdiyi yeni satırlara bölün, ilk satırın uzunluğunu alın ve bu uzunluktaki bir satırı Üst-Sağdan Aşağı-Sola doğru yazdırın:

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

Bir kez sağa hareket et:

Move(:Right)
M→

Girişi tekrar satırsonlarına bölün ve ilk öğeyi kaldırın ve örtük olarak kalanları yazdırın:

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

(NOT: (İki kez yukarıdaki bunu beri) bir değişkene satırbaşıyla giriş bölünmüş koymak olduğunu artık 1 bayt (teşekkür biraz farklı bir yöntem kullanılarak da 14 byte @Neil ):
≔⮌⪪θ¶θ↙L⊟θM→⮌θ Çevrimiçi (ayrıntılı) Deneyin veya çevrimiçi denemek (saf) ).


Girdileri yeni satırlarla tersine çevirirseniz, ilk satırın karşısına çıkarsınız, bu da sizi 14 bayta geri getirir: Çevrimiçi deneyin!
Neil

0

JavaScript ES6, 106 bayt

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

Yeterince basit: İlk satırın uzunluğunu elde etmek, sondaki boşluk ile üçgen oluşturmak / ve bunu orijinaline eklemek, dilimlenmiş ve birleştirmek.

Test et! (Yalnızca ES6 :()


2
Biçimlendirme kullanarak XKCD sorununu çözdüğünü görüyorum . Zeki.
Kroltan

.repeat(n-i-1)=>.repeat(n+~i)
Downgoat

0

Python 2.7, 120 122 karakter

fOrijinal / kapalı kutulu bir dosyaya ihtiyaç duyulur , çıktı açılır. Fikir için @Monster'a şerefe ... daha sonra çok satırlı girişi anlamaya ve daha kısa olup olmadığını görmeye çalışacaktır.

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]

Düzenle

  • sadece en solun /önünde boşluk olduğunu fark ettim ; +2 bayt

0

Yakut, 59 karakter

(57 karakter kod + 2 karakter komut satırı seçenekleri.)

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

Örnek çalışma:

bash-4.3$ ruby -ple 's="";$_=$_.chars.map{(s<<" ")[1..-1]+?/}.reverse*$/if$.<2' <<< $'-------\n|     |\n|_____|'
      /
     /
    /
   /
  /
 /
/
|     |
|_____|

0

Bash, 129 karakter

aKapalı kutu ile adlandırılan bir dosya gerektirir , stdout'a çıktı verir.

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

sedStdin ve piping kullanarak ve kullanarak daha kısa hale getirmek mümkün olabilir .


Güzel ilk golf cevap. Bazı basit sözdizimi değişikliği önerileri: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 15

0

PHP, 127 karakter

$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;

Ungolfed versiyonu:

$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;

Kodunuzda bir yazım hatası var: işaretini kaçırdınız $argv. $l=strlen(strtok($s=$argv[1],"↵"));while($l)$s=preg_replace("/-/","↵".str_repeat(" ",--$l-$i)."/",$s,1);echo$s;
Uygulayabileceğiniz

0

Python, 125 bayt (110 kutusuz)

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]

Birisi onu kısaltmak için bir fikir varsa, lütfen bana bildirin!


0

Awk, 47 46 karakter

(44 karakter kodu + 2 karakter komut satırı seçeneği.)

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

Örnek çalışma:

bash-4.3$ awk -F '' '/-/{OFS=RS;for(i=NF;i;i--){$i=s"/";s=s" "}}1' <<< $'-------\n|     |\n|_____|'
      /
     /
    /
   /
  /
 /
/
|     |
|_____|

0

Gema, 51 49 31 karakter

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

Örnek çalışma:

bash-4.3$ gema -e '-\P/-+/=@subst{-=\\ ;$1}/\n;-=/' <<< $'-------\n|     |\n|_____|'
      /
     /
    /
   /
  /
 /
/
|     |
|_____|


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.