Espaço em branco significativo: ladrões


18

Isso faz parte de um desafio de policiais e ladrões. Vá aqui para a parte da polícia.

Para o objetivo deste desafio, definiremos espaço em branco como apenas feeds de linha (0x0A) e espaços (0x20). Observe que a maioria dos idiomas e tipos de expressões regulares também consideram muitos outros caracteres como espaço em branco, dentro e fora do intervalo ASCII, portanto, talvez você não consiga usar os built-ins correspondentes.

O desafio dos ladrões

A resposta de um policial pode ser quebrada, transformando-a em um programa ou função válida (no idioma escolhido), que executa a tarefa de remover o espaço em branco de uma sequência de entrada, inserindo o espaço em branco no código. Por exemplo, se você recebeu a seguinte entrada:

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

O programa deve gerar

Hello,World!

Após inserir o espaço em branco, a contagem de bytes da solução não deve exceder a contagem de bytes indicada na resposta da policial. Você não precisa encontrar exatamente a mesma solução que o policial pretendia, desde que a sua seja válida pelas restrições acima.

Se você conseguir isso, poste uma resposta com a solução, vinculando-a à resposta do policial e deixe um comentário sobre a resposta do policial voltando para a sua.

O ladrão que consegue mais respostas policiais ganha. Os laços são quebrados pela soma dos tamanhos das respostas dos policiais rachados (a favor do ladrão que racha envios mais longos).

Cada resposta policial pode ser quebrada apenas uma vez e, é claro, você não tem permissão para quebrar sua própria resposta. Se a resposta do policial for inválida antes ou depois de ser quebrada, ela não será contabilizada na pontuação do ladrão.

Respostas:


8

Haskell, 100 bytes, de 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


7

JavaScript ES6, 199 bytes de 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``

Percebi que a divisão "SecretCode"significava que eu estava procurando 11 números que somaram (assumi) 33. Esse é um problema de estrelas e barras, onde o número de espaços são as estrelas e as letras "SecretCode"eram as barras. Eu fiz as contas para ver quantas combinações havia para tentar (1.917.334.783 combinações) e decidi usar apenas força bruta, levou o dia todo.

Provavelmente existe uma maneira mais inteligente de fazer isso, por exemplo, percebendo que kdeve ser 33e 66para os índices 10 e 21, respectivamente, mas sou preguiçoso.


Ei, muito bem! ;-)
Arnauld

2
$/**/=/[ \n]/;s['sp'+'lit']($)... Oh, isso é sujo.
Patrick Roberts

No caso de alguém estar curioso sobre a minha tentativa de força bruta, foi pastebin.com/aN9Z1jVM
Patrick Roberts

6

C, 475 bytes por 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}

Eu poderia começar a usar alguns desses define :)

Após o pré-processador, o código se parece com isso:

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

Uau! Bom trabalho. Eu estava com problemas para ler até o final e escrevi.
Rexroni

@rexroni #defineabome jogou fora por um tempo. No começo, eu pensei que tinha que ser o #define ab oque apenas adicionaria alguns ;s extras , mas isso não funcionou perto do fim.
Riley

sim, que foi escolhido especificamente para tornar mais difícil :)
rexroni

5

Ruby, 86 bytes + 1 sinalizador = 87 por histocrat

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

Isso foi realmente divertido, cada caractere na sequência passada evalé substituído pelo código de caractere ( ord) XORed ^(...)contra o número de espaços restantes na sequência. O código resultante é:

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

4

RprogN, de Ataco

Isso parece fazer o truque

' ' ` R
"
" ` R

Eu acidentalmente golfed enquanto rachaduras haha, até 14 bytes
Alfie Goodacre

Estou realmente curioso como você jogou.
ATaco

@ATaco, o programa tem apenas 14 bytes. Você contou um avanço de linha à direita ou algo assim?
Martin Ender


@ATaco eu estava errado, eu não podia novas linhas de teste sobre o compilador online, que por sua vez me levou a pensar que estava trabalhando, mas eu tinha removido o lf literal
Alfie Goodacre

4

V, 37 bytes, por DJMcMayhem

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

Não imprimíveis:

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

TryItOnline

O que ürealmente me impressionou, fiquei esperando tanto e îser comandos.

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 traduz para :%s/ \|\n//gin vim, que remove globalmente todo o espaço em branco. O Ícomando está no wiki e o üe îare |e nrespectivamente com seu conjunto de bits alto


Bom trabalho! Essa é a solução exata que eu tive. :)
DJMcMayhem

3

C, 140 bytes por 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();}}

(Também espero estar fazendo isso direito.)


Ninja'd me por um minuto!
Kritixi Lithos

@KritixiLithos Same, estava prestes a submeter quando este anwer apareceu ^^
Denker

3

MATL, 22 bytes por Luis Mendo

Embora eu não tenha certeza do porquê, isso parece funcionar

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

Vou ter que ver se consigo descobrir o que está fazendo. Imaginei que os comentários deviam ter feeds de linha depois deles e, em seguida, era apenas uma questão de colocar os espaços nos pontos corretos.


Bom, uma acrescentei uma explicação parcial na minha resposta :)
Stewie Griffin

1
@ StewieGriffin, obrigado pela explicação. Eu estava tentando entender por que funcionava, mas estava indo devagar. Documentos muito abrangentes Luis :)
MickyT

1
@MickyT Você quer dizer verboso como Java :-P Bom trabalho de craqueamento!
Luis Mendo

3

MATL, 22 21 bytes de Luis Mendo.

Finalmente ... MickyT decifrou enquanto eu escrevia uma explicação, então a resposta dele é a "válida". Eu postei isso de qualquer maneira, de acordo com este meta post .


Me Ysão desnecessários e são comentados. Basta adicionar 4 caracteres de espaço em branco, não 5.

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

Isso é equivalente ao mais compacto :

t' @ *'dm7dw(

Explicação parcial:

         % 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

Bom trabalho de craqueamento!
Luis Mendo

2
Obrigado :) Eu não sabia nada sobre o MATL antes de começar ... Acho que minha explicação não está totalmente correta (mas deve estar bem próxima?). Demorei muito tempo, desde que o 1e5impresso 100000, ou 1eera um telefonema reshape, mas então o que era 5? (Vejo agora que o item %está no final da linha, não seria 5Mum cinco e um M. Além disso, eu pensei que tinha que ter Y(uma linha. No final das contas, um ótimo tutorial sobre MATL :)
Stewie Griffin

A explicação está totalmente correta :-) Sim, é uma maneira boa (embora um pouco difícil) de começar com um idioma.
Luis Mendo

2

Befunge-98, 65 bytes por ninjalj

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

Experimente online!

Isso foi muito divertido. Deduzi que, uma vez que existem poucos comandos de mudança de direção e nenhum ^<[]?xou similar, ele precisa usar quebra automática. Eu então escrevi um script Python para ajudar a obter o espaçamento correto para os j.

O código funciona pegando input ( ~) e duplicando-o duas vezes ( ::). Subtrai 10 ( ':'0ou ord(':') - ord('0')) e 32 ( '[';ou ord('[') - ord(';')). Em seguida, o segundo resultado é logicamente negado (1 se houver espaço, 0 caso contrário) e um 8 é pressionado.

Agora vem a parte que precisava descobrir o que pular. O 1+!é ignorado continuando para a próxima linha. #pula o@ . O resultado logicamente negado (0 ou 1) é multiplicado pelo 8 e 1 é adicionado.

O código então salta muitos (ou seja, 1 ou 9) espaços mais um extra à medida que o IP se move. Se o personagem não era um espaço, acaba no !. O código de caractere menos 10 é negado logicamente (1 se for nova linha, 0 caso contrário).jdepois, não pula nada, e print ( ,) é chamado e o loop é retomado envolto verticalmente.

Se o caractere for um espaço, a linha inferior será repetida novamente 32, 22como parte inferior da pilha. O primeiro jsalta 705 espaços. Então a linha volta pela terceira vez. Se houver mais de dois 10 na pilha (o código apenas os deixa), o primeiro jsalta 100 espaços e o loop se repete. Caso contrário, o primeiro jpula para !, um zero é negado, o segundoj pula sobre a impressão e o programa continua.

Eu consegui jogar até 59 bytes.


Listar o número do policial no seu cabeçalho é bom (já que o desempatador recompensa tamanhos maiores de qualquer maneira).
Martin Ender

2

C # 6, 201 bytes, por leite

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

trueJoinnão está definido, então só string.Concat()resta.
pé "\n". p[0]^32^10é espaço. Teria sido (um pouco) mais difícil se é p[0]^42ou outras constantes semelhantes.


Conforme comentado nos leites, responda que isso precisa de C # 6+, se eles mudarem, você também pode?
TheLethalCoder

2

reticular, 43 bytes, de Conor O'Brien

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

Experimente online!

Isso foi mais difícil para mim do que deveria, porque eu era burra demais para encontrar a documentação e acabei tendo que adivinhar como alguns dos comandos funcionavam. Portanto, algumas dessas explicações podem não ser totalmente precisas, mas esse foi meu entendimento básico do código.

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.

Existem documentos no wiki do github.
Conor O'Brien

boa ideia! E impressionante que você tenha feito isso sem o wiki: D
Conor O'Brien

1

C #, 159 bytes por 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

A sequência no final da linha 1 é " \n"(espaço + nova linha).

/*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 bytes por Kritixi Lithos

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

Explicação

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

Bem feito em quebrá-lo! Eu esperava que os Comissos fossem confusos, mas um bom trabalho!
Kritixi Lithos

@KritixiLithos, para ser honesto, depois que eu dividi as camadas e percebi que a maior parte do trabalho foi feito na camada superior, ficou mais fácil. Eu aprendi um pouco sobre o idioma fazendo isso, então obrigado :) #
MickyT 19/12/16
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.