Ruang Putih Signifikan: Perampok

18

Ini adalah bagian dari tantangan Polisi dan Perampok. Buka di sini untuk bagian polisi.

Untuk tujuan tantangan ini, kami akan mendefinisikan spasi putih sebagai hanya baris baris (0x0A) dan spasi (0x20). Perhatikan bahwa sebagian besar bahasa dan rasa regex mempertimbangkan banyak karakter lain sebagai spasi putih, baik di dalam maupun di luar rentang ASCII sehingga Anda mungkin tidak dapat menggunakan built-in yang sesuai.

Tantangan Perampok

Jawaban polisi dapat di-crack dengan mengubahnya menjadi program atau fungsi yang valid (dalam bahasa yang dipilih), yang melakukan tugas menghilangkan spasi putih dari string input, dengan memasukkan spasi putih ke dalam kode. Misalnya jika Anda menerima input berikut:

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

Program harus menampilkan

Hello,World!

Setelah memasukkan spasi putih, jumlah byte dari solusi tidak boleh melebihi jumlah byte yang dinyatakan dalam jawaban polisi. Anda tidak harus menemukan solusi yang sama persis seperti yang dimaksudkan oleh polisi, asalkan milik Anda valid oleh kendala di atas.

Jika Anda mengelola ini, posting jawaban dengan solusi, tautkan ke jawaban polisi, dan tinggalkan komentar pada jawaban polisi yang menghubungkan kembali ke jawaban Anda.

Perampok yang memecahkan sebagian besar jawaban polisi menang. Ikatan rusak oleh jumlah ukuran jawaban polisi yang retak (mendukung perampok yang retak pengiriman lagi).

Setiap jawaban polisi hanya dapat dipecahkan satu kali, dan tentu saja, Anda tidak diizinkan untuk memecahkan jawaban Anda sendiri. Jika jawaban polisi ternyata tidak valid sebelum atau setelah retak, itu tidak dihitung terhadap skor perampok.

Martin Ender
sumber

Jawaban:

8

Haskell, 100 byte, oleh Laikoni

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

> <>, 40 byte, oleh DanTheMan

v <<
i/\
:=
:
:a?
0/>/
1?o
-=
="
?
;"
>^

Sangat menyenangkan untuk berolahraga.

Cobalah bahasa> <>

Pelican teal
sumber
Kerja bagus! Saya senang Anda menikmati memecahkannya.
DanTheMan
7

JavaScript ES6, 199 byte oleh Arnauld

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``

Saya menyadari pemisahan "SecretCode"berarti saya sedang mencari 11 angka yang dijumlahkan (saya berasumsi) 33. Ini adalah masalah bintang dan bar di mana jumlah ruang adalah bintang dan huruf-huruf di dalamnya "SecretCode"adalah bar. Saya melakukan matematika untuk melihat berapa banyak kombinasi yang harus dicoba (1,917,344,783 kombinasi) dan memutuskan untuk memaksakannya, butuh waktu seharian.

Mungkin ada cara yang lebih cerdas untuk melakukannya, misalnya memperhatikan bahwa kharus 33dan 66untuk indeks 10 dan 21 masing-masing, tapi saya malas.

Sluck49
sumber
Hei, bagus sekali! ;-)
Arnauld
2
$/**/=/[ \n]/;s['sp'+'lit']($)... oh, itu kotor.
Patrick Roberts
Jika ada yang ingin tahu tentang upaya brute force saya, itu pastebin.com/aN9Z1jVM
Patrick Roberts
6

C, 475 byte oleh rexroni

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

Saya mungkin mulai menggunakan beberapa definisi ini :)

Setelah pra-prosesor, kode tersebut terlihat seperti ini:

int main(){
    char stdin;
    char *stdout = &stdin;
    while(read(0, &stdin, 1))
        if(stdin !='' && stdin!='\n')
            write(1, &stdin, 1);
}   
Riley
sumber
Wow! Kerja bagus. Saya bahkan mengalami kesulitan membacanya pada akhirnya, dan saya menulisnya.
rexroni
@rexroni #defineabomengusir saya sebentar. Pada awalnya saya pikir itu harus #define ab oyang hanya akan menambahkan beberapa ;s, tapi itu tidak berhasil menjelang akhir.
Riley
ya, itu secara khusus dipilih untuk membuatnya lebih sulit :)
rexroni
5

Ruby, 86 byte + 1 bendera = 87 oleh histokrat

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

Ini sangat menyenangkan, setiap karakter dalam string yang diteruskan evaldiganti dengan kode karakter ( ord) XOR ^(...)terhadap jumlah spasi yang tersisa dalam string. Kode yang dihasilkan adalah:

$_.tr!(''<<32<<10,'')
Dom Hastings
sumber
4

RprogN, oleh Ataco

Ini tampaknya berhasil

' ' ` R
"
" ` R
MickyT
sumber
Saya tidak sengaja bermain golf sambil memecahkan haha, turun menjadi 14 byte
Alfie Goodacre
Saya benar-benar ingin tahu bagaimana Anda bermain golf.
ATaco
@ATaco program ini hanya 14 byte. Apakah Anda menghitung linefeed tambahan atau sesuatu?
Martin Ender
@ATaco Saya salah, saya tidak bisa menguji baris baru pada kompiler online, yang pada gilirannya menyebabkan saya berpikir itu berfungsi tetapi saya telah menghapusnya secara literal
Alfie Goodacre
4

V, 37 byte, oleh DJMcMayhem

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

Tidak dapat dicetak:

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

TryItOnline

üBenar - benar melemparkan saya untuk satu putaran, saya terus berharap itu dan îmenjadi perintah.

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

Í üîdalam V diterjemahkan ke :%s/ \|\n//gdalam vim, yang secara global menghapus semua spasi putih. The Íperintah di wiki, dan üdan îyang |dan nmasing-masing dengan bit set tinggi

nmjcman101
sumber
Kerja bagus! Itulah solusi tepat yang saya miliki. :)
DJMcMayhem
3

C, 140 byte oleh betseg

#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();}}

(Saya juga berharap saya melakukan ini dengan benar.)

Riley
sumber
Ninja beri saya satu menit!
Kritixi Lithos
@KritixiLithos Sama, baru saja akan mengirimkan ketika pertanyaan ini muncul ^^
Denker
3

MATL, 22 byte oleh Luis Mendo

Meskipun saya tidak yakin mengapa, ini sepertinya berhasil

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

Saya harus melihat apakah saya bisa mengetahui apa yang dilakukannya. Saya menduga bahwa komentar harus memiliki umpan garis setelah mereka dan kemudian hanya masalah mendapatkan ruang di tempat yang benar.

MickyT
sumber
Bagus, +1 Saya menambahkan sebagian penjelasan dalam jawaban saya :)
Stewie Griffin
1
@StewieGriffin, terima kasih atas penjelasannya. Saya mencoba untuk bekerja mengapa itu berhasil, tetapi berjalan lambat. Dokumen Luis yang sangat komprehensif :)
MickyT
1
@MickyT Maksudmu verbose seperti Java :-P Kerja crack yang bagus!
Luis Mendo
3

MATL, 22 21 byte oleh Luis Mendo.

Akhirnya ... MickyT memecahkannya ketika saya sedang menulis penjelasan, jadi jawabannya adalah yang "valid". Saya tetap memposting ini, sesuai dengan meta postingan ini .


Mdan Ytidak perlu dan dikomentari. Cukup menambahkan 4 karakter spasi, bukan 5.

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

Ini setara dengan yang lebih ringkas :

t' @ *'dm7dw(

Penjelasan sebagian:

         % 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
Stewie Griffin
sumber
Kerja retak yang bagus!
Luis Mendo
2
Terima kasih :) Saya tidak tahu apa - apa tentang MATL sebelum saya mulai ... Saya kira penjelasan saya tidak sepenuhnya benar (tetapi harus cukup dekat?). Butuh waktu lama bagi saya, karena yang 1e5dicetak 100000, atau 1epanggilan reshape, tapi lalu apa 5? (Saya melihat sekarang bahwa %ini ada di akhir baris, jadi itu akan menjadi 5M, bukan lima dan satu M. Juga, saya pikir saya harus memiliki Y(satu baris. Semua dalam semua, tutorial MATL yang sangat bagus :)
Stewie Griffin
Penjelasannya benar-benar benar :-) Ya, ini cara yang baik (jika hanya sedikit sulit) untuk memulai dengan sebuah bahasa
Luis Mendo
2

Befunge-98, 65 bytes oleh ninjalj

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

Cobalah online!

Ini sangat menyenangkan. Saya menyimpulkan bahwa karena ada beberapa perintah yang mengubah arah dan tidak^<[]?x atau serupa, itu harus menggunakan pembungkus. Saya kemudian menulis skrip Python untuk membantu mendapatkan spasi yang tepat untuk j's.

Kode berfungsi dengan mengambil input ( ~) dan menggandakannya dua kali ( ::). Ini kemudian mengurangi 10 ( ':'0atauord(':') - ord('0') ) dan 32 ( '[';atau ord('[') - ord(';')). Kemudian, hasil kedua dinegasikan secara logis (1 jika ruang, 0 sebaliknya) dan 8 didorong.

Sekarang tiba bagian yang perlu mencari tahu apa yang harus dilewati. Itu1+! dilewati dengan melanjutkan ke baris berikutnya. #melompati @. Hasil yang dinegasikan secara logis (0 atau 1) dikalikan dengan 8, dan 1 ditambahkan.

Kode kemudian melompati banyak (yaitu 1 atau 9) spasi plus satu ekstra saat IP bergerak. Jika karakter itu bukan spasi itu berakhir di! . Kode karakter minus 10 dinegasi secara logis (1 jika baris baru, 0 sebaliknya). jkemudian melewatkan apa-apa, dan print ( ,) dipanggil dan loop dilanjutkan dengan membungkus secara vertikal.

Jika karakternya adalah spasi, garis bawah akan berputar lagi dengan 32, 22bagian bawah tumpukan. Yang pertama jmelompat 705 spasi. Kemudian garis itu loop untuk ketiga kalinya. Jika ada lebih dari dua 10 yang tersisa di tumpukan (kode hanya meninggalkan yang), yang pertama jmelompat 100 spasi dan mengulangi lingkaran. Kalau tidak, yang pertama jmelompat ke !, nol dinegasikan, yang kedua jmelompati cetakan dan program berlanjut.

Saya berhasil menurunkannya menjadi 59 byte.

PurkkaKoodari
sumber
Daftar jumlah polisi di header Anda baik-baik saja (karena tiebreak memberi hadiah ukuran yang lebih besar).
Martin Ender
2

C # 6, 201 byte, oleh susu

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

demo repl.it

trueJointidak didefinisikan, jadi hanya string.Concat()tersisa.
padalah "\n". p[0]^32^10adalah ruang. Akan (sedikit) lebih sulit jika itu p[0]^42atau konstanta serupa lainnya.

Tautan Ng
sumber
Seperti yang dikomentari pada susu menjawab ini membutuhkan C # 6+, jika mereka mengubahnya, bisakah Anda juga?
TheLethalCoder
2

reticular, 43 byte, oleh Conor O'Brien

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

Cobalah online!

Ini lebih sulit bagi saya daripada seharusnya karena saya terlalu bodoh untuk menemukan dokumentasi dan akhirnya harus menebak bagaimana beberapa perintah bekerja. Jadi beberapa penjelasan ini mungkin tidak sepenuhnya akurat, tetapi ini adalah pemahaman dasar saya tentang kode tersebut.

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.
James Holderness
sumber
Ada dokumen di wiki github.
Conor O'Brien
ide bagus! Dan mengesankan bahwa Anda melakukan ini tanpa wiki: D
Conor O'Brien
1

C #, 159 byte oleh LethalCoder

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

repl.it

String di akhir baris 1 adalah " \n"(spasi + baris baru).

/*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
susu
sumber
1

Minkolang v0.15, 88 bytes oleh Kritixi Lithos

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

Penjelasan

                               # 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)
MickyT
sumber
Bagus sekali dalam memecahkannya! Saya berharap Ckelalaian akan membingungkan, tetapi pekerjaan yang baik tetap!
Kritixi Lithos
@KritixiLithos sejujurnya begitu saya membelah lapisan dan menyadari bahwa sebagian besar pekerjaan dilakukan di lapisan atas, itu menjadi lebih mudah. Saya belajar sedikit tentang bahasa yang melakukan hal ini, jadi terima kasih :)
MickyT