Реализуйте пробел в гольф


15

Некоторые двумерные esolangs, такие как Forked , и некоторые не esolangs, такие как Python , иногда могут требовать пробелы перед строками кода. Это не очень гольф. Кроме того, я ленивый и пишу 2D язык, который требует много пробелов перед кодом. Ваша задача - написать инструмент, который сделает эти языки более привлекательными.

Конечно, это не будет идеально; его нельзя использовать, например, когда число является первым символом в строке источника. Однако в целом это будет полезно.

Вызов

Вы напишите программу или функцию, которая либо ...

  • ... принимает один аргумент, имя файла или строку, или ...
  • ... читает со стандартного ввода.

Ваша программа будет действовать как cat, кроме:

  • Если первый символ в любой строке является числом, ваш код будет печатать x пробелов, где x это число.
  • В противном случае он будет просто напечатан.
  • Как и любой другой символ на входе.

Контрольные примеры

Входные данные:

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

Выход:

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

Входные данные:

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

Выход:

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

Входные данные:

foo bar
bar foo
foo bar

Выход:

foo bar
bar foo
foo bar

Входные данные:

0123456789
1234567890
2345678901
3456789012
4567890123

Выход:

123456789
 234567890
  345678901
   456789012
    567890123

правила

  • Вывод должен быть именно таким, как ввод, за исключением строк, где первый символ - это число.
  • Ваша программа не может добавлять / добавлять в файл что-либо, кроме одного завершающего символа новой строки, если хотите.
  • Ваша программа может не делать никаких предположений относительно ввода. Он может содержать пустые строки, без цифр, символов Unicode, что угодно.
  • Если число с более чем одной цифрой начинается строкой (например 523abcdefg), только первая цифра (в примере 5) должна превращаться в пробелы.

победитель

Самый короткий код на каждом языке выигрывает. Удачи и удачи!



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.Не правда, просто сделайте первый символ 0 (хм, ваш последний контрольный пример)
HyperNeutrino

Можем ли мы прочитать список строк из стандартного ввода ( действительно ли это )?
Райли

Ответы:



10

Кубически 69 байтов

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

Попробуйте онлайн!

Объяснение:

Сначала мы делаем эту инициализацию:

R1B1R3B1

Чтобы настроить этот куб:

   533
   004
   000
411223455441
311222331440
311222331440
   555
   555
   200

Самая важная вещь в этом кубе - это 5сумма граней 32, которая является значением, необходимым для печати пробелов. По совпадению, это также оказывается довольно коротким для всех других вычислений. После этого сделано:

~( . . . )                                    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

1
Вау, это хорошее использование вложенных ... всего. +1
MD XF

6

Шелуха , 15 13 байт

-2 байта благодаря @Zgarb

mΓo+?oR' i;±¶

Попробуйте онлайн!

Использует ту же технику, что и @Jonathan Allan

объяснение

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

2
13 байт с использованием Γ.
Згарб

5

JavaScript (ES8), 38 37 байт

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

Я не думаю, что это может быть улучшено намного больше.
Сохранено 1 байт благодаря Shaggy - Используйте функции ES8.


« Я не думаю, что это можно улучшить намного больше». - Вы можете сэкономить байт, используя ES8, padEndвот так:s=>s.replace(/^\d/gm,m=>"".padEnd(m))
Shaggy

@Shaggy. Я не знал, что ES8 уже разрешен. Благодарю.

1
Если есть какой-то один интерпретатор (т.
Shaggy

4

Python 2 , 98 74 67 65 байт

24 байта благодаря Джонатану Аллану. -7 байт благодаря мистеру Xcoder.

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

Попробуйте онлайн!

Принимает ввод в файл с именем f.


Также ошибки, когда нет цифры в первом
Джонатан Аллан


87 байт - заголовок ссылки TIO является насмешливым open; Код ожидает файл с именем «F». Я думаю это нормально?
Джонатан Аллан

Ах, правда, ' '*0это ложь. Использование [:1]по-прежнему сохраняется. readМне не нужно (и так было бы readlines), поскольку по умолчанию поведение openсостоит в том, чтобы перебирать строки. Также нет необходимости в режиме, так 'r'как по умолчанию. Если я прав, это 73 !
Джонатан Аллан


4

Рубин , 24 21 + 1 = 25 22 байта

Использует -pфлаг. -3 байта из ГБ.

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

Попробуйте онлайн!


{"% # $ & s"% ""} сохраняет 1 байт
ГБ,

И еще один байт, если вместо gsub вы используете sub
GB

@GB и другой байт, поставив %pв конце вместо %"". Спасибо за вашу помощь!
Value Ink

3

05AB1E , 10 байтов

v0y¬dićú},

Попробуйте онлайн!


1
Как один ввод с пустыми строками?
Джонатан Аллан


|vy¬dićú},работает на 10 байтов.
Райли

ОК, нельзя вводить пустую строку, дело в том, что код не работает для пустой строки : если используется один ноль, он работает, поэтому должно быть что-то, что заголовок не существует (то же самое относится к предложенному @ Riley 10 кстати кстати).
Джонатан Аллан

@JonathanAllan Это как-то связано с тем, как |работает. Предполагается push the rest of input as an array with strings, но останавливается на пустых строках ( TIO ). Я поднял это в чате 05AB1E, если вы хотите узнать больше.
Райли


2

Желе , 19 байт

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

Монадическая ссылка, берущая и возвращающая списки символов, или полная программа, печатающая результат.

Попробуйте онлайн!

Как?

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)

beheaded lineЭто фактический термин? xD
HyperNeutrino

1
Ну, это сейчас :)
Джонатан Аллан

Ахахаха, я попытался обыграть тебя и в итоге нашел решение, по сути идентичное твоему xD
HyperNeutrino


2

Haskell , 63 байта

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

Попробуйте онлайн! Первая строка - это анонимная функция, которая разбивает данную строку на строки, применяет функцию gк каждой строке и объединяет результирующие строки с символами новой строки. В gнем проверяется, является ли первый символ xстроки цифрой. Если это так, то ['1'..x]получается строка длиной, равной значению цифры, xи ' '<$преобразует строку в столько пробелов. Наконец, остальная часть строки rдобавляется. Если xэто не цифра, мы находимся во втором уравнении g s=sи возвращаем строку без изменений.


2

Python 2 , 76 72 68 байт

-4 байта благодаря @ovs !

@DeadPossum предложил перейти на Python 2, который также сэкономил 4 байта.

Просто подумал, что хорошо иметь полноценную программу на Python 2, которая не проверяет явно, является ли первый символ цифрой. Это читает входные данные из файла f.

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

Попробуйте онлайн! (любезно предоставлено @ovs )


@ovs Спасибо за это
мистер Xcoder

@ovs Что ты изменил (я сделаю это вручную)? Это говорит мне, что постоянная ссылка не может быть расшифрована
Mr. Xcoder

Вместо того, чтобы печатать в каждой итерации, я назначал вывод переменной и печатал все в конце.
овс

@ovs Мне удалось получить 72 байта, печатая каждую итерацию, спасибо за идею переменной!
Мистер Кскодер

Версия Python 2 printдаст вам 68 байт
Мертвый Опоссум

2

Ява 8 , 105 99 97 93 байт

Сохранено еще несколько байтов благодаря предложению Невей,

s->{int i=s.charAt(0);if(i>47&i<58)s=s.substring(1);while(i-->48)s=" "+s;System.out.print(s);}

1
У вас есть две ошибки в вашей версии для гольфа: должна использоваться проверка цифр, а не или; Скобки после проверки цифр отсутствуют. Кроме того, вы можете сохранить несколько байтов, используя 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 байта).
Невай,

@Nevay Ты прав. Благодарю. Я обновлю свой ответ.
CoderCroc

2

R , 138 128 байт

-9 байт благодаря 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='
')

Это довольно плохо, но теперь это немного лучше ... R, опять же, ужасен на струнах.

Попробуйте онлайн!


2
Я комментирую от имени CriminallyVulgar , который предлагает 129-байтовую версию, но не имеет достаточной репутации, чтобы комментировать.
г-н Xcoder

@ Mr.Xcoder Спасибо и @CriminallyVulgar!
Джузеппе

123 байта Очевидно, что rep может принимать строку типа int для второго аргумента ???
Преступно-

@CriminallyVulgar да. это прямо там, в документах для представителей , теперь, когда я проверяю их снова: «другие входные данные приводятся к целому или двойному вектору».
Джузеппе

2

Japt (v2.0a0), 11 10 байт

Джапт избивает желе и 05AB1E? Это не кажется правильным!

r/^\d/m_°ç

Проверь это


объяснение

Неявный ввод строки U

r/^\d/m

Используйте Regex replace ( r) для всех вхождений цифры в начале строки ( mэто многострочный флаг - этот gфлаг включен в Japt по умолчанию).

_

Передайте каждое совпадение через функцию, где Zнаходится текущий элемент.

°

Оператор приращения постфикса ( ++). Это преобразует Zв целое число, не увеличивая его для следующей операции.

ç

Повторите пробел Z раз.

Неявно выведите полученную строку.


Можно m@сократить?
Оливер

Не в этом случае, @Oliver; mздесь флаг многострочных для регулярных выражений, а не метод карты.
Лохматый

1
@Oliver: r/^\d/m_î(или r/^\d/m_ç) будет на 2 байта короче, но Zэто строка, поэтому, к сожалению, это не сработает. r/^\d/m_°ç, Для экономии 1 байт, делает работу, хотя :)
Shaggy

°çэто удивительный трюк :-) Я бы предложил только \dдля регулярных выражений, но это оставляет флаг ... возможно, я должен добавить поддержку флагов для регулярных выражений для одного класса, например, \dm(о да, и это исключает ^слишком ...)
ETHпродукция

@ETHproductions, будет ли возможно / возможно сделать открытие /необязательным в RegExes?
Лохматый

1

Желе , 19 байт

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

Попробуйте онлайн!

Всего -5 байт благодаря комментариям Джонатана Аллана и просмотру его поста.

объяснение

Ḣ⁶ẋ;µ¹µḣ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

не нужно менять аргументы:Ḣ⁶ẋ;
Джонатан Аллан

Трюк с поп-музыкой не сработает, если есть строка, содержащая только однозначный символ :( - ;0Ḣбудет работать для одного байта, может быть, есть один атом, я тоже пытался ¹, без радости
Джонатан Аллан

1
@JonathanAllan Ах да. Благодарю. ḣ1ẇØDработает на тот же bytecount \ o /
HyperNeutrino

ṚṪбудет работать :)
Джонатан Аллан

@JonathanAllan Это тоже работает :) Но я уже объяснил свой метод, поэтому мне лень его менять: P Но все равно спасибо :)
HyperNeutrino

1

Пиф ,  16  15 байт

jm.x+*;shdtdd.z

Попробуйте онлайн!


объяснение

jm.x + *; shdtdd.z - полная программа, которая работает, читая все из STDIN.

             .z - Читать все STDIN и разбивать его по переводам строк.
 m - Карта с переменной d.
  .x - Попробуйте:
     *; shd - преобразовать первый символ в целое число и умножить его на пробел.
    + td - и добавить все, кроме первого символа
            d - Если вышеописанное не помогает, просто добавьте всю строку.
j - Присоединиться по новым строкам.

Давайте рассмотрим пример, который должен быть проще в обработке. Скажите, что наш вклад:

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

Программа выше сделает следующее:

  • .z- Читает все это и разбивает его на новые строки, так что мы получаем ['foo bar foo bar', '1foo bar foo bar foo bar', '2foo bar foo bar foo bar foo bar'].

  • Мы получаем первый символ каждого: ['f', '1', '2'].

  • Если оно может быть преобразовано в целое число, мы повторяем пробел целое число раз и добавляем остаток строки. Иначе, мы просто помещаем всю строку. Следовательно, мы имеем ['foo bar foo bar', ' foo bar foo bar foo bar', ' foo bar foo bar foo bar foo bar'].

  • Наконец, мы присоединяемся к новым строкам, поэтому наш результат:

    фу бар фу бар
     фу бар фу бар фу бар
      фу бар фу бар фу бар фу бар
    

1
Ха-ха, мы победили Желе :)
Мистер Xcoder

1

Кубически , 82 байта

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)

Примечание: это не будет работать на TIO . Чтобы проверить это, используйте интерпретатор Lua с установленным для эксперимента флагом true (чтобы включить условные выражения). В настоящее время имеется ошибка с условными блоками в интерпретаторе TIO. При использовании интерпретатора TIO вы должны заменить ?6!на!6 и &6на ?6&, чтобы количество байтов оставалось неизменным.

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

Это не так коротко, как другой кубический ответ, но я все равно решил попробовать: D


Что происходит с циклами в интерпретаторе TIO?
MD XF

@MDXF )переходит к последней версии, (а не к той, которую я считаю. РЕДАКТИРОВАТЬ: я в чате.
TehPers

@MDXF Возможно, это были условные блоки. Я забыл, я обновлю ответ. Несмотря на это, они не совпадали.
TehPers

1
Хорошо, я посмотрю на это позже. Я в настоящее время заканчиваю Кубически 2.
MD XF

@MDXF Это ... действительно интересно услышать
о_О

1

> <> , 60 байт

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

Попробуйте онлайн!

Как это устроено:

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


0

Гема, 21 персонаж

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

Образец прогона:

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
        ,
       &

0

PHP, 83 символа

preg_replace_callback('/^\d/m',function($m){return str_repeat(' ',$m[0]);},$argv);

Я думаю, что ваш код не соответствует правилам ввода этой задачи, вы должны заключить это в функцию с $s аргументом arg или заполнить его вводом. И это ничего не печатает
LP154

@ LP154 использует argv приемлемо?
Петах

@Petah Если я прав в предположении, argvчто это аргументы командной строки, то да.
полностью человек
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.