Автоматизуйте свою вправу підрахунку першого класу


36

CodeGolf Challenge

PWSSHHHH! Ви прокидаєтесь у лабораторії кріогеніки у 3000 році. Після супроводу до офісу присвоєння, щоб отримати ваш кар'єрний чіп, імовірно, хлопчика з доставки, зонд виявляє, що ви з 2000 року. Через це і кілька стереотипи, ви вважаєтесь дурним порівняно з сучасною людиною сьогодні і змушені повторювати класи школи.

Ви входите до свого класу першого класу, і вчитель дає завдання. Вона скаже або запише число до 50. Якщо вона запише число на дошці (наприклад, 25), то вам слід сказати числа до цього числа "один, два, три, ..., двадцять п'ять ". Якщо вона говорить цифру вголос (наприклад: "шість"), тоді на своєму планшеті потрібно записати цифри до цього числа "1, 2, 3, 4, 5, 6"

Це стає дуже стомлюючим, і ви вирішите, що ви автоматизуватимете процес із вашими ще функціонуючими, але архаїчними знаннями з програмування 21 століття.


Мета:

Ваша програма повинна взяти вклад. Цей вхід буде або десятковим числом ( 1 thru 50), або числом, що списується ( one thru fifty).

• Якщо вхід є десятковим числом, ваш вихід повинен рахувати від одного до вказаного числа, використовуючи стиль виписання. (наприклад, тридцять два )

• Якщо вхід - це списане число, ваш вихід повинен рахувати від 1 до вказаного числа, використовуючи десятковий стиль. (наприклад, 32 )


Правила:

Введення та вихід можуть бути у будь-якому обраному вами випадку (тому ви можете зробити програму, яка приймає лише великі регістри за бажанням).

Десяткові числа, що вводяться, не повинні мати тип числа (наприклад, int), вони можуть бути рядком введення, що містить числа (25 проти "25"). Або це добре, і ви можете вибрати, яку саме програму ви бажаєте прийняти. (Вашій програмі не потрібно приймати обидва)

Списаний стиль НЕ вимагає дефісів між складними словами, але ви можете за бажанням.

Вихідні значення повинні бути відокремлені в якійсь формі, будь-який роздільник є нормальним 1,2,3 1 2 3 etc

Ви не можете додати додаткові бібліотеки, як num2words (python) тощо (Однак системні бібліотеки чудово)

Незважаючи на те, що в бек-сюжеті написано, що ви з 2000 року, ви можете використовувати мови, створені після цієї дати (lol)


Це , тому програма з найменшим виграшним рахунком виграє!


1
Чи дозволяється нам використовувати бібліотеки на зразок num2words у випадку python.
Гурупад Мамадапур

1
@AlbertRenshaw але що з вбудованими, які роблять це? (Mathematica)
Павло

1
@coredump Або означає, що ви можете вибрати одне або інше або те і інше. Це не повинно бути в змозі обробити обидва види входів
Альберт Реншо

2
"Укуси мою блискучу металеву дупу!" Я не буду рахувати себе
RaisingAgent

1
Я продовжую думати, що заголовок "ваш перший (підрахунок класу)", а не "ваш (перший клас) підрахунок"
CAD97

Відповіді:


32

Perl 6 , 119 113 байт

{my \n=<①     ㊿>.map:{|map *.uniname.words[2..*].join,$^a..$^b}
/\d/??n[^$_]!!1..1+first $_,n,:k}

База даних Unicode FTW!

Використовується виписані великі регістри без гіперзону, наприклад TWENTYTWO.
Повертає список рядків або діапазон чисел. (Обидва використовують простір як роздільник при друкуванні put.)


3
Дуже розумна ахахаха! Любіть це
Альберт Реншо

13

Python3, 276 271 269 243 237 235 232 217 байт

Візьміть підказку з подання @smls perl ...

from unicodedata import*
o=[name(chr(k)).split(' ',2)[-1]for j in['①⑴','㉑㉠','㊱㋀']for k in range(ord(j[0]),ord(j[1]))]
i=input()
w=i in o
for i in range(w and o.index(i)+1or int(i)):print(w and i+1or o[i])

Я підозрюю, що це може бути трохи більше.

Він використовує системну бібліотеку unicodedataдля пошуку імен для чисел. У FORTY TWOякості введення потрібні імена верхнього регістру (розділені пробілом :) або десяткових цілих чисел.

(Це моє перше подання коду для гольфу.)

(Я також щойно помітив, що я неправильно рахував довжину (кодування), тому це на кілька байт менше, ніж вважалося раніше. Хоча я лише оновив останню кількість байтів. На жаль.)


Ласкаво просимо до PPCG!
AdmBorkBork

У пропагандистській діяльності: unicodedataце системна бібліотека, яка поставляється з установкою за замовчуванням, а не "додаткова" бібліотека, яку потрібно встановлювати окремо.
Унайок

Ласкаво просимо на сайт! Ви можете видалити з коду багато пробілів .
xnor

1
Ласкаво просимо до PPCG. Ви можете втратити 3 байти, помістивши друк всередину forциклу і встановивши нові рядки між кожним висновком. print()не важливо, якщо це ціле число чи рядок. Спробуйте в Інтернеті!
ElPedro

1
Я думаю, ви можете import*замість того, import nameщоб зберегти пару байтів
Пшеничний майстер

10

Лисп звичайний, 297 253 243 242 144 128

(lambda(s)(#1=dotimes(u(or(#1#(i 51)(if(equal(#2=format()"~R"i)s)(return i)))s))(#2#t"~[~:;, ~]~:[~R~;~D~]"u(stringp s)(1+ u))))

Деталі

(lambda (s) 
  (dotimes                         ; iterate...                                                                          
      (u                           ; for u from zero below ...                
       (or                         ; if s is a string, then                   
        (dotimes (i 51)            ;   parse s by iterating from 0 to 50      
          (if (equal               ;   until we find a match between          
               (format nil "~R" i) ;   the English word(s) for i              
               s)                  ;   and the given s                        
              (return i)))         ;   (exit loop)                            
        s))                        ; otherwise, use s, which is a number      
    (format t                      ; for each U, print to standard output     
            "~[~:;, ~]~:[~R~;~D~]" ; (see below for details)                  
            u                      ; ...                                      
            (stringp s)            ; ... arguments to format                  
            (1+ u))))              ; ...                                      
  • ~[ 0 ~; 1 ~; ... ~:; else ~]являє собою перемикач, заснований на наступному доступному значенні аргументу, яке переходить у відповідний формат підконтролю. Тут у мене є лише випадок "0" і для "else". Це використовується для вставлення роздільника перед кожним числом, крім першого, завдяки U, починаючи з нуля.

  • ~:[ FALSE ~; TRUE ~]- умовний формат; тут ми виводимо речі по-різному, вхідний s - це рядок чи ні.

  • ~Rнаписати число як кардинальний англійський номер, тоді як ~Dпросто друкує число.

Приклади

CL-USER> (test "five")
1, 2, 3, 4, 5

CL-USER> (test 32)
one, two, three, four, five, six, seven, eight, nine, ten, eleven, twelve, thirteen, fourteen, fifteen, sixteen, seventeen, eighteen, nineteen, twenty, twenty-one, twenty-two, twenty-three, twenty-four, twenty-five, twenty-six, twenty-seven, twenty-eight, twenty-nine, thirty, thirty-one, thirty-two

З того, що я розумію в цьому питанні, ви повинні вміти розбирати обидва стилі, а не лише один, тому ваше 55-байтне рішення може бути недійсним. "Вашій програмі не потрібно приймати обоє" - це посилання на 25 проти "25", десяткову як число або як рядок.
Том

@TomDevs Дякую Це, безумовно, заплутано. Безумовно, якщо я визначу fтак, що "(f 2)" друкує "один, два" та (f "two")друкує "1, 2", чи це вам добре виглядає?
coredump

Так, я думаю, що це правильно.
Том

@TomDevs Спасибі, я це виправив
coredump

1
@AlbertRenshaw Ні, тільки англійська; ця особливість може вже вважатися роздутою, але оскільки вона вже була реалізована в деяких Lisps, вона була стандартизована.
coredump

8

JavaScript ES6, 559 526 381 368 364 358 332 327 315 байт

a="one0two0three0four0five0six0seven0eight0nine0ten0eleven0twelve0thir10four10fif10six10seven10eigh10nine1".replace(/1/g,'teen').split(0),b="twenty0thirty0forty0fifty".split(0),c=(n,d=Array,e=b.forEach(i=>a=a.concat(i,a.slice(0,9).map(x=>i+x))))=>1/n?a.slice(0,n).join():d.from(d(a.indexOf(n)+1),(x,i)=>i+1).join();

Дякуємо Kritixi Lithos за ідею розділити масив та Arnauld за фокус 1 / n.

a="one0two0three0four0five0six0seven0eight0nine0ten0eleven0twelve0thir10four10fif10six10seven10eigh10nine1".replace(/1/g,'teen').split(0),b="twenty0thirty0forty0fifty".split(0),c=(n,d=Array,e=b.forEach(i=>a=a.concat(i,a.slice(0,9).map(x=>i+x))))=>1/n?a.slice(0,n).join():d.from(d(a.indexOf(n)+1),(x,i)=>i+1).join();

console.log(c("twentyfive"));
console.log(c("fifty"));
console.log(c(50));


1
Ви можете видалити varі ви можете змінити масив ['one,'two',..]на"one0two0three0...".split(0)
Kritixi Lithos

Надлишкові пробіли при null, Array(n).
Yytsi

2
Ви можете замінити !isNaN(n)на 1/n. Це дає вам NaNдля рядка (фальш), ненульового поплавця для ненульового цілого числа (truthy) або Infinityдля 0 (також truthy).
Арнольд

Додайте 4 пробіли перед кожним рядком коду
sagiksp

@sagiksp Так, напевно, щось зіпсували під час редагування публікації, слід виправити зараз :)
Том

6

Python 2 , 503 499 494 490 479 байт

-5, завдяки @JonathanAllan

l='one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nine#'.replace('#','teen ').split()
m='twenty','thirty','forty','fifty'
i,z,R=raw_input(),' ',range
try:n=int(i);p=(n/10)-2;o=(l+sum([[m[x]]+[m[x]+z+l[y]for y in R(9)]for x in R(p)],[])+[m[p]]+[m[p]+z+l[y]for y in R(n%10)],l[:n])[n<20]
except:j=i.split();o=map(str,R(1,(m.index(j[0])+2)*10+l.index(j[1])+2if z in i else l.index(i)+2if i in l else(m.index(i)+2)*10+1))
print','.join(o)

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

Введіть або число, або пробіл, відокремлений пробілом.

Трохи менш гольф і читабельніша версія:

l='one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen'.split()
m='twenty','thirty','forty','fifty'
i=raw_input()
try:
 n=int(i)
 if n<20:
  o=l[0:n]
 else:
  o=l
  for x in range((n/10)-2):
   o+=[m[x]]+[m[x]+' '+l[y]for y in' '*9]
  p=m[(n/10)-2]
  o+=[p]+[p+' '+l[y]for y in' '*n%10]
except:
 if' 'in i:
  t=i.split()
  s=((m.index(t[0])+2)*10)+l.index(t[1])+2
 else:
  s=l.index(i)+2 if i in l else((m.index(i)+2)*10)+1
 r=range(1,s)
 o=map(str,r)
print','.join(o)

1
6 байт зберегти за допомогоюl="one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nin#".replace("#","teen ").split()
Джонатан Аллан

... oops 5, пропустив eз nineteen.
Джонатан Аллан

Чи є причина, що вам потрібно використовувати Python 2, без цього друк був би довшим, але raw_input міг би бути просто введенням? (Те саме питання до вашої іншої відповіді)
nedla2004,

@ nedla2004 - Ні за що, крім того, мені ще не вдалося встановити Python 3 на моєму останньому ноутбуці :-)
ElPedro

6

Схема, 161 , 152 , 149

(define (c x)(let((r(string->number x)))(let l((i 1))(let((n (format #f "~r" i)))(display(if r n i))(newline)(or(eq? r i)(equal? x n)(l (+ i 1)))))))

Без стиску:

(define (count limit)
  (let ((numerical-limit (string->number limit)))
    (let l ((i 1))
      (let ((current-number (format #f "~r" i)))
        (display (if numerical-limit current-number i))
        (newline)
        (or (eq? numerical-limit i)
            (equal? limit current-number)
            (l (+ i 1)))))))

Як перетворити з, наприклад, "чотири" на 4? Я не впевнений, string->numberчи так це, я перевірив швидко, і, здається, він використовується для перетворення, наприклад, з рядка "4"в число 4.
coredump

@coredump Це правильно. (string->number "four")повертає #f.
Michael Vehrs

За якою схемою ви працюєте?
coredump

1
@coredump guile 2.0.9
Michael Vehrs

6

PHP - 397 372 349 344 329 байт

Натхненний рішенням JS від TomDevs

Збережено 25 байт, замінивши $a=[...]на$a=explode(...)

Збережено ще 23 байти, повернувшись до масиву без teenрозділових рядків та зберігаючи змінну, завдяки @ user59178

Збережено ще 5 байт, видаливши (int)набір даних

Додано ще 15 байт шляхом скидання $b, в $iв forдекларації, і фігурні дужки, завдяки @ user59178 знову

$a=[one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir.$t=teen,four.$t,fif.$t,six.$t,seven.$t,eigh.$t,nine.$t];foreach([twenty,thirty,forty,fifty] as$c){$a[]=$c;for($i=0;$i<9;)$a[]=$c.'-'.$a[$i++];}if($argv[1]!=0)for($i=0;$i<$argv[1];)echo$a[$i++].' ';else for($i=1;$i<=array_search($argv[1],$a)+1;)echo$i++.' ';

Безголовки:

$a =[one,two,three,four,five,six,seven,eight,nine,ten,eleven,‌​twelve,thir.$t=teen,‌​four.$t,fif.$t,six.$‌​t,seven.$t,eigh.$t,n‌​ine.$t];
foreach ([twenty,thirty,forty,fifty] as $c){
    $a[] = $c;
    for ($i=0;$i<9;)
        $a[] = $c . '-' . $a[$i++];
}
if( $argv[1] !=0 )
    for ($i=0;$i<$argv[1];)
        echo $a[$i++] . ' ';
else
    for ($i=1;$i<=array_search($argv[1], $a)+1;)
        echo $i++ . ' ';

Спробуйте його для вхідного рядка або для вхідного номера


1
При гольфі ви можете використовувати безліч лапок прямо без жодних лапок, включаючи все число, яке ви використовуєте. Це викликає повідомлення, але це можна ігнорувати. Крім того, коротше (на 2 цілих байти) зберігати teenзмінну, а не повторювати її кожен раз. Як таке воно стане:$a=[one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir.$t=teen,four.$t,fif.$t,six.$t,seven.$t,eigh.$t,nine.$t];
user59178

Не думав про це, дякую;)
roberto06

Ви можете зберегти ще 7 байтів, скинувши $bі ввівши другий масив прямо в foreach, ще 6 байт, скинувши всі фігурні дужки (хоча вам потрібно ввести $a=$cконфігурацію для циклу for) і ще 6 байт шляхом інкрементування $iколи ви використовуєте його, а не в "after" біті циклів.
користувач59178

Збережіть шість байтів (два на цикл), перемістивши приріст із значка "в" на наступний рядок:for ($i=0;$i<9;)$a[]=$c.'-'.$a[$i++];
Олексій Хованський

Ой, вибачте, щойно помітив, що @ user59178 запропонував те саме ...
Alex Howansky

6

Python 2, 262 байти

x="one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nine#".replace("#","teen ").split()
x+=[a+"ty"+b for a in"twen","thir","for","fif"for b in['']+x[:9]]
v=input()
for s in range(1,x.index(v)+2)if v>50else x[:v]:print s

repl.it

Рядки введення та виведення є малі та з’єднані *, тому для тестування рядкового вводу введіть, наприклад, "thirtyfive" підказку.

Створює список усіх слів (плюс "fiftyone"до "fiftynine"), xа потім перевіряє, чи inputє слово з проксі v>50(рядки перевищують числа в Python 2, і всі числа у допустимому діапазоні введення від специфікації є <=50) і prints відповідні значення, нарізавши список,x[:v] або будувати діапазон цілих чисел, range(1,x.index(v)+2).

* Додавання переносу на обох коштує 11 байтів, замінивши a+"ty"bна a+"ty"+'-'*(b>'')+b.


5

Мова Вольфрам, 92 байти

If[NumberQ@#, Do[Print@IntegerName@i, {i, #}], 
  Do[Print@i, {i, Interpreter["SemanticNumber"]@#}]] &

(Я новачок у цьому, дайте мені знати, чи зробив я щось не так)


2
-10 байт:Do[Print@If[#>0,i,,IntegerName@i],{i,If[#>0,#,,Interpreter["SemanticNumber"]@#]}]&
JungHwan Мін.

5

JavaScript (ES6), 261 байт

Примітка: рядок, призначений z, закодований atob. У кодованому рядку є 11 байт, які я не можу розміщувати на цьому сайті, навіть якщо вони є дійсними символами в рядку javascript. Тому я використав шістнадцятковий втечу у вигляді \ xHH. Кожна з цих вхідних місць рахується як 1 байт.
Оригінальна нестиснена струна - це менш гольф- версія.

x=>(z=btoa('ö\x89ÞöÜ(öØkyï_¢êý~+Þöȱöǯz\x7f^\x8a\x08möx§{Û^\x9f×¥z÷§öÜ\x1e\x96÷½¶\x18«÷×â\x7fß}z(!÷Ûpz\x7f}~\x8aý').split(9),o=(0+z.map((v,i)=>i<20?i<13?v:(v||z[i-10])+'teen':z.slice(0,10).map(d=>(z[i]||z[i-8]||z[i-18])+'ty'+d))).split`,`,p=o.indexOf(x),o.slice(1,-~x+p+!~p).map((x,i)=>~p?i+1:x))

Менше гольфу

x => (
  z = '9one9two9three9four9five9six9seven9eight9nine9ten9eleven9twelve9thir99fif999eigh99twen99for9'
      .split(9),
  o = (0 + // 0 + array to build a comma separated string
       z.map( (v, i) => 
         i < 20 
         ? i < 13 
           ? v // 1 to 13 are 'as is'
           : (v||z[i-10])+'teen' // compose for 14 to 19
         : z.slice(0,10).map(d=>(v||z[i-8]||z[i-18])+'ty'+d)) // 20s, 30s, 40s, 50s
      ).split`,`, // from comma separated to array again
  // o contains strings from one to fiftynine
  p = o.indexOf(x), // look for input
  o.slice(1, -~x+p+!~p).map((x,i) => ~p?i+1:x)
)

Тест

F=
x=>(z=btoa('ö\x89ÞöÜ(öØkyï_¢êý~+Þöȱöǯz\x7f^\x8a\x08möx§{Û^\x9f×¥z÷§öÜ\x1e\x96÷½¶\x18«÷×â\x7fß}z(!÷Ûpz\x7f}~\x8aý').split(9),o=(0+z.map((v,i)=>i<20?i<13?v:(v||z[i-10])+'teen':z.slice(0,10).map(d=>(v||z[i-8]||z[i-18])+'ty'+d))).split`,`,p=o.indexOf(x),o.slice(1,-~x+p+!~p).map((x,i)=>~p?i+1:x))

function update() {
  var i=I.value
  O.textContent = F(i)
}  

update()
<input id=I value=25 oninput='update()'><pre id=O></pre>


ö\x89ÞöÜ(öØ...ця штука чудова хахаа
Альберт Реншо

Відповідно до вашої головної
Альберт Реншо

5

Python 3 , 305 303 байт

Перетворено на Python 3 за порадою від @ nedla2004. Тепер також немає місця між записаними цифрами на вході або виході, наприклад введіть двадцять два

l='one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nine#'.replace('#','teen ').split()
m='twenty','thirty','forty','fifty'
i,R=input(),range
l+=sum([[m[x]]+[m[x]+l[y]for y in R(9)]for x in R(3)],[])
for x in R(1,l.index(i)+2)if i in l else l[:int(i)]:print(x)

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

Python 2 , 327 320 313 308 байт

l='one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nine#'.replace('#','teen ').split()
m='twenty','thirty','forty'
i,R=raw_input(),range
l+=sum([[m[x]]+[m[x]+l[y]for y in R(9)]for x in R(3)],[])+['fifty']
for x in R(1,l.index(i)+2)if i in l else l[:int(i)]:print x

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

163 170 177 байт коротше моєї оригінальної відповіді, тому я публікую це як альтернативу. Це використовує forу двох списках для складання повного списку всіх рядкових представлень чисел, а потім ідентифікує правильне у списку та друкує все, що до нього, або за значенням, або за індексом. Виводить новий рядок для кожного значення.


5

Python 2, 432 422 416 403 байт

Я впевнений, що це можна покращити. Принаймні, якщо мені вдасться піти з жорсткого кодування значення, над яким працювати, і не потрібна функція, я можу заощадити 20. Для введення тексту потрібен пробіл для розділення слів. Збережено 6 байт завдяки коментарю Джонатана Аллана до відповіді ЕльПедро, 4 - для перестановки математики.

def z(f):
 a,b,i,d="one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nine#".replace("#","teen ").split()+[""],"twenty thirty forty fifty".split(),1,f>50
 if d:f=f.split();f=a.index(f[-1])+21+b.index(f[-2])*10 if len(f)>1 else b.index(f[-1])*10+20 if f[-1]in b else a.index(f[-1])+1
 while i<=f:s=i if d else a[i-1]if i<20 else b[i//10-2]+a[i%10-1];print s;i+=1

(Примітка. Фактична версія цього тексту використовує вкладки для відступу замість пробілів. QPaysTaxes додав єдиний пробіл, оскільки він не відображався належним чином, щоб забезпечити компіляцію заданого коду. Він не повинен змінювати кількість байтів.)


@ JonathanAllan коментар до відповіді ElPedro працює і тут для -6
Chris H

1
len(`f`)>2може бути ...`f`[2:]ще 3 я вірю. (ігноруйте, ...здається, не можна нормально працювати заднім полем)
Джонатан Аллан

Насправді в python 2 ви могли б отримати f>50за 6. (а інший - не використовуючи d)
Jonathan Allan

@JonathanAllan , що не працює для передачі чисел в вигляді цілих чисел, які я в даний час зробити: TypeError: 'int' object has no attribute '__getitem__'. Якщо я передаю числовий введення як рядок, f[2:]наближається, але все-таки виходить з ладу, коли його відзначають як булева ( print f[2:] and Trueдрукує порожній рядок, якщо len (f) <2, ні TrueабоFalse )
Кріс Х,

@JonathanAllan f>50працює, дякую. Випаданняd не так просто, тому що я завжди вводя кінцеве значення циклу в fтакий рядок 8, не можна змінити, if f>50оскільки це ніколи не буде правдою.
Кріс Х

4

C ++ 11, 484 480 477 байт

#import<iostream>
#import<cstdlib>
#import<vector>
using namespace std;f(){int j,i=2;string s="teen";vector<string>v={"","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve"};for(;i++<9;)v.push_back(v[i]+s);v[13]="thir"+s;v[15]="fif"+s;v[18]="eigh"+s;for(i=19;i++<50;){string n[4]={"twenty","thirty","forty","fifty"};v.push_back(n[i/10-2]+v[i%10]);}cin>>s;if(i=atoi(s.c_str()))for(j=0;j++<i;)cout<<v[j]<<" ";else while(v[i++]!=s)cout<<i<<" ";}

Введення тексту в малі, без дефісів.


3

PowerShell , 362 байти

$z=0..50|%{("0twenty0thirty0forty0fifty"-split0)[+(($b="$_"[0])-gt49)*($_-gt19)*(+"$b"-1)]+($x=(("0one0two0three0four0five0six0seven0eight0nine0ten0eleven0twelve"-split0)+(-split'thir four fif six seven eigh nine'|%{$_+'teen'})))[($_%10)*($_-gt19)]+$x[$_*($_-le19)]}
if(($n=-split$args)[0][0]-in48..57){$z[$n[0]..$n[2]]}else{$z.IndexOf($n[0])..$z.IndexOf($n[2])}

Спробуйте в Інтернеті! введення слів або введення чисел

Це правильний безлад, і я цим не страшенно задоволений, але ось він. Пропозиції з гольфу вітаються.

Перший рядок задає $zмасив повних англійських слів. Ви можете побачити -split0цифри для номерів1 для 12і цикл, щоб сконструювати всі teens, і тоді є логіка, щоб все скласти правильно. Спробуйте в Інтернеті!

Другий рядок починається з певної логіки. Ми беремо вхід $args(як рядок), -splitвін у пробілі, зберігаємо його $nдля використання пізніше, беремо перше [0]слово та перший [0]символ цього та перевіряємо, чи є -inдіапазон 48..57(тобто ASCII 0до 9). Отже, ми перевіряємо, чи є у нас десяткові або англійські. Спробуйте в Інтернеті!

У першому випадку ми будуємо діапазон на основі десяткових входів $n[0]..$n[2]і використовуємо його для індексації $z[...]. В іншому випадку ми знаходимо .indexOf()перше слово і останнє слово, і будуємо з цього лише числовий діапазон. У будь-якій ситуації у нас зараз є масив об'єктів на конвеєрі (або рядків, або цілих чисел), і неявна Write-Outputпри завершенні програми дає нам новий рядок між елементами.


3

Swift3, 402 байти

let f=["one","two","three","four","five","six","seven","eight","nine"]
let g=["twenty","thirty","forty","fifty"]
let v=[f,["ten","eleven","twelve"],["thir","four","fif","six","seven","eigh","nine"].map{$0+"teen"},[g[0]],f.map{g[0]+$0},[g[1]],f.map{g[1]+$0},[g[2]],f.map{g[2]+$0},[g[3]]].flatMap{$0}
func c(s:String){if let i=Int(s){print(v.prefix(upTo:i))}else{for j in 1...v.index(of:s)!+1{print(j)}}}

Безголівки:

let f = ["one","two","three","four","five","six","seven","eight","nine"]
let g = ["twenty","thirty","forty","fifty"]

let values = [f,["ten","eleven","twelve"],["thir","four","fif","six","seven","eigh","nine"].map{$0+"teen"},
              [g[0]], f.map{g[0]+$0},
              [g[1]], f.map{g[1]+$0},
              [g[2]], f.map{g[2]+$0},
              [g[3]]].flatMap{$0}

func count(s:String){
    if let i = Int(s) {
        print(values.prefix(upTo: i))
    } else {
        for j in 1...values.index(of: s)!+1{
            print(j)
        }
    }
}

count(s:"29")
count(s:"twentyeight")

Тут нічого особливого, просто використовуючи масив для резервного копіювання виписаних номерів.

Спочатку я вважав це рішення, використовуючи інший спосіб обчислення valuesмасиву:

let values = f + ["eleven","twelve"]
    + ["thir","four","fif","six","seven","eigh","nine"].map{$0+"teen"}
    + [g[0]] + f.map{g[0]+$0}
    + [g[1]] + f.map{g[1]+$0}
    + [g[2]] + f.map{g[2]+$0}
    + [g[3]]

До яких можна взяти гольф:

let v=f+["eleven","twelve"]+["thir","four","fif","six","seven","eigh","nine"].map{$0+"teen"}+[g[0]]+f.map{g[0]+$0}+[g[1]]+f.map{g[1]+$0}+[g[2]]+.map{g[2]+$0}+[g[3]]

заміна 3-го рядка в коді для гольфу

Я міг набрати 381 байт, але є помилка компілятора, яка говорить: "вираз був занадто складним, щоб його вирішити в розумний час", більше інформації про помилку можна знайти тут


ЛЮБИТЬ, побачивши тут швидку, мені доведеться перевірити це більше, коли я повернусь
Альберт Реншо

3

R, 452 430 424 байт

o=c("","one","two","three","four","five","six","seven","eight","nine") 
t=gsub(0,"teen",c("ten","eleven","twelve","thir0","four0","fif0","six0","seven0","eigh0","nine0"))
s=c("twenty","thirty","forty") 
p=""
for(i in s){for(j in o){p=paste0(p,i,j," ")}}
as.data.frame(t(d<-1:50))
names(d)=c(o[-1],t,as.vector(strsplit(p," ")[[1]]),"fifty")
f=function(x){if(is.numeric(x)){names(d)[1:x]}else{matrix(d[1:d[x]],dimnames=NULL)}}

#> f(5)
#[1] "one"   "two"   "three" "four"  "five" 

#> f('five')
#     [,1]
#[1,]    1
#[2,]    2
#[3,]    3
#[4,]    4
#[5,]    5

Розміщує номери у кадрі даних із записаними номерами у вигляді назв стовпців, що робить переклад між цими двома (та наступним друком) досить простим.

Основна спроба гольфу полягала у створенні записаних цифр на 20-49, ймовірно, набагато більше для гольфу тут.

Я зробив спробу as.matrixнадрукувати data.frame лише з числами, але мені все ще залишається заголовок матриці. Сподіваюся, це нормально.

Безголівки:

ones <- c("","one","two","three","four","five","six","seven","eight","nine") 
teens <- c("ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen")
tens <- c("twenty","thirty","forty") 

p=""
for(i in tens){
  for(j in ones){
    p=paste0(p, i, j," ")
  }
}

nums <- 1:50
as.data.frame(t(nums))
names(nums) <- c(ones[-1], teens, as.vector(strsplit(p, " ")[[1]]), "fifty")
f <- function(x){
  if(is.numeric(x)){
    names(nums)[1:x]
  } else {
    matrix(nums[1:nums[x]], dimnames = NULL)
  }
}

Невелике поліпшення до 359 байт:o=c("","one","two","three","four","five","six","seven","eight","nine") ; v=c("ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"); w=c("twenty","thirty","forty"); a=data.frame(0:50, c(o,v, sapply(w[1:3],function(y) sapply(o,function(x) paste0(y,x))),"fifty")); b=which(a==i); a[if(b<52) 2:b else 2:(b-51),ifelse(b<52,2,1)]
рахуйте

@count виглядає як велике поліпшення! Я, здається, не можу зрозуміти, де ця функція, або де ви б взяли аргумент.
BLT

2

C, 342 331 байт

char*x[]={"teen","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thir","four","fif","twenty","thirty","fourty","fifty"};void main(int z,char**i){for(z=1;z<=atoi(i[3]);z++)printf("%s%s%s\n",z<16?x[z]:z<20?z^18?x[z-10]:"eigh":x[z/10+14],z>20&&z%10?"-":z>12&&z<20?*x:"",z>20&&z%10?x[z%10]:"");}

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


Моя улюблена мова :)
Альберт Реншо

1
Насправді вам не потрібен ні один, ні один; все, що вимагає цей кодогольф - ваш третій аргумент. Перші два завжди будуть "1 і через" (або "один і через")
Альберт Реншо

@AlbertRenshaw Добрий дзвінок! Дякую :)
Ahemone

1

САС, 179

%macro c(n);%let f=words.;%if%length(&n)>2%then%do;%do c=1%to 50;%if%qsysfunc(putn(&c,&f))=&n%then%let n=&c;%end;%let f=2.;%end;%do i=1%to &n;%put%sysfunc(putn(&i,&f));%end;%mend;

Вихід записується в журнал, розділений новими рядками. SAS має вбудований формат для перетворення цифр у слова, що є головною перевагою для цього виклику, але прикро, що йому не вистачає інформатистів для зворотного.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.