অশুভ পূর্ণসংখ্যা এড়ান! [বন্ধ]


53

আপনি আইডি নম্বর উত্পন্ন করতে কিছু কোড বিকাশ করছেন। নীতিমালার জন্য কোনও আইডি নম্বরের ক্ষেত্রে অঙ্ক সিকোয়েন্স 6 include6 অন্তর্ভুক্ত থাকা দরকার ।

একটি ফাংশন (বা আপনার ভাষার সমতুল্য) তৈরি করুন যা ইতিবাচক পূর্ণসংখ্যার পরামিতি নেয় এবং পরবর্তী পূর্ণসংখ্যায় ফিরে আসে যাতে inte 666 অন্তর্ভুক্ত হয় না যখন সেই সংখ্যার দশমিক হিসাবে প্রকাশ করা হয়। (60606 ঠিক আছে, 66600 না is

আপনার কোডটিতে এমন কোনও লুপ ব্যবহার করা উচিত যা নিয়মগুলির সাথে ফিট করে এমন কোনও ফলাফল না পাওয়া পর্যন্ত এটি যুক্ত করে।

f(1) returns 2.
f(665) returns 667.
f(665999999) returns 667000000 without having looped a million times.
(Following examples added since the question was first posed.)
f(666666666) also returns 667000000.
f(66600) returns 66700.
f(456667) returns 456670.

আপডেট:
ইনপুটটিতে 66 666 এর বেশি থাকলে 66 666 প্রতিস্থাপন কাজ করবে না with


1
456667 মত কিছু সম্পর্কে কি? এটি কি 456670 ফেরত পাওয়া উচিত, বা আমরা কেবল একটি শীর্ষস্থানীয় 666 নিয়েই চিন্তিত?
কাইল কানস

11
আমি মনে করি জনপ্রিয়তা-প্রতিযোগিতার চেয়ে কোড-গল্ফ হিসাবে এটি আরও ভাল হবে যেহেতু এ জাতীয় সহজ সমাধান রয়েছে।
নাট এল্ডারেজ

10
@ nyuszika7h তবে ফলাফলটি হওয়া উচিত 66700
মার্টিন এন্ডার

3
সত্যিকারের চ্যালেঞ্জ হিসাবে,
কোডে

2
আপনার রেজেক্স প্রয়োগের উপর নির্ভর করে, আপনি 666 সনাক্ত করতে '6 {3}' ব্যবহার করতে পারেন
সেল্টস্কে

উত্তর:


53

পাইথন, কোনও স্ট্রিং কারসাজি নেই

def f(n):
    n += 1
    p = 1
    m = n
    while m:
        if m % 1000 == 666:
            n += p - n % p
        p *= 10
        m /= 10
    return n

10, শক্তি খোঁজার করে কাজ করে p, যেখানে 666 প্রদর্শিত হবে, এবং যোগ p - n % pকরার জন্য nযা প্রতিস্থাপন 666xxxxxসঙ্গে 66700000


6
আমি এই ভালো লাগে এই ছিল যে আসলে একটি বাস্তব গ্রাহকের প্রয়োজন, এই বাস্তবায়ন, অ-হল hacky যুক্তিসম্মত এবং কার্যকরী।
রোমানস্ট্রি

This numbers6 এর একাধিক উদাহরণ থাকা সংখ্যার সাথে এই কাজ করবে?
সুপারক্যাট

হ্যাঁ. বামতম 66 666 হ'ল একমাত্র এটিই প্রকৃতপক্ষে গুরুত্বপূর্ণ এবং এই অ্যালগরিদম এটি স্থির করে one
পিচবোর্ড_বক্স 16

19
@ ক্রমকিইনস কোডগল্ফের জন্য অন্য লোকদের তাদের কাজ করার জন্য চালিত করার জন্য প্রকৃত সত্য গ্রাহকের প্রয়োজনীয়তা পোস্ট করুন? এটা খারাপ! ( লুকানো )
বিলপ্পি

3
পাইথন 3 ব্যবহার করে এমন প্রত্যেকের জন্য: পাইথন 3 এ কোডটি চালাতে এই কোডটি অজগর 3+ তে কাজ করে না, আপনাকে পরিবর্তন m /= 10করতে হবে m //= 10। আপনি যদি তা না করেন তবে এম একটি ভাসমান হয়ে যাবে এবং শর্তটি m % 1000 == 666ক্রমাগত মিথ্যা হবে এবং অন্যান্য এন "666" অপরিবর্তিত রয়েছে।
সেরাক

50

জাভাস্ক্রিপ্ট (সমস্ত পরীক্ষার ক্ষেত্রে কাজ করার জন্য আপডেট করা হয়েছে)

স্বল্প-পরিচিত সত্যটি হ'ল প্রকৃতপক্ষে চারটি রয়েছে 6, তবে একজন অন্যকে বিশ্বাসঘাতকতা করেছে এবং সংখ্যার বিশ্ব সংখ্যা থেকে তাদের নির্মূল করার জন্য কোড ফর্মের মধ্যে বহুল প্রচার করেছে । এই যে বিশ্বাসঘাতক ছয়:

    x=prompt(''+
  'Enter number');
 alert(      ( (~x[
'ind'+
'exOf']('666')))?(x 
.replace(/666(.*)$/,
function    (mat,g){
return       '667'+g
 ['re'+      'place'
 ](/./g,0)})):((+x+
    1+'').replace(
     666,667)));

এখানে একটি ব্যাখ্যা। প্রথমে কোডটি সুন্দরী করুন এবং অকেজো জিনিস যেমন ''+'string'এবং ((code)):

x = prompt('Enter number');
alert(
    ~x['indexOf']('666')
        ?
    x.replace(/666(.*)$/, function(mat,g) {
        return '667' + g['replace'](/./g,0)
    })
        :
    (+x+1+'').replace(666, 667)
);

অদ্ভুত স্বরলিপিগুলি (যেমন ~indexOfএবং ['replace']) আরও সাধারণ হিসাবে রূপান্তর করুন :

x = prompt('Enter number');
alert(
    x.indexOf('666') > -1
        ?
    x.replace(/666(.*)$/, function(mat, g) {
        return '667' + g.replace(/./g, 0)
    })
        :
    ((parseInt(x) + 1) + '').replace(666, 667)
);

এবং এখন কেবল বুঝতে পারেন যে অ্যালগরিদমটি এরকম হয়:

  • যদি ইনপুটটিতে ইতিমধ্যে 666 থাকে,

    • এটি একটি 667 দিয়ে প্রতিস্থাপন করুন।
    • তার পরে প্রতিটি অঙ্ক 0 এর সাথে প্রতিস্থাপন করুন।
  • অন্য

    • সংখ্যায় একটি যুক্ত করুন।
    • দ্রষ্টব্য: আমাদের এখন নিশ্চিত হয় যে আমরা হয় 666, স্ট্রিংয়ের শেষে একটি 666 বা অন্য কোথাও 666 এর ইতিমধ্যে শেষ পর্যন্ত শূন্য রয়েছে ("ম্যানুয়াল" সংযোজন করার সময় "বহন" ভাবুন)।
    • যদি 666 থাকে তবে এটি একটি 667 দিয়ে প্রতিস্থাপন করুন।

পুরানো সংস্করণ (এর জন্য কাজ করে না 666666666) :

    s='Enter number';x
  =prompt(           ''+
 s);x=+x+
(-~![]);
x=(''+x).replace('666',
666+([][         +[]]+[])
[+[]]['l         ength'[
 'repla'+       'ce'](
  / /g,'')]);alert(x)

এটি বুঝতে, আসুন প্রথমে এটি শোভিত করুন:

s = 'Enter number';
x = prompt('' + s);
x = +x + (-~![]);
x = ('' + x).replace('666',666+([][+[]]+[])[+[]]['l         ength'['repla'+'ce'](/ /g,'')]);
alert(x);

এখন মত অকাজের জিনিস অপসারণ দিন '' + stringএবং 'str' + 'ing', অপ্রয়োজনীয় অপসারণ sপরিবর্তনশীল, এবং ভালো weirdness পরিবর্তন -~![]মধ্যে 1:

x = prompt('Enter number');
x = +x + 1;
x = ('' + x).replace('666', 666+"undefined"[0]['l         ength'['replace'](/ /g,'')]);
alert(x);

'l ength'['replace'](/ /g,'')সহজভাবে "length":

x = prompt('Enter number');
x = +x + 1;
x = ('' + x).replace('666', 666+"undefined"[0].length);
alert(x);

এবং "undefined"[0]হয় "u"এবং "u".lengthহয় 1:

x = prompt('Enter number');
x = +x + 1;
x = ('' + x).replace('666', 666 + 1);
alert(x);

এখন আমরা শেষ! এটি এখন বুঝতে খুব সহজ হওয়া উচিত।


13
আমি আপনার উত্তরটি পছন্দ করি তবে এটি ব্যর্থ হয়666666666
মাইকেল এম

3
@ মিশেল যুক্ত হয়েছে নতুন সংস্করণ! এর জন্য কাজ করে 666666666, এবং এর ফন্টটি 6ফ্যানসিয়ার;)
ডুরকনব

1
হু - এর ~1জন্য ব্যবহার করা দুর্দান্ত != -1is
wchargin

@WChargin খুব খারাপ এটি লাইভস্ক্রিপ্টে কাজ করে না। আমি জানি এটি কোড গল্ফ নয় তবে মজা করার জন্য আমার পোস্টে একটি গল্ফ সংস্করণ রয়েছে।
nyuszika7h

এটি লাইভস্ক্রিপ্ট :) এ কাজ করে। ~a.indexOf('b')সঠিক জেএস উত্পন্ন করে, লাইফস্ক্রিপ্ট.টনে চেষ্টা করুন!
ভেন

20

Applescript

এই সাইটে পর্যাপ্ত অ্যাপ্লিক্রিপ্ট উত্তর নেই। কিছু অসুরকে নির্বাসন দিন!

property demon : "666"
property trinity : 1

on exorcise above possessed
    set possessed to possessed as text
    set relic to AppleScript's text item delimiters
    set AppleScript's text item delimiters to demon
    set deliverance to possessed's first text item
    if possessed is deliverance then
        set deliverance to possessed + trinity
    else
        set AppleScript's text item delimiters to trinity
        set compellingPower to ¬
            (count of possessed's characters) - ¬
            (count of deliverance's characters) - ¬
            (count of demon's characters)
        set deliverance to ¬
            deliverance & ¬
            demon + trinity & ¬
            last text item of (((10 ^ compellingPower) as integer) as text)
    end if
    set AppleScript's text item delimiters to relic
    return deliverance
end exorcise

log (exorcise above 666)
log (exorcise above 66666666)
log (exorcise above 1266612)
log (exorcise above 1212)

লগ আউটপুট:

(* 667 *)
(* 66700000 *)
(* 1266700 *)
(* 1213 *)

আমি দ্য এক্সোরিস্টের কাছ থেকে আরও শক্তিশালী কিছু উদ্ধৃতি পেতে চাইতাম , তবে এটি নিশ্চিতভাবে এনএসএফডাব্লু পোস্ট করত। পরিবর্তে আপনি আইএমডিবি পৃষ্ঠাটি পড়তে পারেন।


ওএস এক্স না করে আপনি কীভাবে এটি চালাবেন?
nyuszika7h

আমি মনে করি Applescript প্রায় কাছাকাছি ওএসএক্স উপর নির্ভরশীল stackoverflow.com/questions/7642299/... - আমি অন্য প্ল্যাটফর্মে কোনো পোর্ট সচেতন নই। অপারেটিং সিস্টেম 9 করেনি যদিও কোন গ্যারান্টী যে এই স্ক্রিপ্টের সেখানে চালানো হবে, Applescript একটি সংস্করণ আছে।
ডিজিটাল ট্রমা

2
এটি পোস্টটি নিরাপদ কাজের জন্য নয়? দাম্মিট, আমার কাজটি বিপজ্জনক নয়
ক্রাঙ্কার

1
@ ক্রঞ্চার ওফস ;-)
ডিজিটাল ট্রমা

1
পরিবর্তনশীল নামের পছন্দ করার জন্য +1 (এবং কারণ অ্যাপল স্ক্রিপ্টটি দুর্দান্ত)।
ফ্লোরিস

15

পার্ল

আপনি বলেছিলেন যে আমাদের অবশ্যই একটি লুপে বৃদ্ধি করতে হবে না। আমি কোনও গাণিতিক অপারেটর ব্যবহার করছি না! এখানে একটি খাঁটি রেইজেক্স-প্রতিস্থাপন পদ্ধতির পদ্ধতি রয়েছে (এটি আপনার ধার্মিকতার জন্য নিরাপদ কোনও গ্যারান্টি নেই)।

#!/usr/bin/perl

$_ = <>;

s/$/ ~0123456789/;
s/(?=\d)(?:([0-8])(?=.*\1(\d)\d*$)|(?=.*(1)))(?:(9+)(?=.*(~))|)(?!\d)/$2$3$4$5/g;
s/9(?=9*~)(?=.*(0))|~| ~0123456789$/$1/g;
s/(?!^)\G\d|(666)\d/${1}0/g;
s/666/667/g;

print($_)

প্রথম তিনটি বিকল্প একের সাথে সংখ্যা বৃদ্ধি করে। আমি একবার নিজেই এই সমস্যাটি সমাধান করেছিলাম, তবে এর মধ্যে এমন একটি বিকল্প অন্তর্ভুক্ত ছিল যা কোনও বিকল্প প্রতিস্থাপন না করা অবধি লুপ করতে হয়েছিল, সুতরাং আমি তার পরিবর্তে অ্যান্ড্রু চিউং এর পদ্ধতির ব্যবহার করেছি।

চতুর্থ প্রতিস্থাপনের পরে সমস্ত অঙ্কগুলি 666শূন্যে পরিণত হয়। চূড়ান্ত প্রতিকল্পন অবশিষ্ট সক্রিয় 666একটি মধ্যে 667

বোনাস হিসাবে এটি ইনপুটটিতে একাধিক পূর্ণসংখ্যার সাথে কাজ করবে যতক্ষণ না তারা অ-অঙ্কের অক্ষর দ্বারা আলাদা হয়।


8

LiveScript

এটি নিয়ম নমন করছে। আপনি দেখুন, আপনি বলেন আমি একটি লুপ যে ব্যবহার করা উচিত নয় এক যোগ না হওয়া পর্যন্ত একটি সঠিক ফলাফলের খুঁজে বের করে। সুতরাং আমি পরিবর্তে বিয়োগ একটি বিয়োগ !

nextId = (id) ->
  while (id + 1).toString!indexOf('666') != -1
    id -= -1
  id + 1

মজার জন্য 53 48 45 বাইটে একটি গল্ফযুক্ত সংস্করণ :

n=(i)->(while~(i+1+'')indexOf(\666)=>i-=-1);i+1

এটি আরও গল্ফ সাহায্য করার জন্য ব্যবহারকারীর 1737909 ধন্যবাদ ।

টেস্ট

এনডিএম মডিউল বা একটি সামঞ্জস্যপূর্ণ দৃsert় গ্রন্থাগার সহ নোড.জেএস প্রয়োজন LiveScript

assert = require \assert

assert.equal nextId(1), 2
assert.equal nextId(665), 667
assert.equal nextId(665999999), 667000000
assert.equal nextId(66600), 66700
assert.equal nextId(456667), 456670

5
আপনি যখন 665999 এ যাবেন তখন এটি মারাত্মকভাবে ব্যর্থ হতে চলেছে, কারণ আপনার স্ট্যাকটি বিস্ফোরিত হবে।
টিমওয়ালা

9
খুব চালাক. আপনার মত লফোলগুলি স্পট করতে আরএফসি লিখতে হবে।
বিলপিজি

1
@ টিমওয়ালা এটি আকর্ষণীয়। আপনি এটি কিভাবে পেলেন?
nyuszika7h

1
@ নিউজিকা 77h: আপনি যদি এটির বিষয়ে চিন্তা করেন, 666000 থেকে 666999 এর মধ্যে সমস্ত ব্যর্থ হয়ে যাবে ... আপনি কমপক্ষে 1000 বার পুনরাবৃত্তি করবেন।
অ্যান্ড্রু কুনস

1
আমার ধারণা, আমার কোনও বিশেষ কারণ নেই।
nyuszika7h

6

চুনি

এটি (আমার মনে হয়) প্রথম উত্তর যা 666666666 এর জন্য কাজ করে।

x = gets.chomp.to_i + 1
p (x..x.to_s.gsub('666', '667').to_i).select{|i| !(i.to_s.index '666') }.min

আমি এখন তাড়াহুড়া করছি; ব্যাখ্যাটি পরে যুক্ত করা হবে।

আপডেট : আরও কার্যকর সংস্করণ (আমার বিশ্বাস প্রায় ধ্রুব রানটাইম):

x = gets.chomp
if x.index '666'
    # replace ex. 6661234 with 6670000
    puts x.sub(/666(.*)/){ "667#{"0" * $1.length}" }
else
    # old algorithm (guaranteed to result in
    # 0 or 1 666s now)
    puts (x.to_i+1).to_s.sub(/666/, "667")
end

প্রকৃতপক্ষে, আমার উত্তর 666666666 এর জন্য ঠিক কাজ করে
ইসাকাক

ধ্রুব রানটাইম অসম্ভব। এমনকি "666" উপস্থিত রয়েছে কিনা তা যাচাই করাও লিনিয়ার সমস্যা। এটি তার চেয়ে কঠোরভাবে কঠিন সমস্যা।
ক্রাঙ্কার

4

শক্তির উৎস

($args[0]+1 -replace '(?<=666.*).','0') -replace '666', '667'

4

জে

অবশেষে, জন্য একটি ভাল ব্যবহার E.!

(({.~ , '667' {.!.'0'~ #@[ - ]) '666'&E. i. 1:) @ ": @ >:

সংক্ষেপে, আমরা প্রথম অবস্থানটি আবিষ্কার করি যেখানে আর্গুমেন্টের পূর্ণতা রয়েছে 666এবং আমরা সেই স্ট্রিং এবং সমস্ত কিছু 66700000...শেষের সাথে প্রতিস্থাপন করি ।

বিস্তারিত ব্যাখ্যা করা হয়েছে:

  • ":@>: - এক এক দ্বারা বৃদ্ধি এবং স্ট্রিং রূপান্তর।
  • '666'&E. - বুলিয়ার্সের একটি ভেক্টর তৈরি করুন, প্রতিটি জায়গাতেই সত্য যে '6 in।' স্ট্রিংয়ে শুরু হয়।
  • i.1: - ভেক্টরের মধ্যে প্রথম সত্যের সূচকটি সন্ধান করুন, অন্যথায় ভেক্টরের দৈর্ঘ্য ফিরিয়ে দিন।
  • #@[-]- স্ট্রিংয়ের দৈর্ঘ্য (যা ভেক্টরের দৈর্ঘ্যও) বিয়োগফলের ফলাফল i.
  • '667'{.!.'0'~ - ফলাফলের দৈর্ঘ্য সহ '667' এর একটি স্ট্রিং নিন, প্রয়োজনে ডানদিকে '0' দিয়ে প্যাডিং করুন।
  • {.~- আসল ফলাফলের দৈর্ঘ্য সহ একটি সাবস্ট্রিং নিন i.
  • , - দুজনকে একসাথে যুক্ত করুন।

ব্যাবহৃত হচ্ছে:

   f =: (({.~,'667'{.!.'0'~#@[-])'666'&E.i.1:)@":@>:
   f 1              NB. this leaves okay numbers untouched
2
   f 665999999      NB. properly handles multiple increments
667000000
   f 16266366646666 NB. only takes effect at sets of 3 sixes
16266366700000

এবং যেহেতু এটি কোনও কোড গল্ফ নয়, তাই পাগল অপটিমাইজেশনে নরকে যাওয়ার দরকার নেই। সবাই জিতল!


3

সি শার্প

148 137 চর

@ রিসার্সিভকে ধন্যবাদ জানিয়ে কয়েকটি অক্ষর ছাঁটাই করতে সক্ষম হয়েছিল

public static int f(int b){b++;var z=new Regex("666\\d*");var q=z.Replace(b+"","667",1);return int.Parse(q.PadRight((b+"").Length,'0'));}

Ungolfed:

public static int f(int b)
{
    b++;
    var z = new Regex("666[\\d]*");
    var q = z.Replace(b+"", "667", 1);
    return Int32.Parse(q.PadRight((b+"").Length, '0')); 
}

ফিডল: http://dotnetfiddle.net/XB83bf


1
আপনার রেজেক্সের স্কোয়ার ব্র্যাকেটগুলি অপ্রয়োজনীয় এবং সিনট্যাক্টিকালি অপ্রয়োজনীয় স্পেসগুলিও রয়েছে।
পুনরাবৃত্তির

ওহ, এবং এর Int32সাথে প্রতিস্থাপন করা যেতে পারে int
পুনরাবৃত্তির

@ রিসার্সিভ আপনি সঠিক, ধন্যবাদ!
চেষ্টা করা হচ্ছে

নোট করুন এটি একটি জনপ্রিয়তা-প্রতিযোগিতা এবং কোড-গল্ফ নয় । এমনটি বলার পরেও যে আপনি যদি চরিত্রগুলি শেভ করে মনে করেন আপনার উত্তরটি আরও জনপ্রিয় করে তুলবে, তবে এটির জন্য যান!
ডিজিটাল ট্রমা

2
প্রথমে আমি ডটনেটফিডালটনেট দেখেছি =) আশ্চর্য!
কোপস

2

পাইথন

def next_id(id_num):
  id_num_p1=str(id_num+1)
  pieces=id_num_p1.split('666')
  if len(pieces)==1:
    return id_num+1
  next_id_str=pieces[0]+'667'+'0'*(len(id_num_p1)-len(pieces[0])-3)
  return int(next_id_str)

2

পার্ল

$_++;$_.=$/;s:666(.*):667 .'0'x($+[1]-$-[1]):e

ইনলাইন কোড যা সামগ্রীকে অভ্যন্তরে পরিবর্তন করে $_, পার্লের মধ্যে একটি দুর্দান্ত আদর্শ। -pপতাকাটির সাথে এই জাতীয়ভাবে ব্যবহার করা যেতে পারে :

$ perl -p % <<< 66666
66700

2

জে

কোনও স্ট্রিং, লুপ বা শর্ত নেই:

   next =: 3 :'<.(y+1)(+-|~)10^<:666 i:~666,1000|<.(y+1)%10^i.<.10^.>:y'

   next 1
2
   next 665
667
   next 665999999
667000000
   next 666666666
667000000
   next 66600
66700

তেমনি কার্ডবোর্ড_বক্সের সমাধানের ক্ষেত্রে এটি দশটির দশকে ভাগ করে তিনটি সংখ্যার গোষ্ঠীতে পৃথক করে। সংখ্যাটি যথাযথভাবে বাড়ানোর জন্য এটি 666 এর প্রথম ঘটনার সূচকটি ব্যবহার করে।


2

হাস্কেল (characters০ টি অক্ষর)

এখানে হাস্কেলের একটি সাধারণ বাস্তবায়ন।

import Data.List
import Data.Char

nextid :: Integer -> Integer
nextid = foldl' ((+).(*10)) 0 . purge . map digitToInt . show . (+1)
  where purge (6:6:6:xs) = 6 : 6 : 7 : map (const 0) xs
        purge (x:xs)     = fromIntegral x : purge xs
        purge []         = []
  • প্রথমত, এটি map digitToInt . showসম্ভাব্য দুষ্ট আইডিটিকে অঙ্কের তালিকায় রূপান্তর করতে ব্যবহার করে।
  • এর পরে, purgeঅশুভ প্যাটার্নটির সাথে মেলে এবং এর ভাল সমতুল্যর সাথে প্রতিস্থাপন করে।
  • অবশেষে, foldl' ((+).(*10)) 0সংখ্যাগুলির তালিকাটিকে একটিতে হ্রাস করে Integer

দেখি এটি কাজ করে কিনা!

ghci> nextid 1
2
ghci> nextid 665
667
ghci> nextid 665999999
667000000
ghci> nextid 666666666
667000000
ghci> nextid 66600
66700
ghci> nextid 456667
456670
ghci> nextid 6660239486660239466
6670000000000000000

ভাল লাগছে। এবং কেবল মজাদার জন্য একটি গল্ফ সংস্করণ।

f=read.w.show.(+1);w('6':'6':'6':t)="667"++(t>>"0");w(h:t)=h:w t;w t=t

1

জাভা

এটা কি যথেষ্ট নয়?

private static int nextId(int currentId) {
    String currentIdStr = String.valueOf(currentId);
    return currentIdStr.contains("666") ? Integer.parseInt(currentIdStr.replace("666", "667")) : ++currentId;
}

বন্ধ, তবে তা হওয়া উচিত String.valueOf(currentId + 1)
nyuszika7h

ওহ ঠিক আছে, আমি +1 জিনিস ভুলে গেছি! : ডি
ভ্যালেন্টিন গ্রোগোয়ার

শর্তসাপেক্ষ অকেজো; আমার পরামর্শ অনুসারে সামান্য সংশোধিত মূল সমাধানটিও কার্যকর হবে:return Integer.parseInt(String.valueOf(currentId + 1).replace("666", "667"));
nyuszika7h

1
সত্য নয় ... 6 666০০ 667070০১ হিসাবে ফিরিয়ে দেওয়া হবে যা ১ খুব বেশি।
ভ্যালেন্টিন গ্রোগোয়ার

1

আর

667 টি কাজের সাথে 666 প্রতিস্থাপন করা হচ্ছে।

f <- function(x) {
  x <- as.integer(x + 1)
  if (grepl(666, x)) {
    k <- regexpr(666, x)
    cat(substring(x, 1, k + 1), 7, rep(0, nchar(x) - k - 2), sep = "")
  }
  else cat(x)
}

ফলাফল

> f(1)
2
> f(665)
667
> f(665999999)
667000000
> f(666666666)
667000000
> f(66600)
66700
> f(126660)
126670
> f(126661)
126670
> f(666666666)
667000000

1

3 বিভিন্ন জাভাস্ক্রিপ্ট উত্তর:

1. জাভাস্ক্রিপ্ট (ECMAScript 6)

f=x=>(a=b=c=0,[c?'0':a+(a=b)+(b=i)==666?(c='7'):i for(i of ""+(x+1))].join('')*1)

একটি স্ট্রিং তারপর iterates প্রতিটি অক্ষর উপর নম্বর রূপান্তর করে না হওয়া পর্যন্ত খুঁজে বের করে 666তারপর এটি যে গত পরিবর্তন 6একটি থেকে 7এবং আউটপুট 0সমস্ত নিম্নলিখিত অক্ষরের জন্য।

2. জাভাস্ক্রিপ্ট (ECMAScript 6 খসড়া)

স্ট্রিং ম্যানিপুলেশন ছাড়াই রিকার্সিভ ফাংশন:

g=(x,y=x+1,p=1)=>y?g(y%1e3==666?y*p+p:y>x?y:x,y/10|0,p*10):x

বা আরও মৌখিকভাবে:

function g(x,y=x+1,p=1)
{
  if ( y == 0 )
    return x;
  else if ( y % 1000 == 666 )
    return g( y*p+p, Math.floor(y/10), p*10 );
  else
    return g( Math.max(y, x), Math.floor(y/10), p*10 );
}

পরীক্ষা:

g(5) // 6
g(65) // 66
g(665) // 667
g(66599) // 66700
g(66666) // 66700
g(6656665665) // 6656670000

3. জাভাস্ক্রিপ্ট

নিয়মিত অভিব্যক্তি ব্যবহার:

function h(x)(""+(x+1)).replace( /^(.*?)(666)(.*)$/, function(a,b,c,d)(b+667+d.replace(/./g,0)) )*1

অথবা (একই তবে ECMAScript 6 ব্যবহার করে)

h=x=>(""+(x+1)).replace(/^(.*?)(666)(.*)$/,(a,b,c,d)=>b+667+d.replace(/./g,0))*1

আপনার প্রথম সংস্করণ সহ, আপনি 6 টি সেপ্টিলিয়ন প্রবেশ করলে, 666 যৌনপল্লীতে আপনি 6.667প্রযুক্তিগতভাবে এটির একটি রিটার্ন মান পাবেন it's যদিও এটি সাহায্য করা যেতে পারে মনে করবেন না।
স্পিডওয়ার্ডস

1e20জাভাস্ক্রিপ্ট (কমপক্ষে ফায়ারফক্সে) বৈজ্ঞানিক স্বরলিপি অবলম্বন না করে একটি পূর্ণসংখ্যা হিসাবে মুদ্রণ করবে সেই পরিমাণের বৃহত্তম ক্রম সম্পর্কে।
এমটি0

1

awk

awk '{i=index(++$0,"666")}
      i{a=substr($0,1,i-1)
       b=substr($0,i+3)
       gsub(/./,0,b)
       $0=a"667"b}
      1
' <<_INPUT_
1
665
665999999
666666666
66600
_INPUT_

দেয়

2
667
667000000
667000000
66700

সম্পাদনা: ২ য় সমাধান

awk -F666 -vOFS=667 '{++$0;$1=$1}
    NF-1{for(gsub(/./,0,$2);NF>2;--NF){$2=$2 0 0 0
               for(i=length($NF);i;--i)$2=$2 0}}1
' <<_INPUT_
1
665
665999999
666666666
66600
1236661
_INPUT_

উৎপাদনের

2
667
667000000
667000000
66700
1236670

1
যা সঠিক উত্তর বলে মনে হচ্ছে না। 665 667 দিতে হবে, 66600 66700 ইত্যাদি দেওয়া উচিত
#HongKongInd dependence

1
আপনার ফলাফলগুলিতে প্রচুর "666" সাবস্ট্রিং রয়েছে।
গ্লেন রেন্ডার্স-পেহারসন

এটা বিব্রতকর। আমি যে দুটি (!) বেড়া-পোস্ট-ত্রুটি করেছি তা ঠিক করেছি কারণ আমি ভুলে গিয়েছি যে awkসূচকগুলি 1-ভিত্তিক স্ট্রিংগুলি ভুলে গেছে ।
মিসচিলি

@ ক্র্যাঙ্কার যেমন প্রশ্নে স্পষ্টভাবে বলেছেন, f(665) returns 667যেহেতু এটি "পরবর্তী পূর্ণসংখ্যার মধ্যে
66 66

আমি একটি দ্বিতীয় উপায় যুক্ত করেছি যা ক) আরও awkইশ এবং খ) স্ট্রিং ফাংশনগুলির ব্যবহারকে হ্রাস করে।
মিসচিলি

0

পাইথন:

def f(b):
    b = `b+1`
    while '666' in b: b = b.replace('666','667',1)
    return int(b)

বা:

 f=lambda b:int(`b+1`.replace('666','667'))

আমি জানি না যে কিভাবে কাজ করে। যে পরিবর্তে পরিণত 666666হবে 667667না 667000?
মার্টিন এন্ডার

@ এম.বুয়েটনার ভাল পয়েন্ট, আমি মনে করি আমার ইতিমধ্যে একটি সমাধান আছে।
5uʎs

0

জাভা

public static int f(int i) {
    i++;
    i += findAdjustment(i);
    return i;
}

private static int findAdjustment(int i) {
    if (i < 666) {
        return 0;
    }
    int adjustment = findAdjustment(i / 10);
    if (adjustment != 0) {
        // Leftmost 666 found, fix adjustment by current last digit
        return adjustment * 10 - i % 10;
    } else if (i % 1000 == 666) {
        return 1; // This is leftmost 666, need to be corrected by 1
    } else {
        return 0; // no adjustment needed
    }
}

বামতম 66 666 এবং পুনরায় কল স্ট্যাক পপিং করার সময় নম্বরটি কতটা সামঞ্জস্য করতে হবে তা গণনা করতে পুনরাবৃত্ত ফাংশন ব্যবহার করে।


আমি মনে করি না এই কোডটি সঠিক। এটি 666666666 ইনপুটটির জন্য কী ফলাফল দেয়?
অ্যালগরিদমশর্ক

আপনি ঠিক বলেছেন, বুঝতে পারেন নি যে ইনপুটটিতে ইতিমধ্যে দুষ্ট সংখ্যা থাকতে পারে। তাহলে চ (666666666) -> 667667667?
রজার লিন্ডসে

f(666666666) -> 667000000
djhurio

@jjurio দেখে মনে হচ্ছে আমি আজ প্রান্তের ক্ষেত্রে পরীক্ষা করতে পারি না। বিশ্বাস করুন আমি এটি এখনই ঠিক করে ফেলেছি, তবে কোডটি আর এত ছোট নয়।
রজার লিন্ডসে

1
@ RogerLindsjö এটি একটি popularity-contest, একটি নয় code-golf
nyuszika7h

0

দল

সাধারণ পুনরাবৃত্ত স্ট্রিং ম্যানিপুলেশন।

@echo off

setLocal enableDelayedExpansion
set /a inp=%1+1
for /f usebackq %%a in (`powershell "&{'%inp%'.length-1}"`) do (
    set a len=%%a-2
    set chars=%%a
)

for /l %%b in (0, 1, %len%) do (
    if "!inp:~%%b,3!"=="666" (
        set inp=!inp:~0,%%b!667
        set /a a=%%b+3
        for /l %%c in (!a!, 1, %chars%) do set inp=!inp!0
        goto :break
    )
)

:break

echo %inp%

এটি সংখ্যার প্রথম তিনটি অক্ষর (স্ট্রিং হিসাবে) থেকে শুরু হয় এবং এটি 666 না পাওয়া অবধি তার পথে কাজ করে, এরপরে এটি 666 কে 667 দিয়ে প্রতিস্থাপন করে এবং স্ট্রিংয়ের দৈর্ঘ্যে জিরো যুক্ত করে লুপ করে।

পরীক্ষার ক্ষেত্রে সমস্ত সঠিক ফলাফল দেয় results


0

পার্ল, 45 বাইট

/ ই পতাকা সহ একটি একক রেজেক্স সমস্ত কাজ এখানে করে:

$_=<>+1;s/666(.*)$/"667".0 x length$1/e;print

0

এসকিউএল

সুনির্দিষ্ট হতে হবে, এসকিউএল সার্ভার 2012 লেনদেন-এসকিউএল।

create function dbo.GoodIntegers( @i bigint )
returns bigint
as begin
    declare @s varchar(20) = cast( @i+1 as varchar(20) ) ;
    declare @badindex int = charindex( '666', @s ) ;
    declare @rv bigint  = cast ( 
        iif( @badindex = 0 ,
            @s ,
            concat( left( @s, @badindex - 1 ), '667', replicate( '0', len( @s ) - @badindex - 2 ) )
        ) as bigint 
    ) ;
    return @rv ;
end ; -- function dbo.GoodIntegers

0

পাইথন

import re
def exorcise(number):
    number = str(number+1)
    i = re.compile("^(\d*?)(666)(\d*)$")
    if re.match(i,number):
        n = re.match(i,number).groups()
        return int(n[0]+"667"+"".join(["0"*len(n[2])]))
    return int(number)

0

জুলিয়া

function f(x::Int)
    y = string(x+1)
    n = length(y)
    z = string(^("0",n))
    ~ismatch(r"6{3}", y) ?
    int(y) :
    while ismatch(r"6{3}",y)
        m = match(r"6{3}", y)
        y = string(y[1:m.offset+1], '7', z[m.offset+3:n])
    end
    int(y)
end

REPL ফলাফল

julia> f(1)
2

julia> f(665)
667

julia> f(665999999)
667000000

julia> f(666666666)
667000000

julia> f(66600)
66700

julia> f(456667) 
456670

0

সি শার্প

আমি কি এটা ঠিক করছি?

static int F(int n)
{
    n++;

    int a = 666;
    int b = 1;

    while (n >= b)
    {
        if (((n - a) / b) % 1000 == 0)
        {
            n += b;
        }

        a *= 10;
        b *= 10;
    }

    return n;
}

0

VBA

Function f(num As Long) As Long
Dim SixPos As Long
Dim s As String
s = CStr(num)
SixPos = InStr(s, "666")
If SixPos = 0 Then
    s = CStr(num + 1)
    SixPos = InStr(s, "666")
End If
If SixPos Then
    Mid(s, SixPos + 2, 1) = "7"
    If Len(s) > SixPos + 2 Then
        Mid(s, SixPos + 3, Len(s) - SixPos + 3) = String$(Len(s) - SixPos + 3, "0")
    End If
End If

f = CLng(s)

End Function

কর্মে:

Sub demo()
Debug.Print f(1) 'returns 2.
Debug.Print f(665) 'returns 667.
Debug.Print f(665999999) 'returns 667000000 without having looped a million times.
'(Following examples added since the question was first posed.)
Debug.Print f(666666666) 'also returns 667000000.
Debug.Print f(66600) 'returns 66700.
Debug.Print f(456667) 'returns 456670.
End Sub

ফলাফল:

2 
667 
667000000 
667000000 
66700 
456670 

0

সি ++

আমি জানি এটি কোড-গল্ফ নয়, তবে (ক) কিছু লোক পরামর্শ দিয়েছে যে এটি একটি ভাল গল্ফ চ্যালেঞ্জ, এবং (খ) এটি আমার প্রথম চ্যালেঞ্জ / গল্ফ উত্তর, আমি ভেবেছিলাম এটি মজাদার হবে, এবং যদি আমি তা করি এটি এখানে আমি একটি ভয়াবহ গল্ফার হওয়ার জন্য একটি বাস্তব গল্ফ চ্যালেঞ্জের মধ্যে প্রদর্শিত হবে না। এক্স)

মূলত, '667 'এর পরিবর্তে' 667 'কাজ করে যদি আপনি প্রথম সংখ্যায় এটি করেন এবং তারপরে 0 টি লিখুন out

গল্ফড ( 175 155 অক্ষর):

#include<sstream>
int f(int x){std::stringstream s,o;s<<++x;x=0;for(char c=s.get();!s.eof();c=s.get())o<<((x+=c=='6')++==3?'7':--x>3?'0':c);o>>x;return x;}

Ungolfed:

#include<sstream>
int f(int x){
    std::stringstream s,o;
    s<<++x;    // Increment to next int.
    x=0;       // Reusing this to count 6s
    for(char c=s.get();!s.eof();c=s.get()){    // For each digit
        if (c=='6'){
           ++x;    // Count sixes...
        }
        if(x==3) {  // Devil's number!
            c='7'; // Output 7 here.
            ++x;   // Increment once more.
        } else if (x > 3) {
            c='0';    // Already replaced 666 with 667, so write out 0s
        }
        o<<c;   // Append digit
    }
    o>>x; // Get int
    return x;
}

আমার মনে হয় আপনার দরকার নেই x+=c=='6'?1:0, আপনি এড়িয়ে যেতে পারেন x+=c=='6'। যদিও চেষ্টা করে দেখেনি।
nyuszika7h

এছাড়াও, আপনি std::আগে রেখে গেছেন stringstream। এটি ছাড়া সংকলন হয় না।
nyuszika7h

স্ট্যান্ড :: যোগ করা হয়েছে, তার জন্য @ nyuszika7h ধন্যবাদ thanks আমি আইডিই ব্যবহার করতে ভুল করেছিলাম যা 'নেমস্পেস স্ট্যান্ড ব্যবহার করে' স্বয়ংক্রিয়ভাবে তৈরি হয়েছিল; এটি পরীক্ষা করার জন্য। -_- আমি x+=c=='6'হ্রাসের চেষ্টা করবো , পাশাপাশি প্রবাহের চরগুলির চেয়ে int ডিজিটের সাহায্যে এটি করার চেষ্টা করব ...
মাইকে 32


0

পার্ল, 36 কেবলমাত্র একটি সাব, কোনও বাইট নেই

পাটিগণিত এবং রেজেক্স অপ্সের মিশ্রণটি ব্যবহার করে আমার শেষ সমাধানের চেয়ে একটি ছোট সংস্করণ।

sub{($_[0]+1)=~s/666(.*)/667$1/r-$1}

মুদ্রণ + (<> + 1) = ~ এস / 6 666 (। *) / 676767 $ 1 / আর- $ 1 (আপনাকে একটি বাইট বাঁচিয়েছে) (আপনি আরও দুটি বললে ব্যবহার করুন) - যদিও অনুরোধটি কোনও ফাংশনের জন্য ছিল তাই মুদ্রণ + মুছে ফেলুন এবং ব্যবহার করুন উপ {...
আল্ট্রেয়াস

0

সি

#include <stdlib.h>
#include <stdio.h>

int next(int a)
{
    for(int b=a+1,c=0,d=0; b>665 ;b/=10, c++)
        if(b%1000==666) {d=c; a=b;}

    a++;
    while(d --> 0) a*=10;

    return a;
}

void main(int a, char *v[])
{
    int c = a>1?atoi(v[1]):0;

    printf("%d\n",next(c));
}

ঠিক আছে - কোনও সীমানা যাচাই করা হয়নি এবং অনেক বেশি সাদা জায়গা কিন্তু এটি গল্ফ নয়। "যখন (d -> 0)" এ বিন্যাসের একটি মজাদার বিট।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.