ডিএনএতে গল্ফ পাঠ্য


26

ডিএনএ গল্ফ পাঠ্য

চ্যালেঞ্জ

ইনপুটটিকে একটি ডিএনএ আউটপুটে রূপান্তর করুন।

অ্যালগরিদম

  • পাঠ্যকে ASCII কোড পয়েন্টে রূপান্তর করুন (যেমন codegolf-> [99, 111, 100, 101, 103, 111, 108, 102])
  • ASCII কোডগুলি একসাথে স্ট্রিং করা (উদাহরণস্বরূপ 99111100101103111108102)
  • বাইনারি রূপান্তর (যেমন 10100111111001101001011010001000011001101011011110000110010111111011000000110)
  • 0এমনকি প্যাডের শেষে একটি সংখ্যক অক্ষর তৈরি করতে (যেমন 101001111110011010010110100010000110011010110111100001100101111110110000001100)
  • প্রতিস্থাপন 00সঙ্গে A, 01সঙ্গে C, 10সঙ্গে G, এবং 11সঙ্গে T(যেমন GGCTTGCGGCCGGAGACGCGGTCTGACGCCTTGTAAATA)
  • আউটপুট

পরীক্ষার মামলা

codegolf > GGCTTGCGGCCGGAGACGCGGTCTGACGCCTTGTAAATA
ppcg > GGCTAATTGTCGCACTT
} > TTGG (padding)

বিশেষ উল্লেখ

  • এটি
  • আপনার প্রোগ্রাম অবশ্যই ইনপুট ফাঁকা গ্রহণ করতে হবে।
  • আপনার প্রোগ্রামের জন্য অবশ্যই কাজ করা উচিত codegolf

2
আমি মনে করি আপনার এমন একটি পরীক্ষার কেস যুক্ত করা উচিত যা প্যাডিং আচরণের প্রয়োজন requires অলস পছন্দটি হ'ল }যা আমি বিশ্বাস করি TTGG
FryAmTheEggman

3
আমাদের কত বড় ইনপুট সমর্থন করতে হবে? 99111100101103111108102উদাহরণস্বরূপ uint-64 এর চেয়ে বড়, তাই কিছু ভাষা বড় রূপান্তর নিয়ে লড়াই করতে পারে।
অ্যাডমবর্কবার্ক

4
আপনি যদি এগুলি আবার ডিকোড করতে সক্ষম হতে চান তবে আপনি ASCII কোডগুলিকে একসাথে স্ট্রিং করেন না not
ব্যবহারকারী 253751

আমি জানি
NoOneIsHere

উত্তর:


17

জেলি , 15 13 বাইট

OVBs2UḄị“GCTA

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস যাচাই করুন

কিভাবে এটা কাজ করে

OVBs2UḄị“GCTA    Main link. Argument: s (string)

O                Ordinal; replace each character with its code point.
 V               Eval. This converts the list to a string before evaluating, so it
                 returns the integer that results of concatenating all the digits.
  B              Binary; convert from integer to base 2.
   s2            Split into chunks of length 2.
     U           Upend; reverse the digits of each chunk.
                 Reversing means that we would have to conditionally PREPEND a zero
                 to the last chunk, which makes no difference for base conversion.
      Ḅ          Unbinary; convert each chunk from base 2 to integer.
                 `UḄ' maps:
                     [0, 1   ] -> [1,    0] -> 2
                     [1, 0(?)] -> [0(?), 1] -> 1
                     [1, 1   ] -> [1,    1] -> 3
                     [0, 0(?)] -> [0(?), 0] -> 0
       ị“GCTA    Replace each number by the character at that index.
                 Indexing is 1-based, so the indices are [1, 2, 3, 0].

9

সিজেএম, 24 23 বাইট

সত্যিই চতুর উপায়ে 1 বাইট সঞ্চয় করার জন্য ডেনিসকে ধন্যবাদ। :)

l:isi2b2/Wf%2fb"AGCT"f=

এটি এখানে পরীক্ষা করুন।

ব্যাখ্যা

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

l          e# Read input.
:i         e# Convert to character codes.
si         e# Convert to flat string and back to integer.
2b         e# Convert to binary.
2/         e# Split into pairs.
Wf%        e# Reverse each pair.
2fb        e# Convert each pair back from binary, to get a value in [0 1 2 3].
"AGCT"f=   e# Select corresponding letter for each number.

আমি সিজেএম সম্পর্কে কিছুই জানি না, তবে কেন আপনার প্রতিটি জুটির বিপরীত হওয়া দরকার? আপনি তাদের সরাসরি বাইনারি থেকে রূপান্তর করতে পারবেন না?
মান কালি

@ কেভিনলউ-নোটকেনি প্রতিটি জুটির বিপরীত হওয়া একটি দৈর্ঘ্য পেতে জিরো যুক্ত করা এড়িয়ে চলে। বিপরীত জোড়াগুলিতে আপনাকে জিরোগুলি আগে থেকেই কিনে রাখতে হবে, যা বেস রূপান্তরের জন্য গুরুত্বপূর্ণ নয়।
ডেনিস

দুর্দান্ত কৌশল! আমি যদি সেই কৌশল সম্পর্কে ভাবতাম তবে এটি সম্ভবত আমার নিজের সমাধানে একটি টন বাইট সংরক্ষণ করতে পারত
মান কালি


4

রুবি, 59 বাইট

$_='%b0'.%$_.bytes*''
gsub(/../){:ACGT[$&.hex%7]}
chomp'0'

একটি সম্পূর্ণ প্রোগ্রাম। -pপতাকা নিয়ে দৌড়াও।


আপনি কীভাবে কীভাবে করেছিলেন ... আমি বুঝতে পারি না
মান কালি

4

পাইথন 3, 130 বাইট।

2 টি বাইট সংরক্ষণ করুন ভোল্টাহের জন্য ধন্যবাদ।
কেভিন নয় - কেভিন লউকে 6 বাইট সংরক্ষণ করা হয়েছে।

পাইথনে বাইনারি রূপান্তর করা কতটা কঠিন তা আমি ঘৃণা করি।

def f(x):c=bin(int(''.join(map(str,map(ord,x)))))[2:];return''.join('ACGT'[int(z+y,2)]for z,y in zip(*[iter(c+'0'*(len(c)%2))]*2))

পরীক্ষার কেস:

assert f('codegolf') == 'GGCTTGCGGCCGGAGACGCGGTCTGACGCCTTGTAAATA'
assert f('ppcg') == 'GGCTAATTGTCGCACTT'

দেখে মনে হচ্ছে দ্বিতীয়টির পরে আপনার কাছে আরও 1 টি বন্ধনী রয়েছে''.join
ভল্টাহ

@ ওলতাহ উফফ, ঠিক আছে
মরগান থ্র্যাপ

'ACGT'[int(z+y,2)]পরিবর্তে ব্যবহার করুন, আপনার দীর্ঘ স্ট্রিংটি ব্যবহার করার পরিবর্তে বাইনারি থেকে সরাসরি রূপান্তরিত এবং বেস 10 থেকে রূপান্তর করার re.subপরিবর্তে এটি নিশ্চিত করুন যে এটি কতটা তফাত তৈরি করবে কিন্তু আপনার অগোছালো যোগদানের কৌশলটির পরিবর্তে ব্যবহারের দিকে তাকান ?
মান কালি

@ কেভিনলউ-নোট কেনি ওওও, ধন্যবাদ আমি ভুলে গেছি আপনি একটি বেস নির্দিষ্ট করতে পারেন int। আমি সন্ধান করব re.sub, পরামর্শের জন্য ধন্যবাদ।
মরগান থ্রাপ

ভাল পদ্ধতির, আমি আপনার দিকে না তাকিয়ে (প্রায়) ঠিক একই কোডটি নিয়ে এসেছি। :)
বাইট কমান্ডার


3

গণিত, 108 বাইট

{"A","C","G","T"}[[IntegerDigits[Mod[Floor@Log2@#,2,1]#&@FromDigits[""<>ToString/@ToCharacterCode@#],4]+1]]&

ইনপুট হিসাবে একটি স্ট্রিং নেয় এবং বেসগুলির একটি তালিকা আউটপুট করে।


3

পাইথন 3, 126 বাইট

lambda v:"".join(["ACGT"[int(x,2)]for x in map(''.join,zip(*[iter((bin(int("".join([str(ord(i))for i in v])))+"0")[2:])]*2))])

প্রোগ্রামিং ধাঁধা এবং কোড গল্ফ স্বাগতম! আপনি যদি ডাউনটোট সম্পর্কে ভাবছেন তবে এটি ঘটেছিল
ডেনিস

2

পাইথ, 25 বাইট

sm@"ACGT"id2Pc.B*4sjkCMQ2

এখানে চেষ্টা করুন!

ব্যাখ্যা

মার্টিনস সিজেম উত্তর থেকে প্যাডিং ট্রিকটি বাড়িয়ে দেওয়া

এস এম @ "" এসিজিটি "id2Pc.B * 4sjkCMQ2 # কিউ = ইনপুট

                     সিএমকিউ # কিউর প্রতিটি অক্ষরকে তার অক্ষর কোডটিতে মানচিত্র করুন
                  sjk # একটি স্ট্রিংয়ে যোগ দিন এবং পূর্ণসংখ্যায় রূপান্তর করুন
              .বি * 4 # মুলিটপ্লাই 4 দিয়ে এবং বাইনারি রূপান্তর করুন
             সি 2 # জোড়ায় বিভক্ত করুন
            পি # শেষ জুটি বাতিল করুন
 মি # প্রতিটি জোড় মানচিত্র d
         আইডি 2 # জোড়া বাইনারি থেকে দশমিক রূপান্তর করুন
  @ "এসিজিটি" # ফলাফলটি দেখুন a অনুসারে একটি অনুসন্ধানের স্ট্রিংয়ের সূচি হিসাবে
s # ফলাফলের তালিকায় স্ট্রিংয়ে যোগদান করুন


2

জাভা, 194 বাইট

String a(int[]a){String s="",r=s;for(int i:a)s+=i;s=new BigInteger(s).toString(2)+0;for(int i=0,y,n=48;i<(s.length()/2)*2;r+=s.charAt(i++)==n?y==n?'A':'G':y==n?'C':'T')y=s.charAt(i++);return r;}

Ungolfed

String a(int[] a) {
    String s = "", r = s;
    for (int i : a) s += i;
    s = new BigInteger(s).toString(2) + 0;
    for (int i = 0, y, n = 48; i < (s.length() / 2) * 2; 
        r += s.charAt(i++) == n 
                 ? y == n 
                 ? 'A' 
                 : 'G' 
                 : y == n 
                 ? 'C' 
                 : 'T')
        y = s.charAt(i++);
    return r;
}

বিঃদ্রঃ

  • ইনপুটটি চরগুলির একটি অ্যারে (যা স্ট্রিংয়ের ফর্ম হিসাবে গণনা করা উচিত), প্যারামিটারটি টাইপ int[]কারণ একটি বাইট সংরক্ষণ করে char[]

আউটপুট

Input:  codegolf
Output: GGCTTGCGGCCGGAGACGCGGTCTGACGCCTTGTAAATA

Input:  .
Output: GTG

Input:  }
Output: TTGG

Input:  wow
Output: TGATAGTTGTGCTG

Input:  programming puzzles
Output: GTGTCAGAGTTGAAGGCCGTTCCGCAGTGCATTTGGCTCGTCTGGTGTCTACTAGCCTGCGAGAGGAGTTACTTTGGATCCTTGACTTGT

2

এমএটিএল , 21 বাইট

'CGTA'joV4Y2HZa2e!XB)

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

'CGTA'   % Push string to be indexed into
j        % Take input string
o        % Convert each char to its ASCII code
V        % Convert to string (*). Numbers are separated by spaces
4Y2      % Push the string '0123456789'
H        % Push number 2
Za       % Convert string (*) from base '0123456789' to base 2, ignoring spaces
2e       % Reshape into a 2-column matrix, padding with a trailing 0 if needed
!        % Transpose
XB       % Convert from binary to decimal
)        % Index into string with the DNA letters. Indexing is 1-based and modular

1

পাইথ , 23 বাইট

sm@"AGCT"i_d2c.BsjkCMQ2

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

ডেনিসের জেলি উত্তর থেকে কৌশলটি ধার করা ।

sm@"AGCT"i_d2c.BsjkCMQ2
                   CMQ   convert each character to its byte value
                sjk      convert to a string and then to integer
              .B         convert to binary
             c        2  chop into pairs
 m         d             for each pair:
          _                  reverse it
         i  2                convert from binary to integer
  @"AGCT"                    find its position in "AGCT"
s                        join the string

1

গ্রোভি, 114 বাইট

{s->'ACGT'[(new BigInteger(((Byte[])s).join())*2).toString(2).toList().collate(2)*.with{0.parseInt(it.join(),2)}]}

ব্যাখ্যা:

{s->
    'ACGT'[ //access character from string
        (new BigInteger( //create Big Integer from string
           ((Byte[])s).join() //split string to bytes and then join to string
        ) * 2) //multiply by 2 to add 0 at the end in binary
        .toString(2) //change to binary string
        .toList() //split to characters
        .collate(2) //group characters by two
        *.with{
            0.parseInt(it.join(),2) //join every group and parse to decimal
        }
     ]
}

দুর্দান্ত উত্তর! আপনি দয়া করে একটি ব্যাখ্যা যোগ করতে পারেন?
NoOneIsHere

প্রথম সংস্করণটি কাজ করছে না, কারণ আমি 0 যুক্ত করতে ভুলে গিয়েছি I আমি এটি ঠিক করেছিলাম, এবং বাইট বিটিডব্লু দিয়ে নেমে গেলাম।
ক্রিজিসটফ আটাসিক


1

পাইথন 2.7, 135 বাইট

def f(A):g=''.join;B=bin(int(g(map(str,map(ord,A)))))[2:];B+=len(B)%2*'0';return g('ACGT'[int(B[i:i+2],2)] for i in range(len(B))[::2])

Ungolfed:

def f(A):
    g = ''.join
    B = bin(int(g(map(str,map(ord,A)))))[2:] # convert string input to binary
    B += len(B)%2 * '0' # add extra 0 if necessary
    return g('ACGT'[int(B[i:i+2],2)] for i in range(len(B))[::2]) # map every two characters into 'ACGT'

আউটপুট

f('codegolf')
'GGCTTGCGGCCGGAGACGCGGTCTGACGCCTTGTAAATA'

@ ড্রগ্রাইনইগস্যান্ডহ্যামডিজে আমি g(...)সেখানে দু'বার ফাংশন করেছি , তাই আমি বিশ্বাস করি যে এটির পরিবর্তে join2 বাইট যুক্ত হবে?
ডিউটিস

আহ, আমি এটা মিস করেছি। আমার খারাপ!
DJMcMayhem

1

জাভাস্ক্রিপ্ট ES7, 105 103 বাইট

s=>((+[for(c of s)c.charCodeAt()].join``).toString(2)+'0').match(/../g).map(x=>"ACGT"['0b'+x-0]).join``

ES7 অংশটি for(c of s)অংশ।

ES6 সংস্করণ, 107 105 বাইট

s=>((+[...s].map(c=>c.charCodeAt()).join``).toString(2)+'0').match(/../g).map(x=>"ACGT"['0b'+x-0]).join``

অবহেলিত কোড

dna = (str)=>{
  var codes = +[for(c of str)c.charCodeAt()].join``;
  var binaries = (codes.toString(2)+'0').match(/../g);
  return binaries.map(x=>"ACGT"['0b'+x-0]).join``
}

পিপিসিজিতে গল্ফ করার এটি আমার প্রথম চেষ্টা, কিছু ভুল হলে আমাকে সংশোধন করতে দ্বিধা বোধ করুন।

ছোট উন্নতির জন্য @ অ্যালেক্সা ধন্যবাদ।


1
এটি একটি সুন্দর প্রথম গল্ফ! যেহেতু ফাংশনটি পুনরাবৃত্তিযোগ্য নয় এবং আমাদের নামকরণের জন্য ফাংশনগুলির প্রয়োজন নেই, সুতরাং আপনার f=2 বাইট সংরক্ষণ করে অপসারণ করতে সক্ষম হওয়া উচিত । :)
অ্যালেক্স এ।

1

জে, 52 বাইট

 3 :'''ACGT''{~#._2,\#:".,&''x''":(,&:(":"0))/3&u:y'

ব্যবহার: 3 :'''ACGT''{~#._2,\#:".,&''x''":(,&:(":"0))/3&u:y' 'codegolf'==>GGCTTGCGGCCGGAGACGCGGTCTGACGCCTTGTAAATA


1

কমন লিস্প (লিসপার্কস), 415 বাইট

(defun f(s)(labels((p(e f)(concatenate'string e f)))(let((b"")(d""))(dotimes(i(length s))(setf b(p b(write-to-string(char-int(elt s i))))))(setf b(write-to-string(parse-integer b):base 2))(if(oddp #1=(length b))(setf b(p b"0")))(do((j 0(+ j 2)))((= j #1#)d)(let((c(subseq b j(+ j 2))))(cond((#2=string="00"c)(setf d(p d"A")))((#2#"01"c)(setf d(p d"C")))((#2#"10"c)(setf d(p d"G")))((#2#"11"c)(setf d(p d"T")))))))))

ungolfed:

(defun f (s)
  (labels ((p (e f)
             (concatenate 'string e f)))
  (let ((b "") (d ""))
    (dotimes (i (length s))
      (setf b
            (p b
               (write-to-string
                (char-int (elt s i))))))
    (setf b (write-to-string (parse-integer b) :base 2))
    (if (oddp #1=(length b))
        (setf b (p b "0")))
      (do ((j 0 (+ j 2)))
          ((= j #1#) d)
        (let ((c (subseq b j (+ j 2))))
          (cond ((#2=string=  "00" c)
                 (setf d (p d "A")))
                ((#2# "01" c)
                 (setf d (p d "C")))
                ((#2# "10" c)
                 (setf d (p d "G")))
                ((#2# "11" c)
                 (setf d (p d "T")))))))))

ব্যবহার:

CL-USER 2060 > (f "}")
"TTGG"

CL-USER 2061 > (f "golf")
"TAAAAATTATCCATAAATA"


0

পার্ল 6, 57 + 1 ( -pপতাকা) = 58 বাইট

$_=(+[~] .ords).base(2);s:g/..?/{<A G C T>[:2($/.flip)]}/

ধাপে ধাপে ব্যাখ্যা:

-pপতাকা পার্ল 6 দোভাষীকে কোড লাইন দ্বারা লাইনে চালিত করে, বর্তমান লাইনটি রাখে $_এবং শেষে এটিকে পিছনে ফেলে দেয় $_

.ords- পিরিয়ডের আগে যদি কিছু না থাকে তবে একটি পদ্ধতি চালু করা হয় $_ordsপদ্ধতিটি একটি স্ট্রিংয়ে কোডপয়েন্টগুলির তালিকা প্রদান করে।

[~]- []হ্রাস অপারেটর, যা ব্র্যাককেটের মধ্যে তার হ্রাস অপারেটর সংরক্ষণ করে। এই ক্ষেত্রে, এটি ~, যা একটি স্ট্রিং কংক্রিটেশন অপারেটর। উদাহরণস্বরূপ, [~] 1, 2, 3সমান 1 ~ 2 ~ 3

+এর যুক্তিকে একটি সংখ্যায় রূপান্তর করে, প্রয়োজনীয় কারণ baseপদ্ধতিটি কেবলমাত্র পূর্ণসংখ্যার জন্য সংজ্ঞায়িত হয়।

.base(2) - পূর্ণসংখ্যাকে বেস 2 এর স্ট্রিংয়ে রূপান্তর করে

$_=- ফলাফল নির্ধারিত $_

s:g/..?/{...}/- এটি রেগেক্সের কোনও ( :g, বৈশ্বিক মোড) উদাহরণ ..?(এক বা দুটি অক্ষর) প্রতিস্থাপনের একটি নিয়মিত প্রকাশ । দ্বিতীয় যুক্তি হ'ল একটি প্রতিস্থাপন প্যাটার্ন, যা এই ক্ষেত্রে কোডে (পার্ল 6 এ, স্ট্রিংগুলিতে কোঁকড়ানো বন্ধনী এবং প্রতিস্থাপনের ধরণগুলিকে কোড হিসাবে কার্যকর করা হয়)।

$/ - একটি রেজেক্স ম্যাচ ভেরিয়েবল

.flip- একটি স্ট্রিং উল্টায়। এটি $/স্পষ্টতই (একটি রেজেক্স ম্যাচ অবজেক্ট) একটি স্ট্রিতে রূপান্তর করে । এটি কারণ একটি একক চরিত্রের বিপরীতে 1প্রসারিত হওয়া উচিত । সেই ফ্লিপের কারণে অ্যারেতে থাকা উপাদানগুলির ক্রমটিতে জি এবং সি বিপরীত হয়েছে।1001

:2(...) - একটি বেস -2 স্ট্রিংটিকে পূর্ণসংখ্যায় পার্স করে।

<A G C T> - চারটি উপাদান অ্যারে।

...[...] - অ্যারে অ্যাক্সেস অপারেটর।

ওটার মানে কি? প্রোগ্রামটি সমস্ত কোডপয়েন্টের একটি স্ট্রিংয়ের তালিকা পায়, তাদের একত্রে সম্মিলিত করে, বেস 2 এ রূপান্তর করে Then বাইনারি মধ্যে


0

হুন , 148 138 বাইট

|*
*
=+
(scan (reel +< |=({a/@ b/tape} (weld <a> b))) dem)
`tape`(flop (turn (rip 1 (mul - +((mod (met 0 -) 2)))) |=(@ (snag +< "ACGT"))))

"abc" হল পরমাণুর একটি তালিকা। <a>তালিকার উপর ভাঁজ করার সময় তাদেরকে স্ট্রিংগুলিতে ( ) বিভক্ত করুন, তাদের সাথে নতুন স্ট্রিংয়ের সাথে যুক্ত করুন। ++demএটি একটি পরমাণুর কাছে ফিরে পেতে নম্বরটি পার্স করুন ।

এটি প্যাড করতে সংখ্যাটি (বিটওয়াইয়াস দৈর্ঘ্য + 1) দ্বারা 2 দিয়ে গুণ করুন। ব্যবহারের ++ripএকটি তালিকা মধ্যে পরমাণুর প্রতি দুই বাইট যুগল অবতরণ করা, তালিকা ধরে মানচিত্র ও STRING "ACGT" মধ্যে একটি সূচক যেমন নম্বর ব্যবহার করুন।

> =a |*
  *
  =+
  (scan (reel +< |=({a/@ b/tape} (weld <a> b))) dem)
  `tape`(flop (turn (rip 1 (mul - +((mod (met 0 -) 2)))) |=(@ (snag +< "ACGT"))))
> (a "codegolf")
"GGCTTGCGGCCGGAGACGCGGTCTGACGCCTTGTAAATA"
> (a "ppcg")
"GGCTAATTGTCGCACTT"
> (a "}")
"TTGG"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.