सकारात्मक रूप से पूर्णांक की हत्या


21

परिचय

अंकगणित गॉल एक विशेष सुविधा है जो सकारात्मक पूर्णांकों को अव्यवस्थित करती है। हालांकि, हाल ही में, सकारात्मक पूर्णांक भागने की कोशिश कर रहे हैं। इसलिए वार्डन ने अन्य पूर्णांकों को संदेश भेजने के लिए कुछ सकारात्मक पूर्णांकों को समाप्त करने का निर्णय लिया है । उन्होंने एक सॉफ्टवेयर इंजीनियर को नियुक्त किया है जो अधिकतम प्रभाव के लिए पूर्णांक को समाप्त करने के लिए एक प्रोग्राम लिखने के लिए कहे।

इनपुट विवरण

इनपुट STDIN, कमांड लाइन तर्क या उपयोगकर्ता इनपुट फ़ंक्शन (जैसे raw_input) के माध्यम से दिया जाता है । आपके पास इसे फ़ंक्शन तर्क या प्रीइंस्टीलाइज्ड वैरिएबल के रूप में नहीं रखा जा सकता है (जैसे यह प्रोग्राम किसी वैरिएबल में इनपुट की अपेक्षा करता है x)।

इनपुट की पहली पंक्ति में एक एकल धनात्मक पूर्णांक होता है nजहाँ 8 >= n >= 3। इसके बाद सेट से वर्ण nवाली लाइनें हैं । यहाँ एक उदाहरण इनपुट है:n[1,2,3,4,5,6,7,8,9]

5
22332
46351
65455
24463
65652

आउटपुट विवरण

वार्डन संख्या को समाप्त करना चाहते हैं ताकि निम्नलिखित शर्तें पूरी हों:

  • परिणामस्वरूप ग्रिड की प्रत्येक पंक्ति और स्तंभ में, कोई भी संख्या दो बार दिखाई नहीं देगी;
  • कोई भी दो समाप्त संख्याएं समीप या क्षैतिज रूप से लंबवत नहीं हो सकती हैं;
  • बचे हुए नंबरों को एक रूढ़िवादी रूप से सन्निहित समूह बनाना होगा - किसी भी बचे हुए नम्बर से किसी भी अन्य बचे हुए नम्बर पर केवल क्षैतिज और लंबवत गति से यात्रा करना संभव होगा और कभी भी किसी समाप्त हो चुकी संख्या को पार करना संभव नहीं होगा।

आउटपुट इनपुट (शून्य से पहली पंक्ति), सफाया संख्या के साथ साथ बदल दिया #

एक से अधिक समाधान हो सकते हैं। यदि ऐसा है, तो आप किसी भी समाधान का उत्पादन कर सकते हैं।

इसका भी कोई समाधान नहीं हो सकता है। अगर ऐसा है, तो स्ट्रिंग को आउटपुट करेंno answer

यहाँ उदाहरण इनपुट के लिए एक संभावित आउटपुट है:

#2#3#
46351
6#4#5
24#63
#56#2

उदाहरण इनपुट और आउटपुट

प्रत्येक इनपुट के लिए कई आउटपुट हैं, इसलिए ये आउटपुट केवल उदाहरण हैं।

इनपुट:

5
46551
51565
32654
14423
43244

आउटपुट:

46#51
#156#
326#4
1#423
#324#

इनपुट:

7
7183625
1681563
5238564
8786268
1545382
3814756
5325345

आउटपुट:

71#362#
#6815#3
5238#64
#7#62#8
154#382
3814756
#325#4#

इनपुट:

8
21534768
75196287
68392184
96244853
44865912
76516647
89751326
43698979

आउटपुट:

21#34768
#5196287
683#21#4
9#24#853
#4865912
7#51#64#
89751326
436#8#7#

इनपुट:

4
2222
2331
3112
1322

आउटपुट:

no answer

4
(से भी जाना जाता एकल ।)
दरवाज़े

यह पहेली बेहतरीन है। धन्यवाद। एक समाधान पर काम करना
ऐसा नहीं है कि चार्ल्स

1
मुझे यह पहेली पसंद है, लेकिन इसका उत्तर "जैसा है" एक ब्राउज़र में जावास्क्रिप्ट का उपयोग करके किया जा सकता है, क्योंकि एकमात्र उपयोगकर्ता इनपुट विधि promptमल्टी लाइन इनपुट की अनुमति नहीं देती है।
edc65

जवाबों:


0

रूबी, 346 344 329 316 बाइट्स, sl 3w

यह कोड-गोल्फ है, कोड-फास्ट नहीं, इसलिए ...

N=/!/=~G=$*[1..-1]*?!
M=N*N
g=->i{(!G[i]||G[i]<?*||i<0||A[i])&&break
A[i]=0
[1,N+1,-1,-1-N].map{|a|g[i+a]}}
f=->w,a{A=[];g[/\d/=~G=a];/#.{#{N}}?#/!~G&&/(\d)([^!]*|.{#{N}}.{#{O=N+1}}*)\1/!~G&&A.count(0)+w==M&&N.times.map{|m|puts G[m*(1+N),N]}&&exit
(w...M).map{|j|b=a+'';b[j]=?#
w<M&&f[w+1,b]}}
f[0,G]
$><<"no answer"

इसका उपयोग इस तरह करें:

mad_gaksha@madlab ~/Applications/Tools $ ruby -W0 c50442.rb 3 323 312 231
#23
312
231

ध्वज -W0आवश्यक नहीं है, लेकिन मेरा सुझाव है कि आप इसे या तो चेतावनियों को अक्षम करने के लिए जोड़ दें या फिर पुनर्निर्देशित करें stderr...

मुझे बताएं कि क्या आपके पास n = 6,7,8 के उदाहरणों पर इसे चलाने के लिए पर्याप्त धैर्य है

बदलाव का

  • eachmap, @NotThatCharles करने के लिए धन्यवाद
  • निकटवर्ती विलोपन और समान अंकों के लिए दो regexps द्वारा जाँच करें , @NotThatCharles के समान
  • अनुकूलित पढ़ने इनपुट थोड़ा
  • छोटा और धीमा

आकार में कुछ वृद्धिशील सुधार: प्रायद्वीप रेखा की \dतुलना [^#]में कम है ; M.times.to_aसे अधिक लंबा है(0..M-1).to_a
ऐसा नहीं है कि चार्ल्स

@NotThatCharles सुझावों के लिए धन्यवाद! लेकिन M.times.to_a1 बाइट से छोटा है (0..M-1).to_a;) (0...M).to_aभी काम करता है और उसी लंबाई का है।
ब्लुटोरांगे

... गिनती मुश्किल है
नहीं कि चार्ल्स

क्या यह वास्तव में पूरा होता है जब n = 8?
नहीं कि चार्ल्स

@NothatCharles यदि आप पर्याप्त समय तक इंतजार करते हैं, या एक सुपर-फास्ट पीसी का उपयोग करते हैं, तो हां, यह होना चाहिए। यह गति के बिना किसी भी प्रतिबंध के बिना एक कोड-गोल्फ है, इसलिए मैंने कोड-लंबाई को प्राथमिकता दी ...
blutorange

5

रूबी - 541 ..., 394

मूल एल्गोरिथम पुनरावर्ती रूप से चयन करने के लिए डुप्लिकेट की एक पुनरावर्ती गहराई-पहली खोज है, पंक्ति 1, फिर कॉलम 1, फिर पंक्ति 2, आदि के माध्यम से देख रहा है, और जाँच कर रहा है कि दो पड़ोसी मारे नहीं गए हैं और ग्रिड जुड़ा हुआ है (जो कि break ifखंड में है) वहाँ, और बिट जो इससे पहले आता है)।

K=(0...(N=gets.to_i)*N).to_a
J=gets(p).split*''
H=->m{K&[m+1,m-1,m+N,m-N]}
Q=->k{s=[k[j=0]]
(j=s.size
s.map{|x|(s+=H[x]&k).uniq!})while s[j]
break if(K-k).any?{|m|(H[m]-k)[0]}||k!=k&s
$><<K.map{|m|[k.index(m)?J[m]:?#,m%N>N-2?"
":p]}*''|exit if !g=((0...N*2).map{|x|(k.select{|m|m.divmod(N)[x/N]==x%N}.group_by{|m|J[m]}.find{|l,c|c[1]}||[])[1]}-[p]).min
g.map{|d|Q[k-g<<d]}}
Q[K]
puts"no answer"

कुछ साफ टोटके:

if w[1]की तुलना में बहुत कम है if !w.one?और यदि आप जानते हैं कि कम से कम एक सदस्य है, तो यह एक ही परिणाम है।

इसी तरह, [0]की तुलना में कम है any?अगर कोई ब्लॉक है, और s[j]के लिए एक प्यारा शॉर्टकट है j<s.size(तकनीकी रूप से, यह अधिक की तरह हैj.abs<s.size ) के

और y%N+(y/N).iसे बहुत कम हैComplex(y%N,y/N)

इसके अलावा, जब तारों को उत्पन्न करने के लिए दो जटिल स्थितियां होती हैं, तो यह [cond1?str1a:str1b,cond2?str2a:str2b]*''करने के लिए सभी पार्न्स या #{}एस को जोड़ने की तुलना में छोटा हो सकता है।

असहमति और स्पष्टीकरण:

(यह 531 बाइट संस्करण से है। मैंने बदलाव किए हैं। सबसे विशेष रूप से, मैंने तब से उत्पाद को कॉल को समाप्त कर दिया है - एक समय में प्रति पंक्ति / कॉलम एक अंक हल करता हूं, और जे अब केवल एक सरणी है, जिसे अनुक्रमित किया गया है। पूर्णांक। सभी निर्देशांक पूर्णांक हैं।)

H पड़ोसियों की गणना करता है

def H m 
  # m, like all indices, is a complex number 
  #    where the real part is x and the imaginary is y
  # so neighbors are just +/-i and +/-1

  i='i'.to_c
  neighborhood = [m+1, m-1, m+i, m-i]

  # and let's just make sure to eliminate out-of-bounds cells
  K & neighborhood
end

N ग्रिड का आकार है

N = gets.to_i

K नक्शे की कुंजी हैं (जटिल संख्या)

# pretty self-explanatory
# a range of, e.g., if N=3, (0..8)
# mapped to (0+0i),(1+0i),(2+0i),(0+1i),(1+1i),(2+1i),...
K = (0..N**2-1).map{|y| (y%N) +(y/N).i }

J इनपुट मैप (जेल) है

# so J is [[0+0,"2"],[0+1i,"3"],....].to_h
J=K.zip($<.flat_map {|s|
  # take each input line, and...
  # remove the "\n" and then turn it into an array of chars 
  s.chomp.chars
}).to_h

k गैर-मारे गए कुंजी हैं

# starts as K

Q मुख्य पुनरावर्ती विधि है

def Q k
  j=0 # j is the size of mass
  # the connected mass starts arbitrarily wherever k starts
  mass=[k[0]]
  while j < s.size # while s hasn't grown
    j = mass.size   
    mass.each{|cell|
      # add all neighbors that are in k
      (mass+=H[cell] & k).uniq!
    }
  end
  # if mass != k, it's not all orthogonally connected
  is_all_connected = k!=k&mass

  # (K-k) are the killed cells 
  two_neighbors_killed = (K-k).any?{|m|
    # if any neighbors of killed cells aren't in k,
    # it means it was killed, too 
    (H[m]-k)[0]
  }
  # fail fast
  return if two_neighbors_killed || is_all_connected

  def u x
    x.group_by{|m|J[m]}.select{|l,c|c[1]}
  end

  rows_with_dupes = Array.new(N){|r|u[k.select{|m|m.imag==r}]}

  cols_with_dupes = Array.new(N){|r|u[k.select{|m|m.real==r}]}

  # dupes is an array of hashes
  # each hash represents one row or column.  E.g.,
  #   {
  #     "3"=>[(0+0i),(1+0i),(3+0i)],
  #     "2"=>[(2+0i),(4+0i)]
  #   }
  # means that the 0th, 1st and 3rd cells in row 0
  # all are "3", and 2nd and 4th are "2".
  # Any digits without a duplicate are rejected.
  # Any row/col without any dupes is removed here.
  dupes = (rows_with_dupes+cols_with_dupes-[{}])

  # we solve one row at a time
  first_row = dupes[0]

  if !first_row
    # no dupes => success!
    J.map{|m,v|k.member?(m)?v:?#}.each_slice(N){|s|puts s*''}
    exit
  else
    # the digit doesn't really matter
    t=first_row.values

    # cross-multiply all arrays in the row to get a
    # small search space. We choose one cell from each
    # digit grouping and drop the rest.
    t.inject(:product).map{ |*e|
      # Technically, we drop all cells, and add back the
      # chosen cells, but it's all the same.
      new_k = k-t.flatten+e.flatten

      # and then search that space, recursively
      Q[new_k]
    }
  end
end

कोड के साथ निष्पादित किया जाता है:

# run with whole board
Q[K]

# if we get here, we didn't hit an exit, so we fail
puts"no answer"

बदलाव का

394 ने @ ब्लोटोरेंज के सुझाव को नीचे जोड़ा, और बहुत अधिक हेरफेर किया

408 संशोधित उत्पादन एक बार फिर। इसके .minबजाय का उपयोग करें.inject(:+) के बाद से मैं सिर्फ वैसे भी एक पंक्ति ले रहा हूँ।

417 छोटी आउटपुट गणना

421 जटिल संख्या गिरा दिया। बस पूर्णांक का उपयोग करें। एक बंडल बचाओ

450 अधिक इनपुट सुधार

456 इनपुट सुधार

462 वृद्धिशील सुधार - esp। find, नहींselect

475 गिरा uऔर पंक्ति / कॉल डुप्‍ले बिल्डर को कुचल दिया

503 एक समय में केवल एक डुप्लिकेट अंक प्रति पंक्ति / स्तंभ को हल करते हैं।

केmap &:pop बजाय 530 का उपयोग करेंvalues

531 लैम्ब्डा को खींचता है जो डुप्स सरणी बनाता है

552 उफ़! एक आवश्यकता याद आती है

536 की औसत से बेहतर जनसंख्या जनसंख्या में वृद्धि हुई है (जो पहले थी d)

541 प्रारंभिक


लैम्ब्डा के अंदर, के breakबजाय इस्तेमाल किया जा सकता है return, एक और बाइट बचा सकता है। मैं वास्तव में यह एक, बहुत सारी चालें और बहुत तेज।
ब्लुटोरांगे

@blutorange धन्यवाद! आवेदन किया है। अभी भी 344 हिट करने के लिए एक रास्ता है, हालांकि।
नहीं कि चार्ल्स

थोड़ा लंबा, हाँ, लेकिन अन्यथा यह अच्छी तरह से किया जाता है। एक और बात मैंने देखी: दूसरी पंक्ति में, जैसा कि चर aका उपयोग केवल एक बार किया जाता है, आप ऐसा कर सकते हैं J=gets(p).split*''। क्या आपने क्ली तर्क देने की कोशिश की है, मेरा उत्तर देखें?
ब्लुटोरेंज

3

HTML + जावास्क्रिप्ट ( ES6 ) 459

मल्टीलाइन इनपुट प्राप्त करने के लिए HTML टेक्सटारिया का उपयोग करना।

परीक्षण के लिए, स्निपेट को फ़ायरफ़ॉक्स में चलाएं। यदि आपको पसंद है, तो textarea को बढ़ाएं, textarea के अंदर इनपुट पेस्ट करें (सावधान रहें: सटीक इनपुट, किसी भी लाइन पर कोई अतिरिक्त स्थान नहीं), और दूर टैब करें। परिणाम जोड़ा गया है।

विधि: एक पुनरावर्ती गहराई पहले सर्प। यह सेकंड के सभी मामलों के लिए गैर-इष्टतम समाधान पाता है (यह गोल्फ है, लेकिन एक मान्य उत्तर को सामान्य परीक्षण मामलों के लिए समाप्त कर देना चाहिए )

<textarea onchange="s=this.value,
  z=s[0],o=-~z,k=[],X='no answer',f='#',
  (R=(s,t,h={},r=[],d=0)=>(
    s.map((v,i)=>v>0&&[i%o,~(i/o)].map(p=>h[p+=v]=[...h[p]||[],i])),
    [h[i][1]&&h[i].map(p=>r[d=p]=p)for(i in h)],
    d?r.some(p=>(
      (s[p+o]!=f&s[p-o]!=f&s[p-1]!=f&s[p+1]!=f)&&
      (
        g=[...s],g[p]=f,e=[...g],n=0,
        (F=p=>e[p]>0&&[1,-1,o,-o].map(d=>F(p+d),e[p]=--n))(p<o?p+o:p-o),
        t+n==0&&!k[g]&&(k[g]=1,R(g,t-1))
      )
    )):X=s.join('')
  ))([...s.slice(2)],z*z-1),this.value+=`

`+X"></textarea>

पहला प्रयास

विधि: एक उपयोगकर्ता स्टैक का उपयोग करते हुए एक गहराई पहले सेसर, गैर-पुनरावर्ती।
फ़ंक्शन को आसानी से एक ब्रेडथ फर्स्ट सर्च में बदल दिया जा सकता है, जिसका पीछा l.popकरते हुए l.shift, ताकि एक स्टैक के बजाय एक कतार का उपयोग किया जा सके , लेकिन यह बहुत धीमा है और मुझे यकीन नहीं है कि यह किसी भी तरह से एक इष्टतम समाधान पा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.