Разнесенные числа


20

Получив список Nнеотрицательных целых чисел, выведите эти числа с пробелами слева, чтобы длина составляла N. (Либо верните список символов или строк.) Вы можете предположить, что Nон больше или равен количеству цифр самого большого числа в списке. В конце допускаются пробелы.

Вы также можете взять строку, содержащую эти числа, но Nэто не длина строки, а количество элементов в списке; также вы можете взять список строк, например ["1", "2", "3"].

Это код-гольф, поэтому выигрывает самая короткая программа в байтах.

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

input => 'output'
0 => '0'
1 => '1'
2 3 => ' 2 3'
2 10 => ' 210'
4 5 6 => '  4  5  6'
17 19 20 => ' 17 19 20'
7 8 9 10 => '   7   8   9  10'
100 200 300 0 => ' 100 200 300   0'
1000 400 30 7 => '1000 400  30   7'
1 33 333 7777 => '   1  33 3337777'
0 0 0 0 0 0 => '     0     0     0     0     0     0'

Можно ли печатать числа по одной в каждой строке (с надлежащим заполнением)?
Луис Мендо

@ LuisMendo да.
Конор О'Брайен,

Ответы:



16

Python, 32 байта

lambda l:'%%%ds'%len(l)*len(l)%l

Анонимная функция, которая принимает кортеж в качестве входных данных. Либо числа, либо строки работают.

Пример:

l=(1,33,333,7777)

'%%%ds'
## A "second-order" format string

'%%%ds'%len(l)           -> '%4s'
## Inserts the length as a number in place of '%d'
## The escaped '%%' becomes '%', ready to take a new format argument
## The result is a format string to pad with that many spaces on the left

'%%%ds'%len(l)*len(l)    -> '%4s%4s%4s%4s'
## Concatenates a copy per element

'%%%ds'%len(l)*len(l)%l  -> '   1  33 3337777'
## Inserts all the tuple elements into the format string 
## So, each one is padded with spaces

7

JavaScript (ES7), 37 байт

a=>a.map(v=>v.padStart(a.length,' '))

Входные данные: массив строк.
Выходные данные: массив строк.


5

PowerShell v2 +, 36 байт

param($a)$a|%{"{0,$($a.count)}"-f$_}

Принимает ввод $aкак массив integers. Перебирает их с $a|%{...}. Каждая итерация использует -fоператор ormat с необязательным Alignment Component(на основе $a.count), чтобы заполнить левым полем соответствующее количество пробелов. Эта результирующая строка остается в конвейере. В конце выполнения программы все полученные строки остаются в конвейере в виде массива.


Примеры

Вывод разделен символом новой строки при каждом запуске, так как это значение Write-Outputпо умолчанию при завершении программы для массива.

PS C:\Tools\Scripts\golfing> @(0),@(1),@(2,3),@(2,10),@(4,5,6),@(17,19,20),@(7,8,9,10),@(100,200,300,0),@(1000,400,30,7),@(1,33,333,7777),@(0,0,0,0,0,0)|%{""+($_-join',')+" -> ";(.\spaced-out-numbers $_)}
0 -> 
0
1 -> 
1
2,3 -> 
 2
 3
2,10 -> 
 2
10
4,5,6 -> 
  4
  5
  6
17,19,20 -> 
 17
 19
 20
7,8,9,10 -> 
   7
   8
   9
  10
100,200,300,0 -> 
 100
 200
 300
   0
1000,400,30,7 -> 
1000
 400
  30
   7
1,33,333,7777 -> 
   1
  33
 333
7777
0,0,0,0,0,0 -> 
     0
     0
     0
     0
     0
     0

5

JavaScript, 49 байт

a=>a.map(n=>" ".repeat(a.length-n.length)+n)

Принимает аргументы как список строк, а также возвращает список строк.

Объяснение:

a=>                                                   An unnamed function, which takes one argument, a
   a.map(n=>                               )          Do the following to each element n in a:
            " ".repeat(a.length-n.length)             Generate the spaces needed to justify the number
                                         +n           Append the number

1
Массив строк является приемлемым, поэтому .join("")не требуется.
Конор О'Брайен,

1
a=>a.map(n=>(" ".repeat(l=a.length)+n).slice(-l))такой же длины, но работает как с целыми числами, так и со строками.
Нил

5

Perl, 26 байт

-4 байта благодаря @Ton Hospel

25 байт кода + -aфлаг.

printf"%*s",~~@F,$_ for@F

Бежать с :

perl -ae 'printf"%*s",~~@F,$_ for@F' <<< "10 11 12"

(На некоторых старых версиях Perl может потребоваться добавить -n)


1
Использование этой -aопции сделает ваш код короче ...
Тон Хоспел

@TonHospel гул, это звучит довольно очевидно, глупо меня .. Спасибо за напоминание
Dada

Немного другой метод позволяет избежать цикла и сохранить байт: попробуйте онлайн!
Xcali

5

Баш, 14

printf %$#d $@

Список ввода приведен в командной строке.

Не так много, чтобы объяснить здесь. Просто использует встроенные printfсредства для выполнения необходимого заполнения, основываясь на количестве переданных аргументов:

  • $# количество переданных аргументов
  • %<n>d является спецификатором формата printf, который печатает целое число до n пробелов
  • $@ список всех переданных аргументов
  • Спецификатор формата повторно используется для каждого члена $@.

Ideone .


4

Vim, 19 байт

YPPG!{<C-F>|R%ri<CR>djVGgJ

Принимает список номеров по одному на строку. Полагается на то :set expandtab, что популярно, но не универсально.

Вы явно хотите использовать :rightдля этого. Вопрос в том, как получить количество строк в командной строке. Традиционный способ:%ri<C-R>=line('$') , но весь этот текст длинный.

Короче, более предприимчивый подход состоит в том, чтобы сформировать командную строку, используя команду нормального режима !. Он включает в себя некоторые странные обходные пути, расширяя файл на 2 строки, затем удаляя их снова, но получается на 2 байта короче. И я шокирован искаженной командной строкой, которую я получаю (вроде :%ri+4!), на самом деле работает, но это так.


Я не думаю, что вы можете положиться на функцию, которая по умолчанию отключена.
DJMcMayhem

@DJMcMayhem Я провел слишком много часов в моей жизни, борясь с плохими настройками отступов в vimgolf. Явная настройкаexpandtab добавляет 7 ударов к этому решению. Причина в том, что мне приходится искать другие подходы, чтобы избежать / удалить вкладки, которые теперь могут выиграть. Это много времени, совсем не весело, ухудшает качество моего решения и даже не влияет ни на один из предоставленных тестовых случаев (ни у одного не более 8+ номеров). Если это правило, то это правило, но я бы предпочел не участвовать в соревнованиях, чем делать это без expandtab.
udioica

@DJMcMayhem О себе Ypp!{. Это действительно короче. Это также не работает. Это всегда принесло бы число 1 в командную строку, независимо от длины файла.
udioica

4

Рубин, 40 36 34 байта

->m{m.map{|i|$><<i.rjust(m.size)}}

Можно работать больше.

Звони как лямбда.

Объяснение:

->m{m.map{|i|$><<i.rjust(m.size)}}
->m{                             } # lambda taking array m
    m.map{|i|                   }  # map over array using variable i
             $><<                  # output to $> (stdout)
                 i.rjust(m.size)   # right justify i to m's length

2

Желе , 7 6 байт

L⁶xaUU

Ввод представляет собой массив строк. Попробуйте онлайн! или проверьте все контрольные примеры .

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

L⁶xaUU  Main link. Argument: A (array of strings)

L       Yield the l, the length of A.
 ⁶x     Repeat ' ' l times.

    U   Upend; reverse all strings in A.
   a    Perform vectorizing logical AND, replacing spaces with their corresponding
        digits and leaving spaces without corresponding digits untouched.
     U  Upend; reverse the strings in the result to restore the original order of
        its digits, moving the spaces to the left.

2

Mathematica, 25 байтов

#~StringPadLeft~Length@#&

И вход, и выход являются списками строк.

объяснение

Length@#

Получить длину ввода (номер элемента).

#~StringPadLeft~...

Pad оставил каждый элемент на входе так, чтобы их длина соответствовала длине ввода.


2

JavaScript (ES6), 47

Анонимная функция, вход: массив строк, вывод: массив строк
Использование рекурсивной функции заполнения

a=>a.map(x=>p(x),p=x=>x[a.length-1]?x:p(' '+x))

Для целочисленного / строкового массива в качестве входных данных, 49 байтов:

a=>a.map(x=>p(x),p=x=>(y=' '+x)[a.length]?x:p(y))

Тестовое задание

f=
a=>a.map(x=>p(x),p=x=>x[a.length-1]?x:p(' '+x))

function update() {
  var l=I.value.match(/\d+/g)||[]
  O.textContent = f(l)
}

update()
 
<input id=I oninput='update()' value='1000,400,30,7'>
<pre id=O></pre>


2

PHP, 55 байт

<?foreach($a=$_GET[a]as$i)printf("%".count($a)."s",$i);

Peeve Version 59 байт

<?foreach($a=$_GET[a]as$i)echo str_pad($i,count($a)," ",0);

1
Зачем использовать str_pad, когда printf достаточно? foreach($a=$_GET[a]as$i)printf("%".count($a)."s",$i);
Crypto

2

J, 4 байта

":~#

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

Унарная функция, принимающая список чисел справа в виде массива и возвращающая дополненную строку.

Здесь это используется в REPL. Обратите внимание, что строки ввода имеют отступ в три пробела.

   f=: ":~#
   f 2 3
 2 3
   f 2 10
 210
   f 1111 222 33 4
1111 222  33   4

Вау. Вы победили мое эталонное решение в J Очень хорошо.
Конор О'Брайен


1

Котлин, 90 байт

Golfed:

fun main(a:Array<String>){a.forEach{b->for(i in 1..a.size-b.length){print(" ")};print(b)}}

Ungolfed:

fun main(a: Array<String>) {
    a.forEach { b ->
        for (i in 1..a.size - b.length) {
            print(" ")
        }
        print(b)
    }
}

1

Haskell, 47 байтов

k=length
f l=map(\s->replicate(k l-k s)' '++s)l

Это функция из списка строк в список строк, как в ответах JavaScript. replicateпозволяет получить список (строки Haskell - списки символов) заданного размера, поэтому я использую его - и жирное предположение в задаче - для генерации заполнения (его длина N- <длина элемента>, для каждого элемента из списка ввода). Я бы предпочел использовать printfрешение на основе, а не это с replicate(оно было бы короче, во-первых), но оператор import убивает любые сбережения, сделанные на самой функции.


1

Ява, 83 82 байта

a->{String s="";for(int i=a.length,j=i;i-->0;)s+="%"+j+"s";return s.format(s,a);};

Создает строку формата, предназначенную для заполнения заданных аргументов числом пробелов, равным длине массива. Строка формата используется в качестве аргумента для String.format, а затем возвращается результат. Функциональный интерфейс может принимать или a String[]или a Integer[]или подобное.

Полный класс:

public class Test {
    public static void main(String[] args) {
        java.util.function.Function<Integer[], String> f = a -> {
            String s = "";
            for (int i = a.length, j = i; i-- > 0;)
                s += "%" + j + "s";
            return s.format(s, a);
        };

        System.out.println(f.apply(new Integer[] {0}));
        System.out.println(f.apply(new Integer[] {2, 10}));
        System.out.println(f.apply(new Integer[] {7, 8, 9, 10}));
        System.out.println(f.apply(new Integer[] {1, 33, 333, 7777}));
        System.out.println(f.apply(new Integer[] {0, 0, 0, 0, 0, 0}));
    }
}

Попробуйте это на Ideone.

-1 байт благодаря @KevinCruijssen.


Хороший подход, +1. Вы можете сыграть в гольф на 1 байт, поместив int ...и s+=...внутри ifтак:for(int i=a.length,j=i;i-->0;s+="%"+j+"s");
Кевин Круйссен


1

MATL, 14 байтов

'%%%dd'inYDGYD

Попробуйте это в MATL Online

При этом используется создание форматированной строки, сначала создав %(NUM)dстроку форматирования, а затем снова применяет форматирование строки с использованием этой строки форматирования и ввода.


1

JavaScript 33 байта

похож на @Hedi - но по умолчанию используется дополнение '', поэтому его 4 символа меньше

a=>a.map(s=>s.padStart(a.length))

f=a=>a.map(s=>s.padStart(a.length))

console.log(f(["0"]))
console.log(f(["1"]))
console.log(f(["2","3"]))
console.log(f(["2","10"]))
console.log(f(["17" ,"19" ,"2"]))
console.log(f(["1000" ,"400" ,"30" ,"7"]))


1

К (ок) , 11 байт

Решение:

,/(-#x)$$x:

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

Объяснение:

Интерпретируется справа налево. Преобразовать в строку и заполнить левой клавишей с длиной списка, затем сгладить:

,/(-#x)$$x: / the solution                      | example:
         x: / save as 'x'                       |
        $   / string                            | $10 20 30 -> "10","20","30"
       $    / pad right by left                 | 5$"abc" -> "abc  "
  (   )     / do the stuff in brackets together |
    #x      / count x                           | #10 20 30 -> 3
   -        / negate                            |
,/          / flatten (concatenate-over)        | ,/" a"," b"," c" -> " a b c"


0

C #, 39 байт

s=>s.ConvertAll(c=>c.PadLeft(s.Count));

Принимает List<string>и выводит List<string>.

Объяснение:

/*Func<List<string>, List<string>> Lambda =*/ s =>
    s.ConvertAll(c =>                                // Create a new List<string> by...
        c.PadLeft(s.Count)                           // ...padding each element by 'N'
    )
;

Было бы на несколько байтов короче использовать LINQ, если импорт не учитывается, а затем возвращается IEnumerable<string> вместо полного списка:

C #, 35 + 18 = 53 байта

using System.Linq;s=>s.Select(c=>c.PadLeft(s.Count));

0

R, 47 байт

cat(sprintf("%*.f",length(n<-scan()),n),sep="")

Читает ввод из stdin и использует форматирование в стиле C с sprintf. Должен быть какой-то способ, которым catфункция не нужна, но не мог найти способ подавить кавычки на каждом элементе без него. Если нам нужны только начальные и конечные кавычки, мы можем использовать немного более длинную опцию:

paste0(sprintf("%*.f",length(n<-scan()),n),collapse="")
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.