Розпакуйте деякі цифри


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

Пітон 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

Останній номер якось зі мною заплутався. Я, можливо, зможу видалити друге, якщо твердження, якщо я перегляну його пізніше.

EDIT: від Thx до mbomb007 для видалення 3 байтів. Дякуємо charredgrass за поради щодо форматування, які допоможуть видалити багато та багато байтів! :-D Дякую TheBikingViking за допомогу з ще двома байтами!


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

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

Спасибі ! Це дуже допомагає в цьому, і я обов'язково маю це на увазі в майбутньому гольфінгу
Джеремі

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

У чому сенс використання range(1,11)і що потім (i-1)?
Leaky Nun

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вказуючи цикл, завдяки Деннісу.

EDIT: Я взяв дещо інший підхід і врятував ще два байти.


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 байтів, що мають 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

Пітон, 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фактичний новий рядок, ви можете зберегти байт.
Mama Fun Roll

1
@Titus Про що ти говориш? Цей "фрагмент" є функцією.
NiCk Newman

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

@MamaFunRoll У мене це було, але я не зміг завершити "" і зробити .length, тому я не був на 100% впевнений, що я був у чистоті - додаду це в :)
Чарлі Вайн

1

Python 2.7, 113 108 77 байт

n = вхід ()
для 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 - булевий дозволь мені позбудьтеся оператора if, який дозволить мені позбутися всієї змінної v. Дуже круто.

Моя версія:

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

Приємна відповідь і ласкаво просимо на сайт! Ви можете зняти 9 байт, змінивши рівень відступу на 1 простір замість 4.
DJMcMayhem

Насправді, ви можете зробити це ще коротше з цим: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

Пітон 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%. Можливо, можна трохи більше пограти в гольф.

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


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)
    дзвінками в cli з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

Лист звичайний (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"--~%")))))))

необроблений:

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