プログラムパズルとコード____


45

入力

印刷可能なASCII文字(32〜126の範囲)で構成される、空ではないエンコード文字列。一部の欠落文字がに置き換えられてい_ます。

出力

不足している文字を含む、すべての文字が小文字の同じ長さのデコードされた文字列。

どうやって?

編集:コメントで@Deusoviが述べたように、これはベーコンの暗号の変形です。

  • 元の文字列のすべての文字を収集し、5でグループ化します。5の完全なグループに収まらない追加の文字は無視されます。
  • 各グループをバイナリに変換します:lowercase = 0、uppercase = 1。これは整数のリストにつながります。
  • このリストの各値Nを使用_して、元の文字列の各値を、出現順にアルファベットのN番目の文字(0インデックス付き)に置き換えます。

例: prOGraMMIng PuZZleS & cOde ____

prOGr --> 00110 -->  6 -->  7th letter = 'g'
aMMIn --> 01110 --> 14 --> 15th letter = 'o'
gPuZZ --> 01011 --> 11 --> 12th letter = 'l'
leScO --> 00101 -->  5 -->  6th letter = 'f'

欠落している文字を置き換え、すべてを小文字に戻すことにより、元の文字列が明らかになります。

programming puzzles & code golf

これは予想される出力です。

明確化と規則

  • 欠落している文字は、文字列の最後に表示されることが保証されています。より正式に_は、入力文字列の最初の文字の後に文字が存在することはありません。ただし、スペースや句読点などの他の印刷可能なASCII文字が存在する場合があります。
  • 入力には、無駄な大文字が含まれないことが保証されています。すべての大文字は、欠落している文字をデコードするために必要な1に設定されたビットです。それ以外はすべて小文字です。
  • 入力文字列は有効であることが保証されています。特に:
    • アンダースコアをデコードするのに十分な5文字のグループが常に含まれます。
    • バイナリエンコードされた整数は、範囲[0-25]であることが保証されています。
  • _入力文字列にまったくない場合があります。その場合は、入力を返すだけです。
  • これはなので、バイト単位の最短回答が勝ちです!

テストケース

Input : hello!
Output: hello!

Input : helLO, worl_!
Output: hello, world!

Input : i aM yoUr faTh__.
Output: i am your father.

Input : prOGraMMIng PuZZleS & cOde ____
Output: programming puzzles & code golf

Input : Can YOu gUesS tHE ENd oF This ____?
Output: can you guess the end of this text?

Input : THe qUICk brown FOx JUMps oVEr the la__ ___.
Output: the quick brown fox jumps over the lazy dog.

Input : RoadS? wHERe we're goinG WE doN't need _____.
Output: roads? where we're going we don't need roads.

Input : thE greatESt Trick thE DeVIl EVer PUllEd wAs CONvInciNg tHe WorLD h_ ____'_ _____.
Output: the greatest trick the devil ever pulled was convincing the world he didn't exist.

いくつかの追加のテストケース:

Input : BInar_
Output: binary

Input : 12 MonKey_
Output: 12 monkeys

Input : hyPerbolIZ__
Output: hyperbolized

Input : {[One Last Test ca__]}
Output: {[one last test case]}

入力にアンダースコアがある限り、5つのグループだけを考慮する必要がありますか?
エソランジングフルーツ

その場合、_入力文字列にnoがある場合のルールは特殊なケースです。
エソランジングフルーツ

1
ああ、ベーコン暗号!
デウソビ

1
@SztupYとしてThe input is guaranteed not to contain any useless capital letter、アンダースコアがない場合、大文字もありません。
ライコニ

1
@KirillL。はい、何でも[32-126]。別のテストケースを追加しました。
アーナウルド

回答:


19

05AB1E、18バイト

コード:

áS.u5ôJC>.bv'_y.;l

05AB1Eエンコードを使用します。オンラインでお試しください!

説明:

á                       # Remove non-letters from the input string.
 S                      # Split the result into individual characters.
  .u                    # Check if is uppercase for each character.
    5ôJ                 # Split into binary numbers of length 5.
       C                # Convert from binary to decimal.
        >               # Add one.
         .b             # Map 1 → A, 2 → B, 3 → C, ..., 25 → Y, 26 → Z.
           v            # For each letter:
            '_y.;       #   Replace the first occurrence of '_' with the current letter.
                 l      #   Convert the string to lowercase.


8

Perl 5、75 -pF -MList::Util=sumバイト

@a=grep!/\W|\d/,@F;s!_!(a..z)[sum map{a gt shift@a&&16/2**$_}0..4]!eg;$_=lc

オンラインでお試しください!

説明:

  • -pF入力行を変数に読み取り、$_文字に分割して配列に格納し@Fます。
  • @a=grep!/\W|\d/,@F配列を正規表現を満たさない@aそれらのメンバーに等しく設定します。文字、数字、および; 数字です。だから、何が、文字があると、そしてすべての文字と持っている文字を。で文字を調べることはありません。(これは、入力がASCIIであることが保証されているためにのみ機能することに注意してください。)@F\W|\d\W_\d\W|\d_@a__@a
  • map{a gt shift@a&&16/2**$_}0..40〜4に対して次の処理を行います。次の要素をからシフトして@a、短縮し、aその要素よりも大きいかどうか(つまり、その要素が大文字かどうか)を評価します。そうであれば、&&短絡されていないので、16を2で除算して入力値のべき乗(0から4)を得ます。それ以外の場合&&は短絡し、0を取得しmapます。5つの数字のリストをに返し、sumそれらを追加します。
  • それがリストから必要な要素a..zであり、それがから得られるもの(a..z)[…]です。
  • s!_!…!egのそれぞれ_$_順番に適切な文字に変換します。
  • $_=lc$_自身の小文字バージョンに変換して-p出力します。


5

ゼリー 28 27  26 バイト

-1アウトゴルファーのエリックとディルナンに感謝

ゼリーに優しいチャレンジではありません!

ḟŒs$Ƈ<”[s5Ḅ+97Ọż@ṣ”_$FṁLŒl

文字のリストを受け入れて返すモナドリンク。

オンラインでお試しください!

どうやって?

ḟŒs$Ƈ<”[s5Ḅ+97Ọż@ṣ”_$FṁLŒl - Link: list of characters    e.g. "MfUNE_?"  (shorthand for ['M','f','U','N','E','_','?'])
    Ƈ                      - filter keep each if:
   $                       -   last two links as a monad:
 Œs                        -     swap-case
ḟ                          -     filter discard
                           - ...i.e. keep A-Z,a-z since they change when the case is swapped
                           -                                  "MfUNE"
      ”[                   - literal character                '['
     <                     - less than? (i.e. is upper-case?) [1,0,1,1,1]
        s5                 - split into fives                 [[1,0,1,1,1]]
          Ḅ                - from base two (vectorises)       [[23]]
           +97             - add (vectorises) ninety-seven    [[120]]
              Ọ            - from ordinals (vectorises)       [['x']]
                    $      - last two links as a monad:
                  ”_       -   literal character              '_'
                 ṣ         -   split at                       [['M','f','U','N','E'],['?']]
               ż@          - swapped @rgument zip             [[['M','f','U','N','E'],'x'],['?']]
                     F     - flatten                          "MfUNEx?"
                       L   - length (of input)                7
                      ṁ    - mould like                       "MfUNEx?"
                           - ...removes any excess characters
                        Œl - lower-case                       "mfunex?"

5

網膜91 90バイト

T`l`a
T`L`A
[^Aa]

L`.{5}
A
aA
+`Aa
aAA
+T`_lA`l_`[^A]A
^
$+¶
+`_(.*)¶a+(.)
$2$1
0G`
T`L`l

オンラインでお試しください!説明:

T`l`a
T`L`A
[^Aa]

小文字をにa、大文字をに変換しA、他のすべてを削除します。

L`.{5}

Aasを5つのグループに分割します。

A
aA
+`Aa
aAA

バイナリから単項に変換しA、1およびa0 として処理します。Aa元々5 秒だったので、a残りの5 秒に加えてA、アルファベットの目的の位置に応じていくつかのsがあります。

+T`_lA`l_`[^A]A

aAのの数に応じて最後の値を増やします。

^
$+¶

元の入力を追加します。

+`_(.*)¶a+(.)
$2$1

_sを次のデコードされた文字に置き換えます。

0G`

デコードされた予備の文字をすべて削除します。

T`L`l

すべてを小文字にします。

Retina 0.8.2、117バイト

.+
$&¶$&
T`L`l`^.*
T`l`a`.*$
T`L`A
T`aAp`aA_`.*$
(.*¶)?.{5}
$&;
A
aA
+`Aa
aAA
+T`_lA`l_`[^A]A
+`_(.*¶)a+(.);
$2$1
1G`

オンラインでお試しください!説明:

.+
$&¶$&

入力を複製します。

T`L`l`^.*

最初のコピーを小文字にします。

T`l`a`.*$

小文字をa2番目のコピーに変換します。

T`L`A

大文字をに変換しますA。最初のコピーはすでに小文字になっているため、これらは2番目のコピーになければなりません。

T`aAp`aA_`.*$

2番目のコピーのその他すべてを削除します。

(.*¶)?.{5}
$&;

2番目のコピー(現在はAas)を5つのグループに分割します。

A
aA
+`Aa
aAA
+T`_lA`l_`[^A]A
+`_(.*¶)a+(.);
$2$1
1G`

文字をデコードし、以前のように挿入します。


5

APL(Dyalog Unicode)、46 バイトSBCS

匿名のラムダ、⎕IO(インデックスの起点)を想定します0

{_'_'=⊢⋄819A[2⊥⍉(+/_⍵)5A∊⍨⍵∩A,819A←⎕A]@_⍵}

オンラインでお試しください!

{... ... } 2、文関数。引数であり、ステートメントを分離します

 引数(no-op関数)
'_'= は、アンダースコア(ブールマッピング関数)
_← に等しい場合、その関数を割り当てます_

A[... ]@_⍵ の次の文字を入れたA 時に、引数にアンダースコアの位置
  ⎕A 大文字A lphabet
  A← すること割り当てA
  819⌶ 、それを小文字(819≈ビッグなし左引数手段大きくない、つまり小文字で、)
  A, 大文字のアルファベットを付加。これにより、すべての文字
  ⍵∩ が引数とその交差点になります。
  A∊⍨ 大文字のアルファベットのメンバーである引数の文字のみ。大文字のビット
  ()5⍴rを次の行数と5列に整形します。
   _⍵ 引数のアンダースコアのマスクは
   +/ 、アンダースコアの数
   転置(各行をビット位置としてではなく数値として扱うため)
  2⊥ base-2
819⌶ lowercase all として評価


5

Scala、189バイト

def f(s:Array[Char])={var j=0;s.zipWithIndex.collect{case(95,i)=>s(i)=(Integer.parseInt(s.filter(_.isLetter)slice(j,j+5)map(k=>if(k<91)1 else 0)mkString,2)+97)toChar;j+=5};s.map(_.toLower)}

オンラインでお試しください!

説明:

def f(s: Array[Char]) = {                // takes a String in input
  var j = 0                              // j stores at which block of 5 letters we're currently at
  s.zipWithIndex.collect {               // Array('h', 'e', ...) => Array(('h', 0) ('e', 1), ...) and we apply a collect transformation (filter/map)
    case (95, i) =>                      // we only handle cases where the char is '_' (95)
      s(i) = (                           // we modify the char at index i with the following
        Integer.parseInt(                // Integer.parseInt("00110", 2) = 6
          s                              //
            .filter(_.isLetter)          // filter out non letter chars (spaces, punct, figures, ...) from the input string (thanks @Arnauld for the fix)A
            .slice(j, j+5)               // "substring" the array to the block of 5 letters in question
            .map(                        // map on the current block of 5 letters
              k =>                       // the index of the next char in the block f 5 (e.g. 13)
                if (k < 91) 1 else 0     // if the current char is upper case (<91) then we replace it by a bit true, otherwise by a bit false
            )mkString,                   // Array(0, 1, 1, ...) => "011..."
          2                              // cast string to binary
        )                                //
        + 97                             // +97 to create a lower case char
      )toChar                            // cast from int to char
      j += 5                             // update the starting index of the next block of 5 letters
    }                                    //
  s.map(_.toLower)                       // return the updated seq of chars all in lower case
}                                        //




3

クリーン180 ... 150バイト

import StdEnv
?s=['a'+sum[i\\i<-:""&c<-s|c<'a']: ?(drop 5s)]
@['_':b][x:y]=[x: @b y]
@[a:b]z=[toLower a: @b z]
@e _=e
$s= @s(?(filter isAlpha s))

オンラインでお試しください!

アンダースコアを置き換えるヘルパーとして、および置換文字を生成するヘルパーとして関数$ :: [Char] -> [Char]を定義します。@ :: [Char] [Char] -> [Char]? :: [Char] -> [Char]


i<-:""部品はどのように機能しますか?文字は、加算または追加するときに暗黙的に数値に変換されますか?
ライコニ

@Laikoniいいえ、暗黙的な変換はありません。ただし、Charsを加算および減算できます。
18年


3

R153の 135 113バイト

function(s,S=utf8ToInt(s)){S[S==95]=2^(4:0)%*%matrix(S[S%in%c(65:90,97:122)]<95,5)+97
cat(tolower(intToUtf8(S)))}

オンラインでお試しください!

の使用に関していくつかの警告を発行しますmatrixが、結果に影響はありません。また[<-、デフォルトでは、割り当てにより無関係な割り当て済みオブジェクトが削除されるため、警告が発行されます。

JayCeの改善により40(!)バイトダウン


私はあなたが必要とは思わない,length(L)%/%5
-JayCe

また、Lを定義する必要はありませんか?
JayCe

@JayCeは今日は大丈夫[<-です。インデックスの長さを超えた要素を除外することを学びました...-
ジュゼッペ

私も実際に!
JayCe


3

C(GCC) 111の 109 101 100バイト

編集: @FrownyFrogのコメントごとに小文字を追加。Lynn、Christoph、user5329483の提案に感謝します!

f(s,t,i)char*s,*t;{for(t=s;t=strchr(t,95);*t=i+1)for(i=3;i<64;s++)isalpha(*s)?i=2*i|*s<97,*s|=32:0;}

オンラインでお試しください!


で2バイト節約できますi+=i+(*s<97)
リン

jマーカービットを導入し、iasの2番目を書き換えることで廃止できfor(i=1;i<32;s++)ます。そして、外側の余分な32を補います。ここでは初心者として、7バイトのスペアを数えます。
user5329483

別のバイトが見つかりました:for(i=3;i<96;s++)65を1桁の数字(別名)にし1ます。
user5329483


2

スタックス、22 バイト

â╟▓ïMeee¶▐f◄┴≈┘n╛äyΩ○N

実行してデバッグする

一般的なアプローチは"_"、入力の文字をスライスして各置換文字を計算するコールバック関数を使用する正規表現の置換です。

v       convert to lower case
'_      "_" string literal
{       begin block for regex replacement
  yVl|& all the letters only from the original input
  5/    split into chunks of 5
  i@    keep the ith one, where i is the 0-based number of times this block has run
  {97<m map 5-letter chunk to bits to indicate which are lowercase
  :b    decode as 5-bit integer
  97+]  add 97 and wrap in array to convert to lower case character
}       end block for regex replacement
R       do regex replacement

これを実行する


1

、247バイト

func[s][a: charset[#"a"-#"z"#"A"-#"Z"]v: copy""parse s[any[copy c a(append v to-string c)|
skip]]k: 0 t: copy""repeat n(length? v)/ 5[c: 0 p: 16
loop 5[if v/(k: k + 1) <#"a"[c: c + p]p: p / 2]append t#"a"+ c]foreach c
t[replace s"_"c]lowercase s]

オンラインでお試しください!

より読みやすい:

f: func[s][
    a: charset[#"a"-#"z"#"A"-#"Z"]
    v: copy ""
    parse s[any[copy c a(append v to-string c)| skip]]
    k: 0
    t: copy ""
    repeat n (length? v) / 5[
        c: 0
        p: 16
        loop 5[
            if v/(k: k + 1) < #"a" [c: c + p]
            p: p / 2
        ]
        append t #"a" + c
    ]
    foreach c t[replace s "_" c]
    lowercase s
]

1

Java 10、186バイト

s->{var b="";for(int i=0,c;i<s.length();)if((b+=(c=s.charAt(i++))>64&c<91?1:c>96&c<123?0:"").length()>4)s=s.replaceFirst("_",(char)(97+Byte.valueOf(b,2))+(b=""));return s.toLowerCase();}

オンラインでお試しください。

説明:

s->{                            // Method with String as both parameter and return-type
  var b="";                     //  Binary-String, starting empty
  for(int i=0,c;i<s.length();)  //  Loop over the characters of the input-String
    if((b+=(c=s.charAt(i++))>64&c<91?
                                //   If the current character is a lowercase letter:
            1                   //    Append "1" to the binary-String
           :c>96&c<123?         //   Else-if it's an uppercase letter:
            0                   //    Append "0" to the binary-String
           :                    //   Else (not a letter):
            "")                 //    Append nothing to the binary-String
       .length()>4)             //   And if the length is now 5:
      s=s.replaceFirst("_",     //    Replace the first "_" in the input-String with:
           (char)(97+Byte.valueOf(b,2))
                                //     The binary-String as character
           +(b=""));            //    And reset the binary-String
  return s.toLowerCase();}      //  Return the modified input-String as lowercase


1

Japt、25バイト

r'_@r\L mè\A sTT±5 ÍdIÄÃv

それを試してみてください


説明

r'_                           :Replace underscores
   @                          :Pass each match through a function
    r                         :  From original input remove
     \L                       :    /[^a-zA-Z]/g
        m                     :  Map
         è                    :    Count
          \A                  :      /[A-Z]/g
             s                :  Slice
              T               :    From index T (initially 0)
               T±5            :    To index T+=5
                   Í          :  Convert from base-2 string to base-10 integer
                     IÄ       :  Add 64+1
                    d         :  Get character at that codepoint
                       Ã      :End function
                        v     :Lowercase

1

Pyth、36バイト

Km@Gim!}kGd2c@+r1GGQ5VQp?qN\_.(KZr0N

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

説明

Km@Gim!}kGd2c@+r1GGQ5VQp?qN\_.(KZr0N
             @+r1GGQ                   Get the letters from the input...
            c       5                  ... in chunks of 5.
 m        d                            For each chunk...
     m!}kG                             ... check if each letter is uppercase...
    i      2                           ... converted to binary...
  @G                                   ... and get the corresponding letter.
                     VQp               For each character in the input...
K                       ?qN\_.(KZ      ... if the character is '_', replace it...
                                 r0N   ... otherwise, lowercase it.

1

Python 3.5、296バイト

u=input();f=u.find('_');m=''.join([c for c in u if c.isalpha()]);z=[chr(int(''.join(['0'if o.islower() else'1' for o in l]),2)+65)for l in[m[h:h+5]for h in range(0,len(m),5)]if len(l)==5];[z.insert(v,d)for v,d in enumerate(u[f:])if d!="_"];u=list(u);u[f:]=z[:len(u[f:])];print(''.join(u).lower())

オンラインで試す

最初のコードゴルフ:)

(バイト単位で小さくないことを知っています。1行のコードを作成して楽しんでいただけです)

説明は次のとおりです。


ユーザー入力

u = input()


文字列の最初の_のインデックスを検索して保存します

f = u.find( '_')


すべての非アルファ文字の文字列を取り除きます

m = ''。join([c.isalpha()の場合、uのcに対してc))


アルファ文字列を各要素が5文字で構成される配列に分割します

例 ['THeqU'、 'ICkbr'、 'ownFO'、 'xJUMp'、 'soVEr'、 'thela']

次に、小文字を0に、大文字を1に変換します

例 ['11001'、 '11000'、 '00011'、 '01110'、 '00110'、 '00000']

バイナリ文字列を整数に変換し、65を加算して文字に変換します

例 ['z'、 'y'、 'd'、 'o'、 'g'、 'a']

z = [chr(int( ''。join(['0' if o.islower()else '1' for o for o in l])、2)+65)l for [m [h:h + 5]範囲(0、len(m)、5)のhの場合] len(l)== 5の場合]


最初の_以降のすべての文字を検索し、それぞれの位置(上記で定義)で配列zにそれらをプッシュ

例 ['z'、 'y'、 ''、 'd'、 'o'、 'g'、 '。'、 'a']

[z!insert(v、d)for v、d in enumerate(u [f:])if d!= "_"]


文字列を文字のリストに分割します

u = list(u)


最初の_からリストの最後まで文字列をスライスし、配列zで置き換えます。怠zな犬の例(上記の例の最後にある "a")に余分な文字が含まれているため、配列zを最初の_から最後まで分割文字列の長さにスライスしなければなりませんでした

u [f:] = z [:len(list(u [f:]))]


*回答を印刷*

print( ''。join(u).lower())



ゴルフを楽しむには、すべてを1行に収めるだけではありません。165バイト
ジョーキング

あなたは、間にスペースを削除することができますo.islower()し、else、と私は思う'1'for。また、に変更if d!="_"することもできますif"_"!=dが、上記のコメントはすでにそれを行っています。
ザカリー


1

PowerShell、121バイト

switch -r($args|% t*y){_{$_=$a[$n++]+97}[a-z]{$x+=$x+($_-le96);if(!(++$i%5)){$a+=,$x;$x=0};$_=$_-bor32}.{$r+=[char]$_}}$r

オンラインでお試しください!

少ないゴルフ:

switch -Regex ($args|% toCharArray){
    _ {                     # is underscore
        $_=$a[$n++]+97      # get a char from the array of letter
    }

    [a-z] {                 # is letter
        $x+=$x+($_-le96)    # $x=2*$x+($_-le96)
        if(!(++$i%5)){      # if(++$i%5 -eq 0)
            $a+=,$x         # add an element to the array of letters
            $x=0            # init
        }
        $_=$_-bor32         # to lower
    }

    . {                     # is any char ('_' and letters included)
        $r+=[char]$_        # add the char to result
    }
}
$r

0

Perl 5、78 -pバイト

for$h(s/\W|\d//gr=~y/a-z/0/r=~y/A-Z/1/r=~/.{5}/g){s%_%chr 65+oct"0b$h"%e}$_=lc

オンラインでお試しください!


私はそれをさらに3バイトで修正しました。これにより、現在のルールでは答えが少し良くなります。
Xcali

良くはないが違う。私が理解しているように、各言語+オプションは別々に考慮され、同じ言語+他のオプションと競合することはありません。
msh210
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.