मोल्डिंग ASCII कला


18

आपको एक एकल मुद्रण योग्य ASCII स्ट्रिंग दी गई है जिसमें कोई नईलाइन नहीं है, और एक बहुस्तरीय "मोल्ड", जिसमें रिक्त स्थान ( ), और हैश ( #) हैं।

आपको स्ट्रिंग में वर्ण द्वारा चरित्र जाना चाहिए, और स्ट्रिंग को बाएँ-दाएँ, ऊपर-नीचे क्रम में वर्णों का उपयोग करके हैश को बदलना होगा। यदि मोल्ड को भरने के लिए स्ट्रिंग बहुत कम है, तो आप आउटपुट करना बंद कर देते हैं, अगर स्ट्रिंग बहुत लंबी है तो आप मोल्ड को भरने के लिए स्ट्रिंग को छोटा कर देते हैं।


उदाहरण स्ट्रिंग / मोल्ड (स्ट्रिंग बहुत लंबा, छोटा):

Loremipsumdolorsitamet,consecteturadipiscingelit.Namsuscipitmagnanoneratgravidacondimentum.Vestibulumnecnisllorem.Fuscemolestieviverranibh,eueleifendnislplaceratnon.Namblanditturpislacus,vitaemolestielacusimperdietquis.Nullapulvinar,exquissollicitudinfacilisis,eratnullavolutpatlectus,etluctusenimvelitegetex.Inhachabitasseplateadictumst.Donecinterdumnullalacinia,sodalesloremin,eleifendturpis.Pellentesqueanisimi.Aeneannonlobortisdiam,quisaliquetquam.Aeneanaugueipsum,imperdietsedaliquetnon,volutpategetsapien.Nullampharetranullaquispretiumornare.Aliquamfermentumvestibulummassavitaevehicula.
###########################################################
##### ##############   ###### ###### ######################
#####  ##   ######   #  ##### ###### ########        ######
###### #  #  ####  #### ##### ###### #######  ######  #####
######   ###  ###       ##### ###### ####### #######  #####
######  ##### ### ########### ###### #######   ###   ######
###### ###### ###  ########## ######      #####   #########
##################       ####    ##########################
###########################################################

उदाहरण आउटपुट:

Loremipsumdolorsitamet,consecteturadipiscingelit.Namsuscipi
tmagn anoneratgravid   acondi mentum .Vestibulumnecnisllore
m.Fus  ce   molest   i  evive rranib h,euelei        fendni
slplac e  r  atno  n.Na mblan dittur pislacu  s,vita  emole
stiela   cus  imp       erdie tquis. Nullapu lvinar,  exqui
ssolli  citud inf acilisis,er atnull avolutp   atl   ectus,
etluct usenim vel  itegetex.I nhacha      bitas   seplatead
ictumst.Donecinter       dumn    ullalacinia,sodalesloremin
,eleifendturpis.Pellentesqueanisimi.Aeneannonlobortisdiam,q

उदाहरण स्ट्रिंग / मोल्ड (स्ट्रिंग बहुत छोटा, आउटपुट बंद):

This probably won't look good.
### ### ### ###
# # # # #   #
### ### #   # #
#   #   #   # #
#   #   ### ###

संगत उत्पादन:

Thi s p rob abl
y   w o n   '
t l ook     g o
o   d   .   

बाइट्स में सबसे छोटा कोड जीतता है।

इस वेबसाइट को विचार के लिए क्रेडिट ।


क्या इनपुट लाइन में हैश हो सकता है? (यदि ऐसा है, तो वह एक परीक्षण मामले का उपयोग कर सकता है।)
मार्टिन एंडर

क्या इनपुट लाइन में रिक्त स्थान हो सकते हैं?
मैनेटवर्क

क्या इनपुट में अग्रणी / अनुगामी स्थान / नई सीमाएँ हो सकती हैं?
Sp3000

@manatwork दूसरे परीक्षण मामले में, यह करता है।
मार्टिन एंडर

@ मार्टिनबटनर हां, इनपुट केस में हैश हो सकता है।
orlp

जवाबों:


5

CJam, 16 14 बाइट्स

2 बाइट बचाने के लिए Sp3000 के लिए धन्यवाद।

lq{s'#-\+(\}/;

यदि स्ट्रिंग बहुत कम है, तो एक त्रुटि के साथ समाप्त होता है, लेकिन त्रुटि STDERR पर मुद्रित होती है।

इसे ऑनलाइन आज़माएं!

वैकल्पिक रूप से (एक ही बाइट गिनती):

lq{SN+&\+(\}/;

व्याख्या

l       e# Read the input line.
q       e# Read the grid.
{       e# For each character in the grid...
  s     e#   Convert to string.
  '#-   e#   Remove "#" from it.
  \+    e#   Prepend it to the input line (this is a no-op for "#"s in the grid).
  (     e#   Pull off the first character from the input line. This will terminate the
        e#   program with an error once the input line is empty.
  \     e#   Swap the character with the input line.
}/
;       e# Discard the remainder of the input line if there is any.

7

लैबव्यू, 37 लैब व्यू आदिम

स्ट्रिंग को टेक्स्ट और मोल्ड में विभाजित करता है और फिर उन्हें एक सरणी में बदल देता है। साँचे की जाँच करता है यदि एक # है और पाठ से एक वर्ण डालता है और यह कुछ नहीं करता है। यदि पाठ या मोल्ड खाली हैं तो लूप से बाहर निकलें


तथ्य यह है कि आप LabView वार के साथ ऐसा किया था
ब्रेन गाइडर

और इसका मज़ा देखने के लिए!
Draco18s अब SE

6

हास्केल, 48 बाइट्स

जैसे "(स्ट्रिंग से बदलें) # (हैशमार्क स्ट्रिंग)":

[]#_=[]
(r:t)#('#':s)=r:t#s
r#(c:s)=c:r#s
_#_=[]

कम गोल्फ वाला:

combine replacements slots | null replacements = []
                           | null slots        = []
                           | head slots == '#' = head replacements : combine (tail replacements) (tail slots)
                           | otherwise         = head slots        : combine       replacements  (tail slots)

कूल, लेकिन यह अमान्य नहीं है जब तक कि आप I / O नहीं जोड़ते? जैसेimport Control.Applicative;main=liftA2(#)getLine getContents>>=putStrLn
घन

@ क्यूबिक समस्या कथन में IO (या एक पूर्ण कार्यक्रम) और अन्य समाधानों की आवश्यकता नहीं है, जिसमें पायथन 3 में एक भी शामिल है, IO शामिल नहीं है।
माइकल क्लेन

5

रेटिना , 42 40 बाइट्स

बाइट गिनती आईएसओ 8859-1 एन्कोडिंग मानती है।

T`#`×`¶.+
+`^(.)([^×]+)×
$2$1
^.*¶|×\D*

अनुगामी लाइनफीड महत्वपूर्ण है।

इसे ऑनलाइन आज़माएं!

व्याख्या

T`#`×`¶.+

हम पहली बार #गैर-एएससीआईआई (लेकिन विस्तारित एएससीआईआई) चरित्र के साथ ग्रिड का हिस्सा हैं, ×इसलिए हम उन्हें किसी भी तरह से भ्रमित नहीं करते हैं #जो पहली पंक्ति में दिखाई दे सकते हैं।

+`^(.)([^×]+)×
$2$1

अब हम ×पहली पंक्ति से संभव के रूप में कई बार भरते हैं पहले को बार-बार बदलकर ×हम पहली पंक्ति (जो प्रक्रिया में हटा दिया जाता है) पर पहले चरित्र के साथ पा सकते हैं।

^.*¶|×\D*

अंत में, हम पहली पंक्ति में छोड़ी गई किसी भी चीज़ से छुटकारा पाते हैं और साथ ही साथ पहली ×से इनपुट को दोनों दिशाओं में काटते हैं।


4

जावास्क्रिप्ट (ईएस 6), 57 56 55 बाइट्स

(s,m)=>m.replace(x=/[^]/g,c=>c-1?x&&c:x=s[i++]||"",i=0)

@Neil को 1 बाइट धन्यवाद दिया गया !

व्याख्या

इनपुट स्ट्रिंग में हैश के साथ काम करता है और इनपुट स्ट्रिंग समाप्त होने के बाद सफेद-जगह को पीछे छोड़ता है।

var solution =

(s,m)=>
  m.replace(x=/[^]/g,c=> // for each character c of the mold, initialise x to true
    c-1?                 // if c is a space or newline:
      x&&c               // if x is truthy, return c
                         // else if the string has ended, x will equal "" (false), return x
    :                    // else if c is a hash:
      x=                 // set x to the character of the input string
        s[i++]||"",      // return the input string character (or "" if finished)
    i=0                  // initialise i to 0
  )
<input type="text" id="input" value="This probably won't look good." /><br>
<textarea id="mold" rows="6" cols="40">### ### ### ###
# # # # #   #
### ### #   # #
#   #   #   # #
#   #   ### ###</textarea><br>
<button onclick="result.textContent=solution(input.value,mold.value)">Go</button>
<pre id="result"></pre>


1
अच्छा एल्गोरिथ्म, लेकिन m.replace(/./g,c=>...)कम है।
नील

@ नील तुम सही हो। मैं बहुत मुश्किल कोशिश कर रहा था कि यह आपके उत्तर के लिए अलग हो!
user81655

1
कोई और नहीं, क्योंकि आप /[^]/इसके बजाय उपयोग कर सकते हैं /.|\n/। (गलत तरीके से सुझाव देने के लिए माफी भी /./।)
नील

3

पायथन 3, 69 68 67 बाइट्स

def f(s,m):s=iter(s);return''.join(n<'#'and n or next(s)for n in m)

Ideone

FryAmTheEggman को धन्यवाद, बाइट के लिए चिएल दस ब्रिंक। वैकल्पिक रूप से, मैं एक अतिरिक्त ( printबिना ()) के लिए पायथन 2 का उपयोग कर सकता था ।


आप के printसाथ बदलकर एक बाइट बचा सकते हैं return
चील टेन ब्रिंच 10

2

पीबी , 359 बाइट्स

^w[B!0]{w[B=10]{t[T+1]b[0]}>}<w[T!0]{w[B!0]{<}>^b[T]vw[B!0]{t[B]b[0]^v[B]v<[X]w[B!0]{>}b[T]<[X]^[Y+2]w[B=0]{>}t[B]b[0]>b[T]v}^t[B-1]vw[B=0]{<}}>b[10]t[X]w[X!-2]{w[B!0]{v}<}w[X!T]{b[35]>}^[Y]^<[X]w[B!10]{t[B]b[0]w[T=35]{t[10]}v<[X]w[B!35]{w[B=0]{v<[X]<b[1]}>}b[T]^[Y]^<[X]w[B=0]{>}}<[X+2]w[B=0]{v}w[B!0]{b[0]>}w[Y!-1]{<[X]^w[B!0]{w[B=35]{b[0]}w[B=10]{b[35]}>}}

पीबी में, इनपुट सख्ती से एक आयामी है। यह समझ में नहीं आता है कि आप अपने इनपुट के साथ एक आकृति बना रहे हैं, यह सिर्फ 10 बाइट्स के साथ एक लंबी लाइन को देखता है, जिसमें 10 थ्रोट हैं। इस कार्यक्रम की पहली बात यह है कि मोल्ड के आकार को बनाने के लिए Y = 0, Y = 1, आदि पर इनपुट की सभी "पहली" पंक्ति की प्रतिलिपि बनाई गई है।

कुछ मैंने कोड गोल्फ में बहुत देखा है, लेकिन विशेष रूप से जब गूढ़ भाषा में गोल्फ, यह है कि आप अक्सर दो शाखाओं से निपटने के लिए नहीं करना चाहते हैं; आप बस अपने आप को स्थापित करते हैं कि आप दोनों मामलों में एक ही काम करते हैं। इस समस्या को हल करने का भोला तरीका संभवतः इनपुट के बाकी हिस्सों में हैश की संख्या के खिलाफ स्ट्रिंग की लंबाई की जांच करेगा और परिणाम के आधार पर कुछ करेगा, क्योंकि इसे अलग-अलग व्यवहार करना पड़ता है जो कट जाता है। लेकिन यह बहुत बाइट्स है।

इसके बजाय, मोल्ड को पूरा करने के बाद, नीचे की ओर एक अतिरिक्त रेखा जोड़ी जाती है। यह बस nएक पंक्ति में हैश है, जहांn स्ट्रिंग की लंबाई है। अब स्ट्रिंग फिट करने की गारंटी है! स्ट्रिंग के सभी पात्रों को सम्मिलित करने के बाद, जो अतिरिक्त लाइन जोड़ी गई थी, वह बिना शर्त नष्ट हो गई है। मोल्ड में किसी भी बचे हुए हैश के रूप में अच्छी तरह से मिट रहे हैं, और यह आवश्यक उत्पादन है!

बेशक, यह सभी हैश को नष्ट करने की युक्ति का उल्लंघन करेगा। सब के बाद, इनपुट स्ट्रिंग में एक हैश हो सकता है! इसे संभालने के लिए, मैं कल्पना के दूसरे भाग को संदर्भित करता हूं:

आपको एक एकल मुद्रण योग्य ASCII स्ट्रिंग दी गई है जिसमें कोई नया अंक नहीं है

(जोर मेरा।) जब तक हम स्ट्रिंग के साथ काम कर रहे हैं, तब तक हम वास्तव में परवाह नहीं करते हैं अगर इसमें नई रूपरेखाएं हैं, लेकिन हम जानते हैं कि कोई भी नहीं है। इसलिए, सभी हैश को मोल्ड में डालने से पहले नए सिरे से बदल दिया जाता है! सभी हैश नष्ट हो जाने के बाद, सभी नए सिरे को फिर से हैश से बदल दिया जाता है। यह संपूर्ण आउटपुट को एक एकल हैश-सीमांकित पंक्ति में नहीं बदलता है क्योंकि pb के 2D आउटपुट की प्रकृति का अर्थ है कि यह वास्तव में प्रत्येक पंक्ति के अंत में एक नई पंक्ति कभी नहीं डालता है, यह सिर्फ अगली पंक्ति पर जाता है।

Ungolfed:

# Start by copying down the mold
^
# (B means "the character under the cursor")
w[B!0]{       # While B isn't a null byte:
    w[B=10]{    # While B IS a newline:
            t[T+1]    # Increase T by 1
                      # (`T` is the only variable that can be modified directly)
            b[0]      # Overwrite with 0 to break out of inner loop
    }
    >           # Move to the right
                # (dodge the 0 we wrote and progress towards the end of input)
}

# Brush is now at the end of the input, T contains number of lines

<             # Make sure the brush is actually /on/ the input
w[T!0]{       # While T isn't 0:
    w[B!0]{<}>  # Go to the first character of the last line
    ^b[T]       # Place a flag above current character
                # Also a convenient way to get the value of T back later
    vw[B!0]{    # While the character under the flag isn't 0:
            t[B]b[0]  # Put it in T, overwrite with 0
            ^v[B]v    # Go down by the amount written in the space above
            <[X]      # Go left by the amount right the brush is (i.e. go to X=0)
            w[B!0]{>} # Find first empty space
            b[T]      # Write the value of T
            <[X]      # Go left by the amount right the brush is
            ^[Y+2]    # Go up by the amount down the brush is plus 2 (above input)
            w[B=0]{>} # Find flag
            t[B]b[0]  # Pick it up, overwrite with 0
            >b[T]     # Place it to the right
    v}
    ^t[B-1]v    # Collect flag - 1
    w[B=0]{<}   # Go to end of previous line
}

# Mold is placed, all that's left is placing the string
>b[10]        # Put a newline at the end, guaranteed to not be in the string
t[X]          # Save current X value in T

# Add more hashes, guaranteed to fit the input and findable later
w[X!-2]{       # While X!=-2:
    w[B!0]{v}    # Move down until hitting a null byte
    <            # Move left
}
w[X!T]{        # While not at the X value we saved earlier:
    b[35]>       # Travel right, leaving hashes
}

^[Y]^<[X]     # Go to (0, -1)

w[B!10]{      # Until hitting the newline at the end:
    t[B]b[0]    # Pick up character, overwrite with 0
    w[T=35]{    # If it's a hash...
            t[10]     # Make it a newline so we remember, deal with it later
    }
    v<[X]       # Go to (0, 0)
    w[B!35]{    # While B is not a hash:
            w[B=0]{   # While B IS null:
                    v       # Go down
                    <[X]<   # Go to X=-1
                    b[1]    # Print a 1 to break loop (it won't be rendered anyway)
            }
            >           # Go right, either ignore a non hash or go to X=0
    }
    b[T]        # Overwrite hash with picked up character
    ^[Y]^<[X]   # Go to (0, -1)
    w[B=0]{>}   # Go to first character of it to restart loop
}

<[X+2]        # Go to (-2, -1)
w[B=0]{v}     # Go down until finding the row of added hashes
w[B!0]{b[0]>} # Wipe it out unconditionally
w[Y!-1]{      # For every remaining line on the screen:
    <[X]^       # Go to the beginning
    w[B!0]{     # For each character in it:
            w[B=35]{  # If it's a hash:
                    b[0]    # Destroy it
            }
            w[B=10]{  # If it's a newline:
                    b[35]   # Write a hash (after the check to destroy hashes!)
            }
    >}
}

अच्छा लगा, जो बहुत काम की लगती है।
R

1

ईएस 6, 59 बाइट्स

(t,m)=>m.replace(/#/g,h=>t[i++]||h,i=0).replace(/#[^]*/,'')

यदि पाठ में हैश हो सकता है तो 70 बाइट्स:

(t,m)=>m.replace(/#/g,(_,n)=>t[i]&&(j=++n)&&t[i++],i=0,j=0).slice(0,j)

ट्रैपिंग व्हाट्सएप को न हटाएं, बिल्कुल मोल्ड को दोहराएं, बिल्कुल इनपुट स्ट्रिंग हैश वर्णों की जगह।
orlp

@orlp धन्यवाद, मैं उस संस्करण को फिर से संपादित करूँगा।
नील

1

पर्ल, 53 51 42 + 2 = 44 बाइट्स

@a=/./g;$/="";$_=<>;s/#/shift@a/ge;s/\s+$//

-pचलाने की आवश्यकता है। स्पष्टीकरण:

@a=/./g; # Split first line into an array of characters
$/=""; # Enable slurp mode (read the rest of lines in one go)
$_=<>;
s/#/shift@a/ge;
s/\s+$//
# With '-p' auto print is enabled

मुझे आउटपुट लाइनों की शुरुआत में कुछ बदसूरत "1" मिलते हैं। एक साफ उत्पादन के लिए यह प्रयास करें:$a=<>;$/="";say<>=~s/#/substr$a,$i++,1/ger
manatwork

@ मैनटवर्क मुझे एहसास हुआ कि साथ ही, $/शामिल होने के बजाय के साथ चतुर
andlrc



1

ईएस 6, 47 बाइट्स

संभवतः सबसे सीधा समाधान।

(S,R)=>(i=-1,S.replace(/#/g,_=>R[++i]||R[i=0]))

यह कोड एक अनाम फ़ंक्शन बनाता है जो 2 पैरामीटर प्राप्त करता है और अंतिम परिणाम देता है।

पहला पैरामीटर Sआपके साथ "मैप" स्ट्रिंग है "#", जबकि दूसरा पैरामीटर Rउन लोगों के लिए "प्रतिस्थापन" है "#"


0

अजगर ३

152 127 बाइट्स

एक पूरा कार्यक्रम।

from sys import stdin as S
s=list(S.readline())
print(''.join([''if not s else(s.pop(0)if m=='#'else m)for m in S.read()]))

106 बाइट्स

एक फ़ंक्शन जो इनपुट के रूप में स्ट्रीम लेता है।

def f(S):s=list(S.readline());return''.join([''if not s else(s.pop(0)if m=='#'else m)for m in S.read()])

हमारे पास पहले से ही एक पायथन जवाब है जो बहुत कम है और आउटपुट के निर्माण के लिए उसी विधि का उपयोग करता है।
Mego

समझा। मैंने इसे कल लिखा था, जब कि उत्तर अभी तक नहीं था। इतनी देर पोस्ट करने के लिए क्षमा करें
Chiel दस Brinke

आप देर से पोस्ट नहीं कर रहे हैं, बहुत से लोगों ने शायद इस सवाल को अभी तक नहीं देखा है (मैं निश्चित रूप से इस पोस्ट को देखने तक नहीं गया था)
ब्लू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.