Znaczące białe znaki: Rabusie

18

Jest to część wyzwania dotyczącego gliniarzy i rabusiów. Idź tutaj po część gliniarzy.

Na potrzeby tego wyzwania zdefiniujemy białe znaki jako tylko linie (0x0A) i spacje (0x20). Zauważ, że większość języków i smaków wyrażeń regularnych uważa również wiele innych znaków za spacje, zarówno wewnątrz, jak i poza zakresem ASCII, więc możesz nie być w stanie skorzystać z odpowiednich wbudowanych funkcji.

Wyzwanie rabusiów

Odpowiedź policjanta można złamać, przekształcając go w prawidłowy program lub funkcję (w wybranym języku), która wykonuje zadanie usuwania białych znaków z ciągu wejściowego, wstawiając białe znaki do kodu. Na przykład, jeśli otrzymałeś następujące dane wejściowe:

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

Program powinien wyjść

Hello,World!

Po wstawieniu białych znaków liczba bajtów rozwiązania nie może przekraczać liczby bajtów podanej w odpowiedzi policjanta. Nie musisz znaleźć dokładnie tego samego rozwiązania, jakie zamierzał policjant, o ile twoje jest zgodne z powyższymi ograniczeniami.

Jeśli poradzisz sobie z tym, opublikuj odpowiedź z rozwiązaniem, łącząc się z odpowiedzią policjanta, i zostaw komentarz na temat odpowiedzi policjanta z powrotem do twojej.

Złodziej, który łamie najwięcej odpowiedzi gliniarzy, wygrywa. Więzy są zerwane przez sumę rozmiarów odpowiedzi na złamane gliny (na korzyść rabusia, który pęka z dłuższych postów).

Każdą odpowiedź gliniarza można złamać tylko raz i oczywiście nie wolno ci złamać własnej odpowiedzi. Jeśli odpowiedź gliniarza okaże się nieprawidłowa przed lub po pęknięciu, nie jest liczona do wyniku rabusia.

Martin Ender
źródło

Odpowiedzi:

8

Haskell, 100 bajtów, autor: 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
źródło
7

> <>, 40 bajtów, autor DanTheMan

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

Naprawdę fajnie się ćwiczy.

Wypróbuj w języku> <>

Pelikan turkusowy
źródło
Dobra robota! Cieszę się, że podobało ci się to.
DanTheMan
7

JavaScript ES6, 199 bajtów autorstwa 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``

Uświadomiłem sobie, że podział "SecretCode"oznaczał, że szukałem 11 liczb, które zsumowały się (przypuszczałem) 33. Jest to problem dotyczący gwiazd i słupków, w którym liczba spacji to gwiazdy, a litery w "SecretCode"nich to słupki. Zrobiłem matematykę, aby zobaczyć, ile mignięć było do wypróbowania (1 917 334 783 kombinacji) i zdecydowałem się na brutalną siłę, zajęło to cały dzień.

Nie ma chyba lepszy sposób, aby poszły o tym, na przykład zauważyć, że kmusi być 33i 66dla indeksu odpowiednio 10 i 21, ale jestem leniwy.

SLuck49
źródło
Hej, dobra robota! ;-)
Arnauld
2
$/**/=/[ \n]/;s['sp'+'lit']($)... och, to brudne.
Patrick Roberts,
Na wypadek, gdyby ktoś był ciekawy mojej próby brutalnej siły, był to pastebin.com/aN9Z1jVM
Patrick Roberts,
6

C, 475 bajtów 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}

Mogę zacząć korzystać z niektórych z tych definicji :)

Po preprocesorze kod wygląda mniej więcej tak:

int main(){
    char stdin;
    char *stdout = &stdin;
    while(read(0, &stdin, 1))
        if(stdin !='' && stdin!='\n')
            write(1, &stdin, 1);
}   
Riley
źródło
Łał! Dobra robota. Miałem nawet problemy z przeczytaniem go do końca i napisałem.
rexroni
@ rexroni #defineabowyrzuciło mnie na chwilę. Na początku myślałem, że to musi #define ab ododawać dodatkowe ;s, ale to nie działało pod koniec.
Riley,
tak, to zostało specjalnie wybrane, aby było trudniej :)
rexroni
5

Rubin, 86 bajtów + 1 flaga = 87 według histokraty

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

To było naprawdę zabawne, każdy znak w przekazywanym ciągu znaków evaljest zastępowany kodem znaku ( ord) XOR ^(...)względem liczby pozostałych spacji w ciągu. Wynikowy kod to:

$_.tr!(''<<32<<10,'')
Dom Hastings
źródło
4

RprogN, autor: Ataco

To wydaje się załatwić sprawę

' ' ` R
"
" ` R
MickyT
źródło
Przypadkowo grałem w golfa podczas łamania haha, aż do 14 bajtów
Alfie Goodacre,
Jestem naprawdę ciekawy, jak grałeś w golfa.
ATaco
@ATaco program ma tylko 14 bajtów. Czy policzyłeś ostatni wiersz czy coś?
Martin Ender
@ATaco Myliłem się, nie mogłem przetestować nowych linii na kompilatorze online, co z kolei sprawiło, że pomyślałem, że działa, ale usunąłem literał lf
Alfie Goodacre,
4

V, 37 bajtów, autor: DJMcMayhem

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

Materiały niedrukowalne:

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

TryItOnline

üNaprawdę rzucił mnie dla pętli, trzymałem go i spodziewa się zarówno îjako polecenia.

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 tłumaczy się na :%s/ \|\n//gin vim, który globalnie usuwa wszystkie białe znaki. ÍKomenda jest na wiki, a üi îto |i nodpowiednio wysoką ustawionym bitem

nmjcman101
źródło
Dobra robota! To właśnie miałem rozwiązanie. :)
DJMcMayhem
3

C, 140 bajtów przez 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();}}

(Mam również nadzieję, że robię to dobrze).

Riley
źródło
Ninja mnie o minutę!
Kritixi Lithos
@KritixiLithos Same, właśnie miał się przesłać, kiedy pojawiła się ta odpowiedź ^^
Denker
3

MATL, 22 bajty autorstwa Luisa Mendo

Chociaż nie jestem pewien, dlaczego, wydaje się, że to działa

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

Będę musiał sprawdzić, czy uda mi się ustalić, co on robi. Doszedłem do wniosku, że po komentarzach trzeba wstawiać wiersze po liniach, a potem wystarczyło, aby spacje były we właściwych miejscach.

MickyT
źródło
Fajnie, +1 Dodałem częściowe wyjaśnienie w mojej odpowiedzi :)
Stewie Griffin
1
@StewieGriffin, dzięki za wyjaśnienie. Próbowałem ustalić, dlaczego to działa, ale szło powoli. Bardzo obszerne dokumenty Luis :)
MickyT
1
@MickyT Masz na myśli pełne słowa, takie jak Java :-P Ładne dzieło krakowania!
Luis Mendo,
3

MATL, 22 21 bajtów autorstwa Luisa Mendo.

Wreszcie ... MickyT złamał go, kiedy pisałem wyjaśnienie, więc jego odpowiedź brzmi „ważna”. Mimo to opublikowałem to, zgodnie z tym postem .


Mi Ysą niepotrzebne i są komentowane. Wystarczy dodać 4 białe znaki, a nie 5.

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

Jest to odpowiednik bardziej kompaktowej :

t' @ *'dm7dw(

Częściowe wyjaśnienie:

         % 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
źródło
Niezła robota do krakowania!
Luis Mendo,
2
Dzięki :) Nie wiedziałem nic o MATL zanim zacząłem ... Myślę, że moje wyjaśnienie nie jest całkowicie poprawne (ale powinno być dość blisko?). Zajęło mi to dużo czasu, odkąd 1e5wydrukowano 100000albo 1ebyło to wezwanie reshape, ale co wtedy 5? (Widzę teraz, że %jest na końcu linii, więc nie będzie 5Mto pięć i an M. Pomyślałem też, że muszę mieć Y(jedną linię. W sumie bardzo fajny samouczek MATL :)
Stewie Griffin,
Wyjaśnienie jest całkowicie poprawne :-) Tak, to dobry (choć trochę trudny) sposób na rozpoczęcie pracy z językiem
Luis Mendo,
2

Befunge-98, 65 bajtów autorstwa ninjalj

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

Wypróbuj online!

To była świetna zabawa. Wydedukowałem, że ponieważ istnieje niewiele poleceń zmieniających kierunek i nie ma ich wcale ^<[]?x, musi on używać zawijania. Następnie napisałem skrypt w języku Python, aby pomóc w uzyskaniu odpowiednich odstępów między nimi j.

Kod działa poprzez pobieranie input ( ~) i duplikowanie go dwukrotnie ( ::). Następnie odejmuje 10 ( ':'0lub ord(':') - ord('0')) i 32 ( '[';lub ord('[') - ord(';')). Następnie drugi wynik jest logicznie zanegowany (1 jeśli było spacją, 0 w przeciwnym razie) i 8 jest wypychane.

Teraz pojawia się część, która musiała wymyślić, co pominąć. 1+!Jest pomijany przez przejściem do następnego wiersza. #pomija @. Logicznie zanegowany wynik (0 lub 1) jest mnożony przez 8 i dodawane jest 1.

Następnie kod przeskakuje o tyle (tj. 1 lub 9) spacji plus jedno dodatkowe w miarę ruchu IP. Jeśli postać nie jest spacją, kończy się na !. Kod znaku minus 10 jest logicznie zanegowany (1, jeśli był znakiem nowej linii, 0 w przeciwnym razie). jnastępnie nic nie pomija, ,wywoływana jest funkcja print ( ), a pętla wznawia się po zawinięciu w pionie.

Jeśli postać była spacją, dolna linia zapętla się ponownie 32, 22jako dolna część stosu. Pierwszy jprzeskakuje 705 pól. Następnie linia zapętla się po raz trzeci. Jeśli na stosie pozostały więcej niż dwie 10 (kod tylko je opuszcza), pierwsza jprzeskakuje 100 spacji i pętla się powtarza. W przeciwnym razie pierwszy jprzeskakuje do !, zero jest negowane, drugi jprzeskakuje nad drukiem, a program kontynuuje.

Udało mi się zagrać w golfa do 59 bajtów.

PurkkaKoodari
źródło
Podanie numeru gliniarza w nagłówku jest w porządku (ponieważ remis i tak nagradza większe rozmiary).
Martin Ender
2

C # 6, 201 bajtów, przez mleko

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 demo

trueJoinnie jest zdefiniowany, więc string.Concat()pozostaje tylko .
pjest "\n". p[0]^32^10jest przestrzeń. Byłoby (trochę) trudniejsze, gdyby było to p[0]^42lub inne podobne stałe.

Link nr
źródło
Jak skomentowano odpowiedź na mleko, to wymaga C # 6+, jeśli to zmienią, czy Ty też?
TheLethalCoder
2

siatka, 43 bajty, autor: Conor O'Brien

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

Wypróbuj online!

Było to dla mnie trudniejsze niż powinno być, ponieważ byłem zbyt głupi, aby znaleźć dokumentację, i musiałem zgadywać, jak działają niektóre z poleceń. Dlatego niektóre z tych wyjaśnień mogą nie być do końca dokładne, ale takie było moje podstawowe zrozumienie kodu.

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
źródło
Są dokumenty na wiki github.
Conor O'Brien,
dobry pomysł! I imponujące, że zrobiłeś to bez wiki: D
Conor O'Brien,
1

C #, 159 bajtów przez 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ńcuch na końcu wiersza 1 to " \n"(spacja + nowa linia).

/*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
mleko
źródło
1

Minkolang v0.15, 88 bajtów Kritixi Lithos

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

Wyjaśnienie

                               # 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
źródło
Gratulacje! Miałem nadzieję, że Cpominięcia będą mylące, ale mimo to dobra robota!
Kritixi Lithos,
@KritixiLithos szczerze mówiąc, kiedy podzieliłem warstwy i zdałem sobie sprawę, że większość pracy została wykonana w górnej warstwie, stało się łatwiejsze. Dowiedziałem się trochę o tym, jak robi to język, więc dziękuję :)
MickyT,