重要な空白:強盗


18

これは警官と強盗の挑戦の一部です。警官の役のためにここ行ってください

この課題のために、空白をラインフィード(0x0A)とスペース(0x20)のみとして定義します。ほとんどの言語と正規表現フレーバーは、ASCII範囲の内側と外側の両方で、他の多くの文字も同様に空白と見なすため、対応するビルトインを使用できない場合があります。

強盗の挑戦

警官の答えは、コードに空白を挿入することにより、入力文字列から空白を削除するタスクを実行する有効なプログラムまたは関数(選択した言語)に変換することで解読できます。たとえば、次の入力を受け取った場合:

H e l l o,
 W o r l  d!

プログラムは出力するはずです

Hello,World!

空白を挿入した後、ソリューションのバイトカウントは、警官の回答に記載されているバイトカウントを超えてはなりません。上記の制約によって有効である限り、意図した警官とまったく同じ解決策を見つける必要はありません。

これを管理する場合は、ソリューションに回答を投稿し、警官の回答にリンクし、警官の回答にコメントを残して自分にリンクします。

最も警官に答える強盗が勝ちます。ひびの入った警官の回答のサイズの合計によって関係が壊れます(より長い提出物をひっくり返す強盗に有利に)。

各警官の答えは1回しか解読できません。もちろん、自分の答えを解読することはできません。警官の答えがクラッキングされる前または後に無効であることが判明した場合、強盗のスコアにはカウントされません。

回答:


8

Haskell、100バイト、ライコニ作

main=interact$id doid lines id words 
doid oi d o id=do
 iddoid<-do oi id
 oid<-do o iddoid
 do d oid


7

JavaScript ES6、Arnauldによる 199バイト

s=>eval(atob`ISYgJiAtOkI8Qk97BRBeaxZFShoUZSsiOGkMenNy`.replace(/./g,(c,i)=>String.fromCharCode(c.charCodeAt()^(k+="     S    e c  r   e t     C    o   d  e   ".split(/\w/)[i%11].length)),k=0)).join``

分割"SecretCode"は、合計で33になった11個の数字を探していることを意味することに気づきました。これは星と棒の問題"SecretCode"です。試してみた組み合わせの数(1,917,334,783の組み合わせ)を確認するために計算を行い、それをブルートフォースにすることに決めました。

そこそれについてなくなったのは、よりスマートな方法は、インスタンス気付かため、おそらくだkことがある3366、それぞれのインデックス10と21のために、私は怠け者です。


やあ、よくやった!;-)
Arnauld

2
$/**/=/[ \n]/;s['sp'+'lit']($)...ああ、それは汚いです。
パトリックロバーツ

誰かが私の総当たり攻撃に興味がある場合、pastebin.com / aN9Z1jVM
Patrick Roberts

6

C、rexroniによる 475バイト

#include<unistd.h>
#define a char
#define b *
#define c write
#define d stdin
#define e stdout
#define f read
#define g (
#define h )
#define i while
#define j if
#define k 0
#define l &
#define m ,
#define n =
#define o ;
#define p 1
#define gpml ml h
#define abo
#define ml d m p
#define jg d o abo
#define lb abo d
#define gf h abo c
#define jgm b e n
#define pml f g
#define gpm lb
int main(){a jg a jgm l jg i g pml k m l gpml h j g d!=' '&&gpm!='\n'gf g p m l gpml o}

私はこれらの定義のいくつかを使い始めるかもしれません:)

プリプロセッサの後、コードは次のようになります。

int main(){
    char stdin;
    char *stdout = &stdin;
    while(read(0, &stdin, 1))
        if(stdin !='' && stdin!='\n')
            write(1, &stdin, 1);
}   

うわー!よくできました。私は最後までそれを読むのに苦労さえしていました、そして、私はそれを書きました。
rexroni 16

@rexroni #defineaboはしばらく私を追い払った。最初は、#define ab o余分な;sを追加するだけだと思っていましたが、終わり近くでは機能しませんでした。
ライリー

はい、それは特に難しくするために選択されました:)
rexroni

5

ルビー、86バイト+ 1つのフラグ= 87 histocratによって

eval"( T $ }{(! // ; : 67 8 ? 32. && )".gsub(/ |(.)/){$1&&$&.ord.^($'.count(' ')).chr}

これは本当に楽しかったです。渡された文字列の各文字は、文字列の残りのスペースの数に対してXORさevalれた文字コード(ord)に置き換えられ^(...)ます。結果のコードは次のとおりです。

$_.tr!(''<<32<<10,'')

4

RprogN、アタコ

これはトリックを行うようです

' ' ` R
"
" ` R

14バイトにダウン、ハハ割れながら、私は誤ってそれをgolfed
アルフィーGoodacre

私はあなたがそれをどのようにゴルフしたか本当に興味があります。
アタコ16

@ATacoプログラムはわずか14バイトです。後続の改行などをカウントしましたか?
マーティンエンダー


今度は私はそれが働いていたと思わせたが、私はLFリテラルを削除していたオンラインコンパイラの@ATaco私が間違っていた、私はできませんテスト改行、
アルフィーGoodacre

4

V、37バイト、DJMcMayhem作

O     VrS200@"kIi|D@"A üî|D@"

印刷できないもの:

O     <esc>Vr<C-a>S200<esc>@"kIi<C-v><C-v><esc>|D@"<esc>A üî<esc>|D@"

TryItOnline

ü本当に私は両方にそれを期待して保管して、ループのために私を投げたîコマンドであることを。

O                 # Insert 5 spaces above this line
Vr<C-a>           # Change them all to <C-a>
S200<esc>         # Replace the line with 200
@"                # Play back the 5 <C-a>'s, 200 -> 205
k                 # ????
Ii<C-v><C-v><esc> # insert "i<C-v>" so our line is now "i<C-v>205"
|D@"<esc>         # Delete the line and then run it, which inserts "Í" (ASCII 205)
A üî<esc>         # Append " üî" so our line is "Í üî"
|D@"              # Delete the line and run it

Í üîin V :%s/ \|\n//gはinmに変換され、すべての空白がグローバルに削除されます。Íコマンドは、ウィキにあり、かつüîしている|n、それぞれ最上位ビットがセットされて


よくやった!それが私が持っていた正確な解決策です。:)
DJMcMayhem

3

C、betsegによる 140バイト

#include<stdio.h>
int main(){int a=getchar();while(a!=EOF){//\a=getchar();
if(a!=10&&a!=32)//\\putchar(a^10^32);
putchar(a);a=getchar();}}

(私もこれを正しくやっていることを願っています。)


忍者は1分で私をやった!
Kritixi Lithos

同じ@KritixiLithos、このanwerが^^ポップアップ時に提出することをちょうど約だった
Denker

3

MATL、Luis Mendoによる 22バイト

理由はわかりませんが、これはうまくいくようです

t' @ * 'dm1e5%M
dw%Y
(

私はそれが何をしているのかを解決できるかどうかを確認する必要があります。コメントの後に改行が必要だと思いましたが、それはスペースを正しい場所に置くだけの問題でした。


いいですね、+ 1回答に部分的な説明を追加しました:)
Stewie Griffin

1
@StewieGriffin、説明ありがとう。私はそれがうまくいった理由で仕事をしようとしていましたが、ゆっくりと進んでいました。非常に包括的なドキュメントLuis :)
MickyT

1
@MickyT Javaのような冗長を意味します:-Pすばらしいクラッキング作業です!
ルイスメンドー

3

MATL、22 21バイト(Luis Mendo作)。

最後に...説明を書いている間にMickyTがそれをクラックしたので、彼の答えは「有効な」ものです。このメタ投稿に従って、とにかくこれを投稿しました


MそしてY不要であり、コメントアウトされています。5ではなく4つの空白文字を追加するだけで十分です。

t' @ *'dm1e5%M
dw%Y
(

これは、よりコンパクトなものと同等です:

t' @ *'dm7dw(

部分的な説明:

         % Implicit input
t        % Duplicate input
' @ *'   % String with ASCII-values [32   64   32   42]
d        % diff, giving [32  -32   10], 32 is space, 10 is newline
m        % ismember, checking if the character is 32 or 10
1e5      % 10000, but could just as well be 7
d        % Taking the diff of the scalar 1e5, returning an empty matrix []
w        % Swap stack in order to use ( below
(        % Equivalent to x(y)=[], where x is the input string, and y is the logical
         % vector found using ismember (m)
         % Implicit output

いい分解作業!
ルイスメンドー

2
ありがとう:)私は開始する前にMATLについて何も知りませんでした ...私は私の説明が完全に正しいわけではないと思います(しかしかなり近いはずですか?)。が1e5印刷された100000、または1eへの呼び出しだったので、私には長い時間がかかりましたreshapeが、その後はどうでした5か?(今%は行末にあるので5M、5 行ではなく5行になりますM。また、Y(1行で行かなければならないと思いました。全体として、非常に素晴らしいMATLチュートリアル:)
Stewieグリフィン

説明は全く正しいです:-)方法言語を開始する(少しだけハードがあれば)はい、それは良いのだ
ルイスMendo

2

Befunge-98、ninjaljによる 65バイト

~v       >#@
 >::':'0--\'[';--!8v1+!
*1+j  !j,v         >#@

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

これはとても楽しかったです。方向を変えるコマンドはほとんどなく、^<[]?xか類似しているため、ラッピングを使用する必要。次に、の間隔を正しくするためのPythonスクリプトを作成しましたj

コードは、入力(~)を取得し、それを2回複製()することで機能し::ます。次に10を減算します(':'0またはord(':') - ord('0'))と32('[';またはord('[') - ord(';'))をます。次に、2番目の結果が論理的に否定され(スペースの場合は1、そうでない場合は0)、8がプッシュされます。

次に、何をスキップするかを理解する必要がある部分が来ます。の1+!次の行に継続することによってスキップされます。#をスキップし@ます。論理的に否定された結果(0または1)に8が乗算され、1が加算されます。

コードは、IPの移動に応じて、その数(つまり1または9)のスペースと1つの余分なスペースをジャンプします。文字がスペースではなかった場合、それはで終わり!ます。文字コードから10を引いたものは論理的に否定されます(改行の場合は1、そうでない場合は0)。jその後、何もスキップせず、print(,)が呼び出され、垂直方向に折り返してループが再開されます。

文字がスペースの場合、ボトムライン32, 22はスタックのボトムとして再びループします。最初のjジャンプ705スペース。その後、回線は3回ループします。スタックに2個以上の10が残っている場合(コードはそれらを残すだけです)、最初のコードjは100個のスペースをジャンプし、ループが繰り返されます。それ以外の場合、最初にjジャンプします!ゼロが否定され、2番目jが印刷を飛び越えてプログラムが続行します。

なんとか59バイトまでゴルフできました。


ヘッダーに警官の番号をリストするのは問題ありません(タイブレーカーはとにかく大きなサイズに報いるからです)。
マーティンエンダー

2

C#6、201バイト、ミルク

using System.Linq;
_=>string./**/
#if trueJoin
(/*"*//*/""/**//*/"*/",
#else
Concat(//*/,
#endif
from m in" "let p=$@"{@" 
"[1]}"from i in(_.Replace(p,@""))where!new[]{p[0]^32^10}.Contains(i)select@i);

repl.itデモ

trueJoin定義されていないため、string.Concat()残ります。
pです"\n"p[0]^32^10スペースです。それp[0]^42または他の同様の定数であれば、(少し)より困難でした。


牛乳の答えについてコメントしたように、これにはC#6+が必要ですが、彼らがそれを変えるならあなたもできますか?
TheLethalCoder 16

2

網状、43バイト、コナー・オブライエン

ISBqv<>>$$4j
E :d/v$v?
c+91d/ v?E
;!?l$/o $

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

愚かすぎてドキュメントを見つけることができず、コマンドの一部がどのように機能するかを推測しなければならなかったため、これは思っていたよりも困難でした。したがって、この説明の一部は完全に正確ではないかもしれませんが、これはコードの私の基本的な理解でした。

I               Push all the input on to the stack as a string
 S              Convert it into a character array.
  B             Turns that array into individual characters on the stack.
   q            Reverse the stack so the first letter is on top.
    v           Move down... 
    /           ...and turn left.
E :d            Duplicate the value and test if equal to space.

       v?       If it is a space we move down until we wrap to the top.
       >$$      Drop the test result and the space.
          4j    Jump over the next 4 commands (having wrapped to the start).
    v           Bringing us back to the first down arrow, ready to test the next char.

     v$         If it wasn't a space, drop the test result and move down.
c+91d/          Turn left and push a newline (char 10) on to the stack.
       v?E      If equal, we go down, following the same path as with the space.

     /          If not equal, turn down.
   l$/          Then turn left, drop the test result, and push the stack size.
;!?             If zero (the stack is empty) we terminate.
        o$      Otherwise wrap around, drop the stack size, and output the char. 
     /          Then turn down wrapping around to the top of the program.
    v<          Then turn left and down to start the process from the beginning again.

github wikiにドキュメントがあります。
コナーオブライエン

良いアイデア!wikiなしでこれを行ったのは印象的です:D
コナーオブライエン

1

C#、LethalCoderによる 159バイト

using System.Linq;s=>string.Join("",string.Join("",s.Split(@" 
".Replace(new string((char)0x0D,1),"").ToCharArray())).Select(c=>c+""!=""?c+"":"").ToArray());

repl.it

1行目の最後の文字列は" \n"(スペース+改行)です。

/*Func<string, string> Lambda =*/ s =>
    string.Join("",                                                           // No-op
    string.Join("",                                                           // Join (without whitespace)
        s.Split(@" \n".Replace(new string((char)0x0D,1),"").ToCharArray())    // Split on whitespace
    ).Select(c=>c+""!=""?c+"":"").ToArray());                                 // No-op

1

Minkolang v0.15、88バイトKritixiのLithosによって

$oI[dd" "=$r'10'=1J,? 1R]r$O3.14
$$$
Cdollars             >
$$$
Ceverywhere           >x

説明

                               # Layer 1
$o                             # input chars onto stack
  I                            # stack length pushed to stack
   [                    ]      # loop popped TOS times (length of string)
    dd                         # duplicate, duplicate
      " "                      # push space to stack
         =                     # equality check
          $r                   # swap
            '10'               # number 10 to stack (LF char)
                =              # equality
                 1J            # or
                   ,           # not
                    ?          # if true jump next
                               # drop to layer 2
                      1R       # rotates the stack 1 time
                         r     # reverse the stack
                          $O   # output the stack
                             . # stop
$$$                            # Layer 2
                     >         # shift right and then drop to layer 3
$$$                            # Layer 3
                      >x       # shift right, pop char off stack and drop to Layer 1 (end loop)

それをクラッキングすることでよくやった!C混乱が混乱を招くことを期待していましたが、それでも素晴らしい仕事です!
Kritixi Lithos

@KritixiLithosは、レイヤーを分割し、ほとんどの作業が最上位レイヤーで行われたことに気付いた後、正直に言うと簡単になりました。私はこれを行う言語について少し学んだので、ありがとう:)
MickyT
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.