देखो और कहो: Conway पर दोबारा गौर किया


16

अब तक आप सभी कोनवे सीक्वेंस (उर्फ 'लुक-एंड-सी-सीक्वेंस) से परिचित होना चाहिए :

     1
    11
    21
  1211
111221
312211
etc

आप शुरुआती बिंदु के रूप में किसी भी मनमानी संख्या से भी शुरू कर सकते हैं। आज्ञा देना f(s)अगला तत्व है। अब हर दिए के लिए sहम पा सकते हैं f(s)। रिवर्स उतना तुच्छ नहीं है: यह yपूर्ववर्ती को खोजने के लिए हर संभव नहीं है sजैसे कि f(s) = y। जैसे y = 1हम किसी पूर्ववर्ती को नहीं ढूंढ सकते। लेकिन अगर yएक है यहां तक कि आप इसे अंक जो एक पूर्ववर्ती में से हर एक भाग का वर्णन के जोड़े में विभाजित कर सकते हैं लंबाई:

513211 divides in 51,32,11
so: 51 comes from 11111 
    32 comes from 222
    11 comes from 1
put together: 111112221

तो इस तरह से हम हर लंबाई के लिए एक अद्वितीय पूर्ववर्ती को परिभाषित कर सकते हैं y

नोट : 'पूर्ववर्ती' को sइस तरह परिभाषित करना आम तौर पर संतुष्ट नहीं करता है f(s) = y

लक्ष्य

एक फ़ंक्शन / प्रोग्राम स्निपेट लिखें जो इनपुट के रूप में अंकों की एक स्ट्रिंग को स्वीकार करता है

  • यदि इनपुट स्ट्रिंग की लंबाई विषम है, तो कॉनवे अनुक्रम के अगले तत्व की गणना करता है
  • ऊपर परिभाषित करता है, तो इनपुट स्ट्रिंग लंबाई है इनपुट स्ट्रिंग के पूर्ववर्ती की गणना करता है और भी

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

हाल ही के प्रश्न, लुक-एंड-सीक्वेंस पर आधारित हैं:


1
मैं उलझन में हूं। क्या आप बता सकते हैं कि कैसे 513111विभाजित होता है 51, 32और 11?
r3mainer

1
मुझे ऐसा लगता है कि यह कुछ लुक का संयुक्त डुप्लिकेट है और सीक्वेंस चैलेंज और रन-रन डिकोडिंग चैलेंज है (मुझे यकीन है कि हमारे पास वे थे)।
मार्टिन एंडर

3
क्या पूर्ववर्ती 11111111111111होगा? आपकी कल्पना के अनुसार, यह होगा 1111111। इसके लिए एक उचित उत्तर को परिभाषित करने के लिए आपको अपने विनिर्देश को संशोधित करना चाहिए।
TheNumberOne

1
@BestOne 11111111111111का कोई पूर्ववर्ती नहीं है। यह एक अवैध इनपुट है।
केई एसई

2
@ TheBestOne हाँ यह सही है, मैंने पूर्ववर्ती के लिए एक मनमाना नियम परिभाषित किया जो हमेशा 'वास्तविक' पूर्ववर्ती से मेल नहीं खाता।
दोष

जवाबों:


3

CJam, 46 45 44 43 42 बाइट्स

l_,2%{0\{@)@@_2$=!{0\0}*;}*\)\}{2/{(~*}%}?

इसका परीक्षण यहां करें। यह STDIN पर संख्या लेता है और परिणाम को STDOUT में प्रिंट करता है।



@ ओप्टिमाइज़र धन्यवाद, मैं भूल गया कि आप एक चरित्र को विकसित कर सकते हैं।
मार्टिन एंडर

5

माणिक, 125 120 119 101 बाइट्स

f=->n{c=n.chars;(n.size%2>0?c.chunk{|x|x}.map{|a,b|[b.size,a]}:c.each_slice(2).map{|a,b|b*a.hex})*''}

स्ट्रिंग इनपुट कार्य के माध्यम से लिया f:

f['111221']    # => "1211"
f['513211']    # => "111112221"
f['111112221'] # => "513211"

नोटों के साथ विस्तारित:

# define lambda that takes one arg
f = -> (n) {
  # store digits in c
  c = n.chars

  # n is of odd length
  if n.size % 2 > 0
    # group identical numbers
    c.chunk{ |x| x }.map do |a, b|
      # array of [digit count, digit value]
      [b.size, a]
    end
  else
    # slice array into groups of two elements
    c.each_slice(2).map do |a, b|
      # repeat the second digit in a pair
      # the first digit-times.
      b * a.hex
    end
  end * '' # join array
}

4

प्रोलॉग - 170 बाइट्स

[]/[].
T/R:-0*_*T*R.
C*X*[X|T]*R:-(C+1)*X*T*R.
C*X*T*Y:-10*C+X+Y+R,T/R.
N+R+A:-N=:=0,A=R;D is N mod 10,N//10+R+[D|A].
F-C-R:-C/N,(N=F,R=C;F-N-R).
[1]-[1,1]. S-T:-S-[1]-T.

यह स्निप फ़ंक्शन को परिभाषित करता है (-)/2। आप इसे पसंद कर सकते हैं

?- [1,1,1,3,2,1,3,2,1,1]-T.
T = [1, 3, 1, 1, 2, 2, 2, 1] .

?- [1]-T.
T = [1, 1] .

इस क्रम में एक विषम समता के साथ केवल एक ही लंबाई लगती है : प्रारंभिक [1]

wr_len :- wr_len(1, [1]).
wr_len(N, Cur) :-
    length(Cur, Len),
    TrailingZeroes is lsb(Len),
    (TrailingZeroes > 0 -> Par = 'even'; Par = 'odd'),
    writef('%t\t%t\t%t\t%t\n', [N, Len, Par, TrailingZeroes]),
    get_next(Cur, Next),
    succ(N, O),
    !, wr_len(O, Next).
% index, length, parity of length, num of trailing 0 in bin presentation of length
?- wr_len.
1       1       odd     0
2       2       even    1
3       2       even    1
4       4       even    2
5       6       even    1
6       6       even    1
7       8       even    3
8       10      even    1
9       14      even    1
10      20      even    2
11      26      even    1
12      34      even    1
13      46      even    1
14      62      even    1
15      78      even    1
16      102     even    1
17      134     even    1
18      176     even    4
19      226     even    1
20      302     even    1
21      408     even    3
22      528     even    4
23      678     even    1
24      904     even    3
25      1182    even    1
26      1540    even    2
27      2012    even    2
28      2606    even    1
29      3410    even    1
30      4462    even    1
31      5808    even    4
32      7586    even    1
33      9898    even    1
34      12884   even    2
35      16774   even    1
36      21890   even    1
37      28528   even    4
38      37158   even    1
39      48410   even    1
40      63138   even    1
41      82350   even    1
42      107312  even    4
43      139984  even    4
44      182376  even    3
45      237746  even    1
46      310036  even    2
47      403966  even    1
48      526646  even    1
49      686646  even    1
50      894810  even    1
51      1166642 even    1
52      1520986 even    1
53      1982710 even    1
54      2584304 even    4
55      3369156 even    2
56      4391702 even    1
57      5724486 even    1
58      7462860 even    2
59      9727930 even    1
ERROR: Out of global stack
% I added a few "strategic" cuts (`!`) to get so far.

पठनीय:

get_next([], []).
get_next(Current, Next) :-
    get_next_sub(0, _, Current, Next).

get_next_sub(Length, Digit, [Digit|Tail], Result) :-
    get_next_sub(Length+1, Digit, Tail, Result).
get_next_sub(Length, Digit, Further, Result) :-
    number_to_list(10*Length+Digit, Result, ResultTail),
    get_next(Further, ResultTail).

number_to_list(Number, Result, Accumulator) :-
    0 is Number -> Result = Accumulator;
    Digit is Number mod 10,
    number_to_list(Number // 10, Result, [Digit|Accumulator]).

get_previous(Stop, Current, Result) :-
    get_next(Current, Next),
    (   Next = Stop
    ->  Result = Current
    ;   get_previous(Stop, Next, Result)
    ).

get_prev_or_next(Input, Result) :-
    length(Input, Length),
    (   1 is Length mod 2
    ->  get_next(Input, Result)
    ;   get_previous(Input, [1], Result)
    ).

3

अजगर: 139 वर्ण

import re
f=lambda s:''.join(['len(b)'+a for a,b in re.findall(r'((\d)\2*)',s)] if len(s)%2 else map(lambda a,b:b*int(a),s[::2],s[1::2]))

एकल परीक्षण मामला

print f('1111122221111222112')
>>> 514241322112
print f('514241322112')
>>> 1111122221111222112

आप से अंतरिक्ष को हटा सकते हैं s)] ifकरने के लिए s)]if
बकुरीउ

आप बीच में जगह भी निकाल सकते हैं2 else
बीटा डेके

3

हास्केल, 134 128 115

n=length
l x=x#mod(n x)2
(a:b:c)#0=replicate(read[a])b++c#0
(a:b)#1=(\(c,d)->show(1+n c)++a:d#1)$span(==a)b
_#_=[]

यदि इसे स्टड / स्टडआउट से होना चाहिए, तो 150 144 131 कुल वर्णों के main=interact lलिए जोड़ें । फंक्शन को कहा जाता है ।l

*Main> putStr . unlines $ map (\x->x++":\t"++l x) ([replicate n '1'|n<-[5..10]]++map show [0,6..30]++map show [n*n+n|n<-[2..10]])
11111:  51
111111: 111
1111111:    71
11111111:   1111
111111111:  91
1111111111: 11111
0:  10
6:  16
12: 2
18: 8
24: 44
30: 000
6:  16
12: 2
20: 00
30: 000
42: 2222
56: 66666
72: 2222222
90: 000000000
110:    2110

क्या आप कृपया उपयोग उदाहरण प्रदान कर सकते हैं? मुझे मिल गया जबकि l "11"काम करने के लिए, मैं एक अपवाद के साथ मिलता है l "111"याl "1111111111111"
पॉल Guyot

@PaulGuyot, फिक्सिंग की तरह लगता है कि मेरे स्कोर से कुछ चार्ट काट दिया। धन्यवाद :-)
ज़ैक

3

पर्ल - 98 बाइट्स

इन सभी नियंत्रण कथनों का आकार मुझे परेशान करता है, लेकिन मैं इस बात से बहुत खुश हूं कि रीगेक्स ने कैसे काम किया।

($_)=@ARGV;if(length()%2){$\=$&,s/^$&+//,print length$&while/^./}else{print$2x$1while s/^(.)(.)//}

असम्पीडित:

($_)=@ARGV;
if(length()%2)
{
$\=$&, #Assigning the character to $\ causes it to be appended to the print (thanks, tips thread!)
s/^$&+//, #Extract the string of characters
print length$& #Print its length
while/^./ #Get next character into $&
}else{
print$2x$1
while s/^(.)(.)//
}

2

एर्लांग, 205

f(L)->g(L,L,[]).
g([A,B|T],L,C)->g(T,L,lists:duplicate(A-$0,B)++C);g([],_,R)->R;g(_,L,_)->i(L,[]).
h([A|T],A,N,B)->h(T,A,N+1,B);h(L,B,N,C)->i(L,integer_to_list(N)++[B|C]).
i([H|T],A)->h(T,H,1,A);i(_,R)->R.

मुख्य कार्य एफ है, इनपुट को एरलंग स्ट्रिंग के रूप में लेना और आउटपुट को स्ट्रिंग के रूप में भी वापस करना।

f("11"). % returns "1"
f("111"). % returns "31"
f("1111111111111"). % returns "131"

9 से अधिक समान वर्ण मामले की आवश्यकता को छोड़ कर फ़ंक्शन को 15 बाइट्स छोटा (190) बनाया जा सकता है। fकॉल gजो पूर्ववर्ती पुनरावृत्ति की गणना करता है, और यदि वर्णों की संख्या विषम है (गणना समाप्त होने पर पाया जाता है), यह फ़ंक्शन को कॉल करता है i, जिसके साथ जोड़ा जाता है h, अगले तत्व की गणना करता है।


2

हास्केल, 105

import Data.List
l=length
c r|odd$l r=group r>>=(l>>=(.take 1).shows)|x:y:z<-r=[y|_<-['1'..x]]++c z|0<1=r

मुझे लगता है कि यह अच्छा है कि यह किसी भी सहायक कार्यों का उपयोग नहीं कर रहा है :-)।


|x:y:z<-r- मुझे पूरी तरह से पता नहीं था कि आप ऐसा कर सकते हैं। यह अच्छा है!
फ्लोंक

@Flonk इसका "पैटर्न गार्ड" कहा जाता है। यह एक विस्तार हुआ करता था और हास्केल के संस्करणों में से एक में इसे जोड़ा गया था :-)
गौरवशाली हैकेलर

यह बहुत सारी चीजों को इतना आसान बना देता है। आप हर दिन कुछ नया सीखते हैं! :)
फ्लोंक

2

एपीएल (45)

∊{2|⍴⍵:(⊃,⍨⍕∘⍴)¨⍵⊂⍨1,2≠/⍵⋄/⍨∘⍎/¨⌽¨⍵⊂⍨1 0⍴⍨⍴⍵}

हां, यह एक वैध फ़ंक्शन की परिभाषा है, यहां तक कि बाहर की तरफ भी।

      ∊{2|⍴⍵:(⊃,⍨⍕∘⍴)¨⍵⊂⍨1,2≠/⍵⋄/⍨∘⍎/¨⌽¨⍵⊂⍨1 0⍴⍨⍴⍵}'513211'
111112221
      ∊{2|⍴⍵:(⊃,⍨⍕∘⍴)¨⍵⊂⍨1,2≠/⍵⋄/⍨∘⍎/¨⌽¨⍵⊂⍨1 0⍴⍨⍴⍵}'111112221'
513211
      f←∊{2|⍴⍵:(⊃,⍨⍕∘⍴)¨⍵⊂⍨1,2≠/⍵⋄/⍨∘⍎/¨⌽¨⍵⊂⍨1 0⍴⍨⍴⍵}
      f ¨ '513211' '111112221'
┌─────────┬──────┐
│111112221│513211│
└─────────┴──────┘

2

जावा 7, स्कोर = 252 235 बाइट्स

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

के साथ बुलाना f(intputString) । संगत स्ट्रिंग लौटाता है।

golfed:

String f(String a){char[]b=a.toCharArray();a="";int i=0,j=0,d=0,e=b.length;if(e%2==0)for(;i<e;i+=2)for(j=0;j<b[i]-48;j++)a+=b[i+1];else{for(;i<e;i++)d=d==0?(j=b[i]-48)*0+1:b[i]-48!=j?(a+=d+""+j).length()*--i*0:d+1;a+=d;a+=j;}return a;}

गोल्फ कोड संरचना कोड के साथ विस्तारित:

public class LookAndSayExpandedGolfed{

    public static void main(String[] args){
        System.out.println(new LookAndSayExpandedGolfed().f(args[0]));
    }

    String f(String a){
        char[]b=a.toCharArray();
        a="";
        int i=0,j=0,d=0,e=b.length;
        if(e%2==0)
            for(;i<e;i+=2)
                for(j=0;j<b[i]-48;j++)
                    a+=b[i+1];
        else{
            for(;i<e;i++)
                d=d==0?(j=b[i]-48)*0+1:b[i]-48!=j?(a+=d+""+j).length()*--i*0:d+1;
            a+=d;
            a+=j;
        }
        return a;
    }

}

आंशिक रूप से गोल्फ:

public class LookAndSayPartiallyGolfed{

    public static void main(String[] args){
        System.out.println(new LookAndSayPartiallyGolfed().f(args[0]));
    }

    String f(String a){
        char[] number = a.toCharArray();
        String answer = "";
        int i, j, longestStreakLength = 0;
        if (number.length % 2 == 0){
            for (i = 0; i < number.length; i += 2)
                for (j = 0; j < number[i] - 48; j++)
                    answer += number[i+1];
        } else{
            j = 0;
            for (i = 0; i < number.length; i++)
                longestStreakLength = longestStreakLength == 0 ? (j = number[i] - 48) * 0 + 1 : number[i] - 48 != j ? (answer += longestStreakLength + "" + j).length()*--i*0 : longestStreakLength + 1;
            answer += longestStreakLength;
            answer += j;
        }
        return answer;
    }

}

पूरी तरह से विस्तारित:

public class LookAndSay{

    public static void main(String[] args){
        System.out.println(new LookAndSay().function(args[0]));
    }

    String function(String a){
        char[] number = a.toCharArray();
        if (number.length % 2 == 0){
            String answer = "";
            for (int i = 0; i < number.length; i += 2){
                for (int j = 0; j < number[i] - '0'; j++){
                    answer += number[i+1];
                }
            }
            return answer;
        }
        String answer = "";
        int longestStreakLength = 0;
        int longestStreakNum = 0;
        for (int i = 0; i < number.length; i++){
            if (longestStreakLength == 0){
                longestStreakNum = number[i] - '0';
                longestStreakLength = 1;
                continue;
            }
            if (number[i] - '0' != longestStreakNum){
                answer += longestStreakLength;
                answer += longestStreakNum;
                longestStreakLength = 0;
                i--;
            } else {
                longestStreakLength++;
            }
        }
        answer += longestStreakLength;
        answer += longestStreakNum;
        return answer;
    }

}

चलाने के लिए, पहले दूसरी प्रविष्टि संकलित करें: javac LookAndSayExpandedGolfed.java

फिर साथ चलाएं: java LookAndSayExpandedGolfed

संपादित करें: फिक्स्ड त्रुटि।


मेरे लिए काम नहीं करता है,Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4 at java.lang.String.charAt(String.java:658)
ओक्टाविया तोगामी

@KenzieTogami फिक्स्ड।
TheNumberOne

मुझे ऐसा नहीं लगता, --1माना जाता है --i?
ओक्टेविया तोगामी

@KenzieTogamie हां, यह है। यह अब तय हो गया है।
TheNumberOne

कूल, वह काम करता है। हालाँकि, रिवर्सल असफल हो जाता है। 513211-> 11111
ओक्टाविया तोगामी

1

जावास्क्रिप्ट (इन-ब्राउज़र, ES5, IE8 +), 152

var s=prompt(),r='',n=r,c=r,i=0;do{c!=s[i]?(r+=n+c,n=1,c=s[i]):n++;i++}while(c)n='';i=0;while(s[i]){n+=Array(1*s[i]+1).join(c=s[i+1]);i+=2}alert(c?n:r)

यदि आप var को छोड़ते हैं, तो 4 वर्णों को छोटा किया जा सकता है, या अन्य मध्यवर्ती अनवांटेड ग्लोबल्स के साथ कुछ और चार्ट भी बना सकते हैं, लेकिन आइए दिखाते हैं कि हम एक मिनट के लिए खराब प्रोग्रामर नहीं हैं।

त्वरित उपयोग करते हुए तर्क और वापसी मूल्य के साथ ईएस 6 शॉर्ट-सिंटैक्स फ़ंक्शन पर स्विच करना, आईओ के लिए अलर्ट अधिक बचा सकता है।

यहाँ JSFiddle: http://jsfiddle.net/86L1w6Lk/


5
उन लोगों के बारे में चिंता मत करो var... हम यहाँ सभी "खराब प्रोग्रामर" हैं। ;)
मार्टिन एंडर

1

पायथन 3 - 159 बाइट्स

import re;l=input();x=len;print(''.join([str(x(i))+j for i,j in re.findall('((.)\2*)',l)]if x(l)%2 else[j*int(i)for i,j in[l[i:i+2]for i in range(0,x(l),2)]]))

1

कोबरा - 217

(१ (६ यदि मैं अन्यत्र मौजूद हो तो useकथन मान सकता हूँ System.Text.RegularExpressions)

do(s='')=if((l=s.length)%2,System.Text.RegularExpressions.Regex.replace(s,(for x in 10 get'[x]+|').join(''),do(m=Match())="['[m]'.length]"+'[m]'[:1]),(for x in 0:l:2get'[s[x+1]]'.repeat(int.parse('[s[x]]'))).join(''))

1

जावास्क्रिप्ट (ईएस 6) 85

नियमित अभिव्यक्ति का उपयोग फ़ंक्शन के साथ बदलें। अलग-अलग regexp और अलग-अलग फ़ंक्शन इनपुट लंबाई पर निर्भर करता है या विषम भी।

F=s=>s.replace((i=s.length&1)?/(.)(\1*)/g:/../g,x=>i?x.length+x[0]:x[1].repeat(x[0]))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.