Zaimplementuj białego golfisty

15

Niektóre dwuwymiarowe esolangi, takie jak Forked , i niektóre inne niż esolangi, takie jak Python , mogą czasem wymagać spacji przed wierszami kodu. To nie jest bardzo golfowe. Poza tym jestem leniwy i piszę język 2d, który wymaga dużo spacji przed kodem. Twoim zadaniem jest napisanie narzędzia, które uczyni te języki golfistami.

Oczywiście nie będzie to idealne; nie można go użyć na przykład, gdy liczba jest pierwszym znakiem w linii źródła. Jednak na ogół przyda się.

Wyzwanie

Napisz program lub funkcję, która albo ...

  • ... pobiera jeden argument, nazwę pliku lub ciąg znaków, lub ...
  • ... odczytuje ze standardowego wejścia.

Twój program będzie działał tak cat, z wyjątkiem:

  • Jeśli pierwszym znakiem w dowolnym wierszu jest liczba, kod wypisze x spacji, gdzie x to ta liczba.
  • W przeciwnym razie zostanie po prostu wydrukowany.
  • Podobnie jak każdy inny znak na wejściu.

Przypadki testowe

Wejście:

foo bar foo bar
1foo bar foo bar foo bar
2foo bar foo bar foo bar foo bar

Wynik:

foo bar foo bar
 foo bar foo bar foo bar
  foo bar foo bar foo bar foo bar

Wejście:

--------v
8|
8|
80
8,
7&

Wynik:

--------v
        |
        |
        0
        ,
       &

Wejście:

foo bar
bar foo
foo bar

Wynik:

foo bar
bar foo
foo bar

Wejście:

0123456789
1234567890
2345678901
3456789012
4567890123

Wynik:

123456789
 234567890
  345678901
   456789012
    567890123

Zasady

  • Dane wyjściowe muszą być dokładnie takie same jak dane wejściowe, z wyjątkiem wierszy, w których pierwszy znak jest liczbą.
  • Twój program nie może dodawać / dodawać niczego do pliku, z wyjątkiem jednej nowej linii, jeśli chcesz.
  • Twój program może nie przyjmować żadnych założeń dotyczących danych wejściowych. Może zawierać puste linie, bez cyfr, znaków Unicode, cokolwiek.
  • Jeśli liczba składająca się z więcej niż jednej cyfry rozpoczyna wiersz (np. 523abcdefg), Tylko pierwsza cyfra (w przykładzie 5) powinna zamienić się w spacje.

Zwycięzca

Wygrywa najkrótszy kod w każdym języku. Baw się dobrze i powodzenia!

MD XF
źródło
6
Of course, this will not be perfect; it cannot be used, for instance, when a number is the first character on a line of source.Nieprawda, po prostu
ustaw
Czy możemy odczytać listę ciągów ze standardowego wejścia (czy jest to poprawne )?
Riley,

Odpowiedzi:

10

Sześciennie , 69 bajtów

R1B1R3B1~(+50<7?6{+54>7?6{-002+7~?6{(@5*1-1/1)6}}}(-6>7?6&@7+70-4~)6)

Wypróbuj online!

Wyjaśnienie:

Najpierw wykonujemy tę inicjalizację:

R1B1R3B1

Aby skonfigurować tę kostkę:

   533
   004
   000
411223455441
311222331440
311222331440
   555
   555
   200

Najważniejszą rzeczą w tym sześcianie jest to, że 5sumy twarzy wynoszą 32, czyli wartość wymagana do drukowania spacji. Przypadkowo okazuje się, że jest dość krótki dla wszystkich innych obliczeń. Po zakończeniu:

~( . . . )                                    Takes the first input, then loops indefinitely

  +50<7?6{+54>7?6{-002+7~?6{(@5*1-1/1)6}}}    Handle leading digit:
  +50<7?6{                               }    If input is greater than 47 ('0' is 48)
          +54>7?6{                      }     And input is less than 58 ('9' is 57)
                                              Then input is a digit
                  -002+7                      Set notepad equal to value of input digit
                        ~                     Take next input (only convenient place for it)
                         ?6{           }      If the notepad isn't 0
                            (        )6       While the notepad isn't 0:
                             @5                 Print a space
                               *1-1/1           Decrement the notepad by one
                                              Leading digit handled

     (-6>7?6&@7+70-4~)6                       Handle rest of line:
     (               )6                       While the notepad isn't 0:
      -6>7?6&                                   Exit if End of Input
             @7                                 Print the next character
               +70-4                            Set notepad to 0 if it was a newline
                    ~                           Take the next character
Kamil Drakari
źródło
1
Wow, to dobre wykorzystanie zagnieżdżonego ... wszystkiego. +1
MD XF
6

Łuska , 15 13 bajtów

-2 bajty dzięki @Zgarb

mΓo+?oR' i;±¶

Wypróbuj online!

Używa tej samej techniki, co @Jathanathan Allan

Wyjaśnienie

             ¶  -- split input into a list of lines
m               -- apply the following function to each line
 Γ              --   deconstruct the string into a head and a tail
  o+            --   prepend to the tail of the string ...
    ?      ±    --     if the head is a digit (n)
     oR' i      --       the string of n spaces
                --     else
          ;     --       the head of the string
                -- implicitly print list of strings line-by-line
H.PWiz
źródło
2
13 bajtów przy użyciu Γ.
Zgarb,
5

JavaScript (ES8), 38 37 bajtów

a=>a.replace(/^\d/gm,a=>''.padEnd(a))

Nie sądzę, że można to znacznie poprawić.
Oszczędność 1 bajtu dzięki Shaggy - użyj funkcji ES8.


źródło
Nie sądzę, że można to znacznie poprawić. ” - Możesz zapisać bajt, używając ES8 w padEndtaki sposób:s=>s.replace(/^\d/gm,m=>"".padEnd(m))
Shaggy
@Kudłaty. Nie wiedziałem, że ES8 jest już dozwolone. Dzięki.
1
Jeśli jest tam jakikolwiek tłumacz (np. Przeglądarka), który obsługuje tę funkcję, to ta funkcja jest tutaj uczciwa :)
Shaggy,
4

Python 2 , 98 74 67 65 bajtów

-24 bajty dzięki Jonathanowi Allanowi. -7 bajtów dzięki Mr. Xcoder.

for i in open('f'):print' '*int(i[0])+i[1:]if'/'<i[:1]<':'else i,

Wypróbuj online!

Pobiera dane wejściowe do pliku o nazwie f.

całkowicie ludzki
źródło
Występuje również błąd, gdy nie ma cyfry w pierwszym znaku wiersza (przy użyciu listy do wyboru pozycji oceniane są wszystkie elementy)
Jonathan Allan
powrót do 89
Jonathan Allan
87 bajtów - nagłówek linku TIO drwi open; kod oczekuje pliku o nazwie „f”. Myślę, że jest ok?
Jonathan Allan,
Ach, to prawda, ' '*0falsey. Używanie [:1]wciąż jest jednak możliwe. Nie potrzeba readmi wierzyć (i byłoby readlines) ponieważ domyślnym zachowaniem openjest iterację wierszami. Nie ma też potrzeby korzystania z tego trybu, ponieważ 'r'jest on domyślny. Jeśli mam rację, to 73 !
Jonathan Allan,
Daj nam kontynuować tę dyskusję w czacie .
Jonathan Allan,
4

Rubinowy , 24 21 + 1 = 25 22 bajtów

Używa -pflagi. -3 bajty z GB.

sub(/^\d/){"%#$&s"%p}

Wypróbuj online!

Wartość tuszu
źródło
{"% # $ & s"% ""} zapisuje 1 bajt
GB
I jeszcze jeden bajt, jeśli użyjesz sub zamiast gsub
GB
@GB i kolejny bajt, umieszczając %pna końcu zamiast %"". Dzięki za pomoc!
Wartość tuszu
3

05AB1E , 10 bajtów

v0y¬dićú},

Wypróbuj online!

Oliver Ni
źródło
1
Jak wpisuje się puste linie?
Jonathan Allan
Nie mam pojęcia lol ... Zajmę się tym
Oliver Ni
|vy¬dićú},działa dla 10 bajtów.
Riley,
OK, to nie jest tak, że nie można wprowadzić pustej linii, tylko to, że kod nie działa dla pustej linii : jeśli używa się pojedynczego zera, to działa, więc musi to być coś z tym, że głowa nie istnieje (to samo dotyczy sugerowanej przez Rileya 10 przy okazji).
Jonathan Allan
@JonathanAllan Ma to coś wspólnego ze sposobem |działania. Powinno tak być push the rest of input as an array with strings, ale zatrzymuje się na pustych liniach ( TIO ). Przyniosłem to się w czacie 05AB1E jeśli chcesz wiedzieć więcej.
Riley,
2

Python 3 , 95 bajtów

lambda y:'\n'.join(re.sub('^\d',lambda x:' '*int(x.group()),z)for z in y.split('\n'))
import re

Wypróbuj online!

-4 bajty poprzez kradzież wyrażenia regularnego z ThePirateBay

HyperNeutrino
źródło
4
Ci ukradli thepiratebay , jak stoły okazały
joH1
@Moonstroke HAH lol Nawet nie zauważyłem, że: P
HyperNeutrino
2

Galaretka , 19 bajtów

V⁶ẋ
Ḣǹe?ØD;
ỴÇ€Yḟ0

Monadyczny link pobierający i zwracający listy znaków lub pełny program drukujący wynik.

Wypróbuj online!

W jaki sposób?

V⁶ẋ - Link 1, make spaces: character (a digit)
V   - evaluate as Jelly code (get the number the character represents)
 ⁶  - a space character
  ẋ - repeat

Ḣǹe?ØD; - Link 2, process a line: list of characters
Ḣ        - head (get the first character and modify the line)
         -   Note: yields zero for empty lines
     ØD  - digit characters = "0123456789"
    ?    - if:
   e     - ...condition: exists in? (is the head a digit?)
 Ç       - ...then: call the last link as a monad (with the head as an argument)
  ¹      - ...else: identity (do nothing; yields the head)
       ; - concatenate with the beheaded line

ỴÇ€Yḟ0 - Main link: list of characters
Ỵ      - split at newlines
 Ç€    - call the last link (1) as a monad for €ach
   Y   - join with newlines
    ḟ0 - filter out any zeros (the results of empty lines)
Jonathan Allan
źródło
beheaded lineCzy to jest prawdziwy termin? xD
HyperNeutrino
1
Cóż, teraz jest :)
Jonathan Allan
Ahahaha Próbowałem cię obezwładnić i skończyłem z rozwiązaniem zasadniczo identycznym z twoim xD
HyperNeutrino
2

Haskell , 63 bajty

unlines.map g.lines
g(x:r)|x<';',x>'/'=(' '<$['1'..x])++r
g s=s

Wypróbuj online! Pierwszy wiersz jest anonimową funkcją, która dzieli dany ciąg na linie, stosuje funkcję gdo każdej linii i łączy wynikowe linie z nowymi liniami. W gnim sprawdzane jest, czy pierwszym znakiem xlinii jest cyfra. W takim przypadku ['1'..x]zwraca ciąg o długości równej wartości cyfry xi ' '<$konwertuje ciąg na tyle spacji. W końcu rdołączana jest reszta wiersza . Jeśli xnie jest cyfrą, jesteśmy w drugim równaniu g s=si zwracamy linię niezmodyfikowaną.

Laikoni
źródło
2

Python 2 , 76 72 68 bajtów

-4 bajty dzięki @ovs !

@DeadPossum zasugerował przejście na Python 2, który również oszczędził 4 bajty.

Pomyślałem, że miło jest mieć pełny program konkurencyjny w Pythonie 2, który nie sprawdza wprost, czy pierwszy znak jest cyfrą. Odczytuje dane wejściowe z pliku f.

for i in open('f'):
 try:r=int(i[0])*" "+i[1:]
 except:r=i
 print r,

Wypróbuj online! (dzięki uprzejmości @ovs )

Pan Xcoder
źródło
@ovs Dzięki za to
Mr. Xcoder,
@ovs Co zmieniłeś (zrobię to ręcznie)? Mówi mi, że permalink nie może być odkodowany
Mr. Xcoder
Zamiast drukować w każdej iteracji przypisałem wyjście do zmiennej i wydrukowałem wszystko na końcu.
ovs
@ovs Udało mi się uzyskać 72 bajty, drukując każdą iterację, dzięki za pomysł na zmienną!
Pan Xcoder,
Wersja Python 2 printda ci 68 bajtów
Dead Possum
2

Java 8 , 105 99 97 93 bajtów

Zaoszczędził jeszcze kilka bajtów dzięki sugestii Nevaya,

s->{int i=s.charAt(0);if(i>47&i<58)s=s.substring(1);while(i-->48)s=" "+s;System.out.print(s);}
CoderCroc
źródło
1
Masz dwa błędy w wersji do gry w golfa: Kontrola cyfr musi zostać użyta i zamiast lub; Brakuje nawiasów po kontroli cyfr. Poza tym możesz zaoszczędzić kilka bajtów, używając s->{int i=s.charAt(0);if(i>47&i<58)for(s=s.substring(1);i-->48;s=" "+s);System.out.print(s);}(93 bajtów).
Nevay
@Nevay Masz rację. Dzięki. Zaktualizuję moją odpowiedź.
CoderCroc
2

R , 138 128 bajtów

-9 bajtów dzięki CriminallyVulgar

n=readLines();for(d in grep("^[0-9]",n))n[d]=gsub('^.?',paste0(rep(' ',eval(substr(n[d],1,1))),collapse=''),n[d]);cat(n,sep='
')

Jest to dość złe, ale teraz jest trochę lepiej ... R jest znowu okropny dla strun.

Wypróbuj online!

Giuseppe
źródło
2
Komentuję w imieniu CriminallyVulgar , który sugeruje wersję 129-bajtową , ale nie ma wystarczającej reputacji, aby komentować.
Pan Xcoder,
@ Mr.Xcoder Dziękujemy i @CriminallyVulgar!
Giuseppe,
123 bajtów Najwyraźniej przedstawiciel może wziąć ciąg int dla drugiego argumentu ???
CriminallyVulgar
@CriminallyVulgar huh. jest tam w dokumentacji dla rep , teraz, gdy sprawdzam je ponownie: „inne dane wejściowe są konwertowane na liczbę całkowitą lub podwójny wektor”.
Giuseppe,
2

Japt (v2.0a0), 11 10 bajtów

Japt pokonujesz Jelly i 05AB1E? To nie wydaje się właściwe!

r/^\d/m_°ç

Sprawdź to


Wyjaśnienie

Niejawne wprowadzanie ciągu U

r/^\d/m

Użyj Regex replace ( r) wszystkich wystąpień cyfry na początku linii ( mjest to flaga wielowierszowa - gflaga jest domyślnie włączona w Japt).

_

Przekaż każde dopasowanie przez funkcję, gdzie Zjest bieżący element.

°

Operator przyrostka Postfiksa ( ++). Konwertuje Zto na liczbę całkowitą bez zwiększania jej dla następnej operacji.

ç

Powtórz znak spacji Z times.

Niejawnie wyprowadza wynikowy ciąg.

Kudłaty
źródło
Można m@skrócić?
Oliver,
Not in this case, @Oliver; the m here is the multi-line flag for the regex, not the map method.
Shaggy
1
@Oliver: r/^\d/m_î (or r/^\d/m_ç) would be 2 bytes shorter but Z is a string so, unfortunately, it wouldn't work. r/^\d/m_°ç, for a 1 byte saving, does work, though :)
Shaggy
°çto niesamowita sztuczka :-) Zasugerowałbym tylko \ddla wyrażenia regularnego, ale to pomija flagę ... być może powinienem dodać obsługę flag dla wyrażeń regularnych jednej klasy, na przykład \dm(o tak, i to ^też pomija ...)
ETHprodukcje
@ETHproductions, czy wykonalne / możliwe byłoby uczynienie otwarcia /opcjonalnym w RegExes?
Kudłaty
1

Galaretka , 19 bajtów

Ḣ⁶ẋ;µ¹µḣ1ẇØDµ?
ỴÇ€Y

Wypróbuj online!

-5 bajtów ogółem dzięki komentarzom Jonathan Allan i patrząc na jego post

Wyjaśnienie

Ḣ⁶ẋ;µ¹µḣ1ẇØDµ?  Main link
             ?  Ternary if
                if:
       ḣ1       the first 1 element(s) (`Head` would modify the list which is not wanted)
         ẇ      is a sublist of (essentially "is an element of")
          ØD    "0123456789"
                then:
  ẋ             repeat
 ⁶              ' '
Ḣ               n times where n is the first character of the line (head)
   ;            concatenate the "beheaded" string (wording choice credited to Jonathan Allan)
                else:
     ¹          Identity (do nothing)
    µ µ     µ   Link separators
ỴÇ€Y            Executed Link
Ỵ               Split by newlines
  €             For each element,
 Ç              call the last link on it
   Y            Join by newlines
HyperNeutrino
źródło
nie trzeba zamieniać argumentów:Ḣ⁶ẋ;
Jonathan Allan
Pop wtedy head trick nie zadziała, jeśli jest wiersz zawierający tylko jedną cyfrę :( - ;0Ḣdziałałby na jeden bajt, może jest jeden atom, też próbowałem ¹, nie ma radości
Jonathan Allan
1
@JonathanAllan Ah racja. Dzięki. ḣ1ẇØDdziała dla tego samego bajtu \ o /
HyperNeutrino
ṚṪzadziała :)
Jonathan Allan
@JonathanAllan To też działa :) Ale wyjaśniłem już swoją metodę, więc jestem zbyt leniwy, aby ją zmienić: P Ale i tak dziękuję :)
HyperNeutrino
1

Pyth ,  16  15 bajtów

jm.x+*;shdtdd.z

Wypróbuj online!


Wyjaśnienie

jm.x + *; shdtdd.z - Pełny program, który działa poprzez czytanie wszystkiego ze STDIN.

             .z - Przeczytaj wszystkie STDIN i podziel je według linii.
 m - Mapa ze zmienną d.
  .x - Spróbuj:
     *; shd - Aby przekonwertować pierwszy znak na liczbę całkowitą i pomnożyć go przez spację.
    + td - I dodaj wszystko oprócz pierwszej postaci
            d - Jeśli powyższe nie powiedzie się, po prostu dodaj cały ciąg.
j - Dołącz przez nowe linie.

Weźmy przykład, który powinien być łatwiejszy do przetworzenia. Powiedz, że nasz wkład to:

foo bar foo bar
1foo bar foo bar foo bar
2foo bar foo bar foo bar foo bar

Powyższy program wykona następujące czynności:

  • .z- Czyta wszystko i dzieli je według nowych linii, więc otrzymujemy ['foo bar foo bar', '1foo bar foo bar foo bar', '2foo bar foo bar foo bar foo bar'].

  • Otrzymujemy pierwszy znak każda: a ['f', '1', '2'].

  • If it is convertible to an integer, we repeat a space that integer times and add the rest of the String. Else, we just place the whole String. Hence, we have ['foo bar foo bar', ' foo bar foo bar foo bar', ' foo bar foo bar foo bar foo bar'].

  • Finally, we join by newlines, so our result is:

    foo bar foo bar
     foo bar foo bar foo bar
      foo bar foo bar foo bar foo bar
    
Pan Xcoder
źródło
1
Haha, pokonaliśmy Jelly :)
Mr. Xcoder,
1

Sześciennie , 82 bajty

R3D1R1D1+0(?6{?7@7~:1+2<7?6{+35>7?6{:7-120?6{(B3@5B1-0)6}:0}}}?6!@7~-60=7&6+4-3=7)

Uwaga: To nie zadziała w TIO . Aby to przetestować, użyj interpretera Lua z flagą eksperymentalną ustawioną na true (aby włączyć warunki warunkowe). Obecnie występuje błąd dotyczący bloków warunkowych w interpretatorze TIO. Podczas korzystania z tłumacza tio należy wymienić ?6!z !6i &6z ?6&, który zlicza bajt samo.

R3D1R1D1          Set the cube so that face 0 has value 1 and the rest of the values are easy to calculate

+0                Set the notepad to 1 so that it enters the conditional below
(                 Do
  ?6{               If the notepad is 1 (last character was \n or start of input)
    ?7@7              Output the current character if it's \n
    ~                 Get the next character
    :1+2<7?6{         If the input is >= '0'
      +35>7?6{          If the input is <= '9'
        :7-120            Set the notepad to the input - '0'
        ?6{               If the notepad isn't 0
          (                 Do
            B3@5              Output a space
            B1-0              Subtract 1 from notepad
          )6                While notepad > 0
        }                 End if
        :0              Set notepad to 1
      }                 End if
    }                 End if
  }                 End if

  ?6!@7             If the notepad is 0 (did not attempt to print spaces), print current character

  ~                 Get next character
  -60=7&6           If there is no more input, exit the program
  +4-3=7            Check if current character is \n, setting notepad to result
)                 Repeat forever

To nie jest tak krótkie jak druga odpowiedź Cubically, ale pomyślałem, że i tak spróbuję: D

TehPers
źródło
What's going on with loops in the TIO interpreter?
MD XF
@MDXF ) jumps to the most recent ( rather than the matching one I believe. EDIT: I'm in the chat.
TehPers
@MDXF Maybe it was the conditional blocks, actually. I forgot, I'll update the answer. Regardless, they weren't matching up.
TehPers
1
All right, I'll look at that later. I'm currently finishing Cubically 2.
MD XF
@MDXF That's... really exciting to hear actually o_O
TehPers
1

><>, 60 bytes

!^i:0(?;::"/")$":"(*0$.
v"0"-
>:?!v1-" "o
;>:o>a=&10&?.i:0(?

Try it online!

How It Works:

..i:0(?;... Gets input and ends if it is EOF
...
...
...

.^......::"/")$":"(*0$. If the inputted character is a digit go to the second line
...                     Else go to the fourth
...
...

....        If it was a digit
v"0"-       Subtract the character "0" from it to turn it into the corresponding integer
>:?!v1-" "o And print that many spaces before rejoining the fourth line
...

.^..               On the fourth line,
....               Copy and print the input (skip this if it was a digit)
....v              If the input is a newline, go back to the first line.
;>:o>a=&10&?.i:0(? Else get the input, ending on EOF
Jo King
źródło
0

V, 9 bytes

ç^ä/x@"é 

Try it online!

Explanation

ç  /      ' On lines matching
 ^ä       ' (Start)(digit)
    x     ' Delete the first character
     @"   ' (Copy Register) number of times
       é  ' Insert a space
nmjcman101
źródło
0

Gema, 21 characters

\N<D1>=@repeat{$1;\ }

Sample run:

bash-4.4$ gema '\N<D1>=@repeat{$1;\ }' <<< 'foo bar foo bar
> 1foo bar foo bar foo bar
> 2foo bar foo bar foo bar foo bar
> 
> --------v
> 8|
> 8|
> 80
> 8,
> 7&'
foo bar foo bar
 foo bar foo bar foo bar
  foo bar foo bar foo bar foo bar

--------v
        |
        |
        0
        ,
       &
manatwork
źródło
0

PHP, 83 chars

preg_replace_callback('/^\d/m',function($m){return str_repeat(' ',$m[0]);},$argv);
Petah
źródło
I think your code is not compliant with the input rules of this challenge, you should enclose this in a function with a $s arg or populate it with the input. And it doesn't print anything
LP154
@LP154 is using argv acceptable?
Petah
@Petah If I'm correct in assuming argv is the command line args, then yes.
totallyhuman