Розміщені числа


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 так.
Conor O'Brien

Відповіді:



16

Пітон, 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("")він не потрібен.
Conor O'Brien

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 провідних пробілів
  • $@ - це список всіх переданих аргументів
  • Специфікатор формату повторно використовується для кожного учасника $@.

Ідеон .


4

Вім, 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

Математика, 25 байт

#~StringPadLeft~Length@#&

І вхід, і вихід - це списки рядків.

Пояснення

Length@#

Отримайте довжину вводу (кількість елемента).

#~StringPadLeft~...

Прокладка залишила кожен елемент на вході так, щоб їх довжини відповідали довжині вводу.


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

Певна версія 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);
Крипто

2

J, 4 байти

":~#

Спробуйте в Інтернеті!

Одинарна функція, яка приймає список чисел праворуч як масив і повертає прокладений рядок.

Ось він використовується в системі REPL. Зауважте, що рядки введення мають відступ три пробіли.

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

Ого. Ви перемогли моє опорне рішення в J! Дуже хороша.
Conor O'Brien


1

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

Гольф:

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

Безголівки:

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(воно було б коротше, з одного боку), але заява про імпорт вбиває будь-які заощадження, зроблені на самій функції.


1

Java, 83 82 байти

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

Побудує рядок формату, призначений для розміщення заданих аргументів на кількість пробілів, рівних довжині масиву. Рядок формату використовується як аргумент для String.format, а результат потім повертається. Функціональний інтерфейс може приймати або String[]або, 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. Ви можете int ...s+=...iffor(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

K (oK) , 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));

Бере a List<string>і виводить a 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="")

Зчитує вхідні дані зі стандартного вводу і використовує C-стиль форматування з sprintf. Має бути якийсь спосіб, коли catфункція не потрібна, але не вдалося знайти спосіб придушити лапки кожного елемента без неї. Якщо ми хочемо лише початкових і кінцевих лапок, ми можемо скористатися дещо довшим варіантом:

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