Распаковать несколько цифр


21

Ваша задача - создать программу или функцию, которая генерирует молнию длиной 10 строк. Каждая строка молнии представлена ​​двумя штрихами --:

--
--
--
--
--
--
--
--
--
--

Программа / функция будет брать процент (делится на 10) в качестве входных данных, а на выходе будет молния, «расстегнутая» (разделенные тире) сверху, в процентах, показывая 1-индексированный, самый низкий уровень, повторенный 2 раза, с все предыдущие уровни повторяются 4, 6, 8 и т. д. раз, сохраняя при этом основание молнии по центру.

Примеры

>>10%
-11-
 --
 --
 --
 --
 --
 --
 --
 --
 --

>>50%
-1111111111-
 -22222222-
  -333333-
   -4444-
    -55-
     --
     --
     --
     --
     --

>>100%
-11111111111111111111-
 -222222222222222222-
  -3333333333333333-
   -44444444444444-
    -555555555555-
     -6666666666-
      -77777777-
       -888888-
        -9999-
         -10-

Ввод (в процентах) можно отформатировать по своему усмотрению (50%, .5, 50, 5 [подразумевается ноль] и т. Д.), И он всегда будет в диапазоне от 0 до 100 и делится на 10. Интервал в примеры должны быть сохранены в вашем выводе.


Может ли вход когда-либо быть 0%? Разрешено ли нам принимать входные данные, разделенные на 10? например, вместо того 50%, чтобы получить 5?
DJMcMayhem

1
Ввод (в процентах) может быть отформатирован так, как вам нравится (50%, .5, 50), это может быть просто 5?
Луис Мендо

@DrGreenEggsandIronMan ввод может быть 0%, и вы можете взять ввод в наиболее удобном формате.
атласолог

@ LuisMendo, да, я отредактирую это в вопросе, спасибо.
атласолог

Принимается ли разрыв строки вместо завершающего? Абсолютное дополнение допустимо?
Тит

Ответы:


10

Python 2 - 184 151 146 байт

def r(n):
  n/=10
  for i in range(1,11):
    if n<0:print"%s--"%p
    elif i>9:print" %s-10-"%p
    else:p=" "*~-i;print"%s-%s-"%(p,`i`*2*n);n-=1

Последнее число вроде меня немного запутало. Я мог бы удалить второе утверждение if, если посмотрю на него позже.

РЕДАКТИРОВАТЬ: Thx в mbomb007 для удаления 3 байтов. Спасибо charredgrass за советы по форматированию, которые помогут удалить много-много байтов! :-D Спасибо TheBikingViking за помощь еще с двумя байтами!


1
Используйте i>9вместо i==10и удалите пространство в range(1, 11).
mbomb007

1
Небольшой совет для игры в гольф на python: вы сокращаете много байтов из пробелов, сжимая свои утверждения в одну строку. Например, последние 3 строки могут стать p=" "*(i-1);print"%s-%s-"%(p,str(i)*2*n);n-=1.
Charredgrass

Благодарность ! Это очень помогает с этим, и я определенно буду иметь это в виду в будущем игре в гольф
Джереми

1
Вы можете сбрить 2 байта, заменив (i-1)в последней строке на ~-i. Это использует преимущество приоритета оператора и тот факт, что переворот, за которым следует отрицание, аналогичен вычитанию 1.
TheBikingViking

Какой смысл использовать range(1,11)и тогда (i-1)?
Утренняя монахиня

10

Python 2, 74 байта

n=input()
x=0
exec"print' '*x+'-'+`x+1`*(n-x<<1-x/9)+'-';x=min(x+1,n);"*10

execБлагодаря Деннису удалось сэкономить два байта, увеличив цикл.

РЕДАКТИРОВАТЬ: я выбрал немного другой подход и сохранил еще два байта.


1
Вы можете сохранить 2 байта, используя форматирование строки, заменив '-'+`x+1`*(n-x<<1-x/9)+'-'в execцикле на '-%s-'%`x+1`*(n-x<<1-x/9).
Р. Кап

Нет, мне нужны парни во всем `x+1`*(n-x<<1-x/9).
Линн

4

PowerShell v2 +, 130 120 116 110 байт

param($n)$i=0;10..1|%{" "*$i+(("-"+("$($i+1)"*([math]::Max($n-10+$_,0))*2)),"-10")[$n-$_-eq9]+"-";$i+=$i-ne$n}

Редактировать 1 - Гольф 10 байтов, исключая $xпеременную и слегка переделывая, как формулируется строка.
Редактировать 2 - Гольф еще 4 байта, переделав, как происходит ввод и повторив, как $iрассчитывается каждый цикл.
Редактировать 3 - Сохранено 6 байтов с помощью OP, что позволяет вводить как 0..10, так что нет необходимости делить на 10.

Удивительно сложно!

Принимает данные как 1, 5и т.д., сохраненные в $n. Устанавливает вспомогательную $iпеременную (один из очень редких случаев, когда переменная должна быть инициализирована 0в PowerShell), а затем запускает цикл из 10в 1.

На каждой итерации мы устанавливаем начало нашей строки с количеством пробелов, равным $i, за которым следует псевдо-троичный (... , ...)[]. Внутри псевдо-троичного мы выбираем строку -с числом цифр (большее из $n-10+$_или 0, умноженное на 2) или строку -10- выбор основан на том, находимся ли мы на 10-й итерации, и наш ввод был 100, Мы объединяем это с финалом -. Эта результирующая строка помещается в конвейер.

Наконец, мы увеличиваем $i, и это было действительно сложно. Мы использовали трюк двоичного приведения-к-целому, чтобы только увеличивать его $iдо тех пор, пока он не достигнет $n, а затем сохранить его на том же значении. Это гарантирует, что мы достигли «конца» отступа молнии на соответствующем уровне.

После завершения цикла все результирующие строки накапливаются в конвейере и вывод неявен.

Примеры

PS C:\Tools\Scripts\golfing> .\unzip-some-numbers.ps1 70
-11111111111111-
 -222222222222-
  -3333333333-
   -44444444-
    -555555-
     -6666-
      -77-
       --
       --
       --

PS C:\Tools\Scripts\golfing> .\unzip-some-numbers.ps1 100
-11111111111111111111-
 -222222222222222222-
  -3333333333333333-
   -44444444444444-
    -555555555555-
     -6666666666-
      -77777777-
       -888888-
        -9999-
         -10-


3

Python, 95 84 байта

Я не знал, что лямбды были законны, спасибо @Dr Green Eggs и Iron Man

lambda p:'\n'.join(' '*min(p,l)+'-'+(2-(l==9))*(p-l)*str(l+1)+'-'for l in range(10))

1
Эй, отличный первый ответ! Вы можете переместить его из списка понимания, чтобы сохранить 2 байта, joinможете взять генератор напрямую.
Морган Трепп

2
Вы можете сделать лямбду вместо печати. С предложением Моргана: lambda p:'\n'.join(' '*min(p,l)+'-'+(2-(l==9))*(p-l)*str(l+1)+'-'for l in range(10))(84 байта)
DJMcMayhem


1

Рубин, 74 байта

Использует формат подразумеваемого нуля, указанный в вопросе, так же, 40%как f[4]если анонимная функция назначена f. Если необходим полный процент, +6 байт дляn/=10;

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

->n{10.times{|i|puts' '*[i,n].min+"-#{i>8?10:(i+1).to_s*2*(n-i)if i<n}-"}}

1

Python 3, 98, 90, 87 , 85 байтов.

Принимает число, уже разделенное на 10. Я, вероятно, могу удалить некоторые из паренов, но это довольно близко к полному гольфу.

lambda n:'\n'.join(' '*min(i,n)+'-%s-'%(str(i+1)*(n>i>8or(n-i)*2))for i in range(10))


1

Javascript es7, 105 байт

A=>[...Array(10)].map((a,i)=>' '.repeat((d=A<i)?A:i)+('-'+(i+1+'').repeat(d?0:i<9?2*(A-i):1)+'-')).join`
`

позвонить с

f=A=>[...Array(10)].map((a,i)=>' '.repeat((d=A<i)?A:i)+('-'+(i+1+'').repeat(d?0:i<9?2*(A-i):1)+'-')).join`
`


f(10)
f(5)
f(0)

The program/function ...- не фрагмент
Тит

1
Если вы замените \nфактический символ новой строки, вы можете сохранить байт.
Мама Fun Roll

1
@ Titus О чем ты говоришь? Этот «фрагмент» является функцией.
NiCk Ньюман

1
ну правильно. ES7 я забыл.
Тит

@MamaFunRoll У меня было это, но я не мог обернуть "" и сделать. Длина, поэтому я не был на 100% уверен, что я был в чистоте - я добавлю это :)
Чарли Уинн

1

Python 2.7, 113 108 77 байт

n = input ()
для x в диапазоне (0,10):
v = str (x + 1) * (nx) 2,
если x
n> 89: v = '10 '
print' '* min (x, n) + '-' + v + '-'

Первый раз играл в гольф. Собираюсь продолжать, попробуйте получить его <100.
Предполагается, что ввод 1-10.

Редактировать: Использовал некоторые трюки из ответа @LeakyNun (спасибо), затем хрустнул его немного дальше и получил ... в основном тот же ответ: / Не знал о преобразовании строки `int`, и 2 - boolean, позвольте мне избавиться от оператора if, который позволяет мне избавиться от всей переменной v. Очень круто.

Моя версия:

n=input()
for x in range(10):print' '*min(x,n)+'-'+`x+1`*(n-x)*(2-(x>8))+'-'

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

На самом деле, вы могли бы сделать это еще короче с этим:n=input(); for x in range(0,10):print' '*min(x,n)+'-'+('10'if x*n>89 else str(x+1)*(n-x)*2)+'-'
DJMcMayhem


0

Python 2.7, 110 99, 95, 91 байт:

G=input();i=1;exec"print' '*[~-i,G][i>G]+'-%s-'%[`i`*(2*-~G-i*2),'10'][(i>9)*G>9];i+=1;"*10

Полная программа, которая принимает входные данные целым числом в включающем диапазоне [1,10], где 10означает 100%и 1означает 10%. Вероятно, можно играть в гольф немного больше.

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


0

PHP 5.3, 92 91 байт

<?for(;$i<10;$i++)echo'
'.str_pad('-'.str_repeat($i+1,$n>9&&$i>8?:($n-$i)*2).'-',22,' ',2);
  • для PHP 5.3 с register_globals=1и short_open_tags=1error_reporting=0)
    вызов в кли сphp-cgi -f <filename> n=<number>
  • число от 0 до 10

  • позвонить в веб-браузере с помощью <scriptpath>?n=<number>: prepend<pre>
  • для 4.0.1 <PHP <5.3: заменить ?:на ?1:(+1)
  • для PHP> = 5.4: заменить первое $nна ($n=$_GET[n])(+11)

разгрузить как функцию (любой PHP> = 4.0.1)

function unzip($n) // $n from 0 to 10
{
    for($i=0;$i<10;$i++)                // $i = line number -1
        $s.='
'.str_pad(                              // pad the result of the following on both sides
            '-'.                            // prepend '-'
            str_repeat($i+1,                // print line number
                ($n>9&&$i>8 ? 1             // in tenth line, if $n is 10: once
                : ($n-$i)*2)                    // else  2*($n-$i) times
            ).'-'                           // append '-'
            , 22,' ', STR_PAD_BOTH);    // pad to 22 width with SPC on both sides
    return $s;
}

тестирование

echo'<table border=1><tr>';
for($i=0;$i<11;$i++)echo'<th>',$i*10,'%</th>';
echo'</tr><tr>';
for($i=0;$i<11;$i++)echo'<td><pre>', unzip($i), '</pre></td>';
echo '</table>';

Теперь для меня это ново: PHP превосходит JavaScript.
Я думаю, что этот подход очень важен.


STR_PAD_BOTHЧто это, K & R C? У нас #defineтоже есть вещи в PHP? :-)
кошка

@cat: да, в PHP есть реальные определения. но только статичный; не как в C.
Тит


0

Perl, 122 байта

$k=<>;for(my $i=0;$i++<10;){$s="-"."$i"x($k/10-$i+1);$p=length $s;$l=$l>$p?$l:$p;printf "%${l}s%s\n",$s,scalar reverse $s}

0

Common Lisp (Lispworks), 314 байт

(defun f()(let((s(string(read))))(let((n(/(parse-integer(subseq s 0(1-(length s))))10)))(if(> n 0)(progn(dotimes(r n)(progn(dotimes(c r)#1=(format t" "))(format t"-")(if(=(1+ r)10)(format t"10")(dotimes(j(* 2(- n r)))(format t"~S"(1+ r))))(format t"-~%")))(dotimes(d(- 10 n))(dotimes(c n)#1#)(format t"--~%")))))))

ungolded:

    (defun f ()
      (let ((s (string (read))))
        (let ((n (/ (parse-integer (subseq s 0 (1- (length s)))) 10)))
          (if (> n 0)
              (progn
                (dotimes (r n)
                  (progn
                    (dotimes (c r)
                      (format t " "))
                    (format t "-")
                    (if (= (1+ r) 10)
                        (format t "10")
                      (dotimes (j (* 2 (- n r)))
                        (format t "~S" (1+ r))))
                    (format t "-~%")))
                (dotimes (d (- 10 n))
                  (dotimes (c n)
                    (format t " "))
                  (format t "--~%")))))))

Использование:

    CL-USER 2515 > (f)
    10%
    -11-
     --
     --
     --
     --
     --
     --
     --
     --
     --
    NIL

    CL-USER 2516 > (f)
    50%
    -1111111111-
     -22222222-
      -333333-
       -4444-
        -55-
         --
         --
         --
         --
         --
    NIL

    CL-USER 2517 > (f)
    100%
    -11111111111111111111-
     -222222222222222222-
      -3333333333333333-
       -44444444444444-
        -555555555555-
         -6666666666-
          -77777777-
           -888888-
            -9999-
             -10-
    NIL

0

APL, 46 байт

{↑(⍳10){(''↑⍨1-⍺⌊a+1),1⌽'--',⍵⍴⍕⍺}¨10↑2×⌽⍳a←⍵}

Аргумент должен быть задан в виде процента, деленного на 10 (то есть: простое целое число в диапазоне [0,10]).

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