DNAにゴルフテキスト


26

DNAゴルフへのテキスト

チャレンジ

入力をDNA出力に変換します。

アルゴリズム

  • テキストをASCIIコードポイントに変換します(例codegolf-> [99, 111, 100, 101, 103, 111, 108, 102]
  • ASCIIコードをつなぎ合わせます(例99111100101103111108102
  • バイナリに変換(例10100111111001101001011010001000011001101011011110000110010111111011000000110
  • パッドは、0(例えば、文字の偶数個を作るために最後にね101001111110011010010110100010000110011010110111100001100101111110110000001100
  • 交換する00A01C10G、と、11T(例えばGGCTTGCGGCCGGAGACGCGGTCTGACGCCTTGTAAATA
  • 出力

テストケース

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

仕様書

  • これは
  • プログラムは入力でスペースを受け入れなければなりません。
  • プログラムはで動作する必要がありcodegolfます。

2
パディング動作が必要なテストケースを追加する必要があると思います。怠zyな選択は、}私がそうなると信じていますTTGG
-FryAmTheEggman

3
どのくらいの入力をサポートする必要がありますか?99111100101103111108102たとえば、uint-64よりも大きいため、一部の言語では大きな変換に苦労する場合があります。
AdmBorkBork

4
ASCIIコードを再度デコードできるようにしたい場合、それはASCIIコードをつなぎ合わせる方法ではありません。
user253751

@immibis知っています。
-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

CJam、24 23バイト

本当に賢い方法で1バイトを節約してくれたDennisに感謝します。:)

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

ここでテストしてください。

説明

仕様の非常に直接的な実装。唯一興味深いのは、偶数のゼロへのパディングです(実際にはデニスのアイデアでした)。各ペアの数字を通常の順序で処理する代わりに、2番目のビットを最上位ビットにします。つまり、1ビットで終わることは、ゼロを追加することと同じです。つまり、ゼロをまったく追加する必要はありません。

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.

CJamについては何も知りませんが、各ペアを逆にする必要があるのはなぜですか?それらをバイナリから直接変換することはできませんか?
バリューインク

@ KevinLau-notKenny各ペアを逆にすると、ゼロが追加されて長さが均等になることを回避できます。逆のペアでは、ゼロを追加する必要がありますが、これは基本変換には関係ありません。
デニス

ナイストリック!私はそのトリックについて考えていた場合、それはおそらく、私の独自のソリューションのバイトのトンを保存しているだろう
バリューインク

6

Python 2、109 103バイト

lambda s,j=''.join:j('ACGT'[int(j(t),2)]for t in
zip(*[iter(bin(int(j(`ord(c)`for c in s))*2)[2:])]*2))

Ideoneでテストします。


4

ルビー、59バイト

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

完全なプログラム。-pフラグを指定して実行します。


どうして...わからない
バリューインク

4

Python 3、130バイト。

vaultahのおかげで2バイト節約されました。
ケニーではなくケビン・ラウのおかげで6バイト節約しました。

Pythonでバイナリに変換するのがどれほど難しいか嫌いです。

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'

2番目の後に1組のブラケットが追加されているように見えます''.join
-vaultah

@vaultahおっと、そうですね。
モーガンスラップ16年

'ACGT'[int(z+y,2)]代わりに、長い文字列を使用して10進数から変換する代わりに、バイナリから直接変換します。また、どの程度の違いが生じるかわからないre.subが、ごちゃごちゃした結合トリックの代わりに使用することを検討してください。
バリューインク

@ KevinLau-notKennyウー、ありがとう。でベースを指定できることを忘れていましたint。を見てre.sub、提案をありがとう。
モーガンスラップ16年

良いアプローチです。私はあなたのコードを見ずに(ほぼ)まったく同じコードを思いつきました。:)
バイトコマンダー


3

Mathematica、108バイト

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

入力として文字列を受け取り、ベースのリストを出力します。


3

Python 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

Pyth、25バイト

sm@"ACGT"id2Pc.B*4sjkCMQ2

ここで試してみてください!

説明

Martins CJamの回答からパディングトリックを掘り起こします

sm @ "ACGT" id2Pc.B * 4sjkCMQ2#Q =入力

                     CMQ#Qの各文字をその文字コードにマッピングします
                  sjk#1つの文字列に結合して整数に変換
              .B * 4#4を複数使用してバイナリに変換
             c 2#ペアに分割
            P#最後のペアを破棄
 m#各ペアをマッピングしますd
         id2#ペアを2進数から10進数に変換します
  @ "ACGT"#結果^をルックアップ文字列へのインデックスとして使用
s#結果リストを文字列に結合します


2

Java、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;}

非ゴルフ

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;
}

注意

  • 入力は文字の配列(Stringの形式としてカウントする必要があります)で、パラメーターはint[]1バイトで保存されるため、型はになりますchar[]

出力

Input:  codegolf
Output: GGCTTGCGGCCGGAGACGCGGTCTGACGCCTTGTAAATA

Input:  .
Output: GTG

Input:  }
Output: TTGG

Input:  wow
Output: TGATAGTTGTGCTG

Input:  programming puzzles
Output: GTGTCAGAGTTGAAGGCCGTTCCGCAGTGCATTTGGCTCGTCTGGTGTCTACTAGCCTGCGAGAGGAGTTACTTTGGATCCTTGACTTGT

2

MATL、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

Groovy、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を追加するのを忘れていたためです。
クレジシュトフアトラジク


1

Python 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])

ゴルフをしていない:

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'

@DrGreenEg​​gsandHamDJ私はg(...)そこに関数を2回持っているので、それを置き換えるとjoin2バイトを追加すると思いますか?
16年

ああ、私はそれを見逃した。私の悪い!
DJMcMayhem

1

Javascriptを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``
}

これはPPCGでのゴルフの初めての試みです。何か問題があれば私に訂正してください。

@AlexAの小さな改善に感謝します。


1
これは素晴らしい最初のゴルフです!この関数は再帰的ではなく、関数に名前を付ける必要がないためf=、削除して2バイトを節約できるはずです。:)
アレックスA.

1

J、52バイト

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

使用法:3 :'''ACGT''{~#._2,\#:".,&''x''":(,&:(":"0))/3&u:y' 'codegolf'==>GGCTTGCGGCCGGAGACGCGGTCTGACGCCTTGTAAATA


1

Common Lisp(Lispworks)、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")))))))))

なし:

(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

Perl、155 148 137 + 1(-pフラグ)= 138バイト

#!perl -p
s/./ord$&/sge;while($_){/.$/;$s=$&%2 .$s;$t=$v="";$t.=$v+$_/2|0,$v=$_%2*5
for/./g;s/^0// if$_=$t}$_=$s;s/(.)(.)?/([A,C],[G,T])[$1][$2]/ge

Ideoneでテストします。


0

Perl 6、57 + 1(-pフラグ)= 58バイト

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

ステップごとの説明:

-pflagを指定すると、Perl 6インタープリターはコードを1行$_ずつ実行し、現在の行を挿入し、最後にから戻し$_ます

.ords-ピリオドの前に何もない場合、メソッドが呼び出され$_ます。ordsメソッドは、文字列でコードポイントのリストを返します。

[~]- []は、リダクション演算子であり、カッコ内にリダクション演算子を格納します。この場合、それ~は、文字列連結演算子です。たとえば、[~] 1, 2, 3はと同等1 ~ 2 ~ 3です。

+baseメソッドは整数に対してのみ定義されているため、引数を数値に変換します。

.base(2) -整数を基数2の文字列に変換します

$_=-結果をに割り当て$_ます。

s:g/..?/{...}/-これは、正規表現の任意の(:g、グローバルモード)インスタンス..?(1つまたは2つの文字)を置き換える正規表現です。2番目の引数は置換パターンであり、この場合はコード内です(Perl 6では、文字列の中括弧と置換パターンがコードとして実行されます)。

$/ -正規表現一致変数

.flip-文字列を反転します。暗黙的に$/(正規表現一致オブジェクト)を文字列に変換します。これは、単一の文字1をに拡張する必要がある10ため01です。その反転のため、配列内の要素の順序はGとCが逆になります。

:2(...) -base-2文字列を整数に解析します。

<A G C T> -4つの要素の配列。

...[...] -配列アクセス演算子。

どういう意味ですか?プログラムは、文字列内のすべてのコードポイントのリストを取得し、それらを連結し、それらをベース2に変換します。次に、2または1文字のすべてのインスタンスを、数字の反転表現に応じて文字A、G、C、Tのいずれかに置き換えますバイナリで。


0

Hoon148138バイト

|*
*
=+
(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して、アトムの2バイトペアごとにリストを逆アセンブルし、リストをマッピングし、その番号を文字列「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.