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 года, вы можете использовать языки, созданные после этой даты (смеется)
Это код-гольф , поэтому выигрывает программа с самым коротким байтом!
Ответы:
Perl 6 ,
119113 байтовБаза данных Unicode FTW!
Использует прописные числа в верхнем регистре без переноса, например
TWENTYTWO
.Возвращает список строк или диапазон чисел. (Оба используют пробел в качестве разделителя при печати с помощью
put
.)источник
Python3,
276271269243237235232217 байтПринимая реплику из представления @smls perl ...
Я подозреваю, что это может быть игра в гольф немного дальше.
Он использует системную библиотеку
unicodedata
для поиска имен для чисел. ВFORTY TWO
качестве входных данных требуются имена в верхнем регистре (разделенные пробелом ) или десятичные целые числа.(Это моя первая подача кода в гольф.)
(Я также только что заметил, что неправильно подсчитал длину (кодировку), поэтому она на несколько байтов меньше, чем предполагалось ранее. Однако я обновил только самый последний счетчик байтов. Упс.)
источник
unicodedata
это системная библиотека, которая поставляется с установкой по умолчанию, а не «дополнительная» библиотека, которая должна быть установлена отдельно.for
цикл и имея новые строки между каждым выводом.print()
не волнует, если это целое число или строка тогда. Попробуйте онлайн!import*
вместо того,import name
чтобы сохранить пару байтовОбыкновенный Лисп,
297253243242144128Детали
~[ 0 ~; 1 ~; ... ~:; else ~]
это переключатель, основанный на значении следующего доступного аргумента, который переходит к соответствующему формату подчиненного элемента управления. Здесь у меня есть только случай «0» и для «еще». Это используется для вставки разделителя перед каждым числом, кроме первого, благодаря U, начинающемуся с нуля.~:[ FALSE ~; TRUE ~]
это условный формат; здесь мы выводим вещи по-разному, независимо от того, является ли ввод s строкой или нет.~R
напишите число в виде кардинального английского числа, а~D
просто напечатайте число.Примеры
источник
f
так, чтобы "(f 2)" печатал "один, два" и(f "two")
печатал "1, 2", это выглядит хорошо для вас?JavaScript ES6,
559 526 381 368 364 358 332 327315 байтСпасибо Kritixi Lithos за идею расщепления массива и Arnauld за трюк 1 / n.
источник
var
и вы можете изменить массив['one,'two',..]
на"one0two0three0...".split(0)
null, Array(n)
.!isNaN(n)
на1/n
. Это дает вамNaN
строку (ложь), ненулевое число с плавающей точкой для ненулевого целого числа (правда) илиInfinity
0 (также верно).Python 2 ,
503499494490479 байт-5 с благодарностью @JonathanAllan
Попробуйте онлайн!
Введите число или разделенное пробелами написание числа.
Чуть менее гольф и более читаемая версия:
источник
l="one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nin#".replace("#","teen ").split()
e
изnineteen
.Схема,
161,152, 149несжатый:
источник
string->number
делает это, я проверил быстро, и, кажется, используется для преобразования, например, из строки"4"
в число4
.(string->number "four")
возвращается#f
.PHP -
397372349344329 байтВдохновленный JS-решением TomDevs
Сохранено 25 байт путем замены
$a=[...]
на$a=explode(...)
Сохранение еще 23 байтов путем переключения обратно в массив без разделителей строк и сохранения
teen
в переменной благодаря @ user59178Сохранены еще 5 байтов, удалив
(int)
приведение типовДобавлено еще 15 байт путем сбрасывания
$b
, в$i
вfor
декларации, и фигурные скобки, благодаря @ user59178 сноваUngolfed:
Попробуйте это для входной строки или для входного числа
источник
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];
;)
$b
и поместив второй массив непосредственно в foreach, еще 6 байтов, опустив все фигурные скобки (хотя вам нужно поместить$a=$c
в настройку цикл for), и еще 6 байтов, увеличивая их после приращения.$i
когда вы используете его, а не в бите «после» цикла for.for ($i=0;$i<9;)$a[]=$c.'-'.$a[$i++];
Python 2, 262 байта
repl.it
Строки ввода и вывода строчные и сцепленные *, поэтому для проверки ввода строки введите, например,
"thirtyfive"
приглашение.Формирует список всех слов (от плюс
"fiftyone"
до"fiftynine"
),x
затем проверяет,input
является ли слово проксиv>50
(строки больше, чем числа в Python 2, и все числа в допустимом диапазоне ввода из спецификации<=50
), иprint
соответствует значения путем нарезки списка,x[:v]
или построения диапазона целых чиселrange(1,x.index(v)+2)
.* Добавление переносов для обоих стоит 11 байт, заменив
a+"ty"b
наa+"ty"+'-'*(b>'')+b
.источник
Wolfram Language, 92 байта
(Я новичок в этом, дайте мне знать, если я сделал что-то не так)
источник
Do[Print@If[#>0,i,,IntegerName@i],{i,If[#>0,#,,Interpreter["SemanticNumber"]@#]}]&
JavaScript (ES6), 261 байт
Примечание: строка, назначенная z, закодирована с
atob
. В закодированной строке есть 11 байтов, которые я не могу опубликовать на этом сайте, даже если они являются допустимыми символами в строке javascript. Поэтому я использовал шестнадцатеричный код в виде \ xHH. Каждое из этих побегов считается за 1 байт.Оригинальная несжатая струна является менее гольфовой версией.
Меньше гольфа
Тест
источник
ö\x89ÞöÜ(öØ...
этот материал отличный хахааPython 3 ,
305303 байтаПреобразован в Python 3 по совету от @ nedla2004. Теперь также нет пробела между записанными числами на входе или выходе, например, введите Twenty
Попробуйте онлайн 3!
Python 2 ,
327320313308 байтПопробуйте онлайн 2!
163170177 байт короче, чем мой первоначальный ответ, поэтому я публикую его в качестве альтернативы. Это используетfor
два списка для создания полного списка всех строковых представлений чисел, затем идентифицирует правильное в списке и печатает все до него либо по значению, либо по индексу. Выводит новую строку для каждого значения.источник
Python 2,
432 422 416403 байтаЯ уверен, что это можно улучшить. По крайней мере, если мне удастся избежать жесткого кодирования значения, над которым нужно работать, и при этом мне не понадобится функция, которую я могу сохранить 20. Для ввода текста требуется пространство для разделения слов. Сохранено 6 байтов благодаря комментарию Джонатана Аллана к ответу ElPedro, 4 для перестановки математики.
(NB: Фактическая версия этого использует вкладки для отступа вместо пробелов. QPaysTaxes добавил один пробел, потому что он не рендерился должным образом, чтобы гарантировать, что данный код компилируется. Он не должен изменять количество байтов.)
источник
len(`f`)>2
может быть...`f`[2:]
еще на 3 я верю. (не...
f>50
6. (и еще один, не используяd
)TypeError: 'int' object has no attribute '__getitem__'
. Если я передаю числовой ввод в виде строки, онf[2:]
становится ближе, но все равно терпит неудачу, когда трактуется как логическое значение (print f[2:] and True
печатает пустую строку, если len (f) <2, нетTrue
илиFalse
)f>50
работает, спасибо. Отбрасываниеd
не так просто, так как я всегда помещаю конечное значение цикла вf
строку 8, чтобы ее нельзя было изменить,if f>50
поскольку она никогда не будет истинной.C ++ 11,
484480477 байтВвод текста в нижнем регистре без дефисов.
источник
PowerShell , 362 байта
Попробуйте онлайн! ввод слов или ввод цифр
Это правильный беспорядок, и я не очень доволен этим, но вот он. Предложения по игре в гольф приветствуются.
Первая строка
$z
представляет собой массив полных английских слов. Вы можете увидеть-split0
числа1
для12
и цикл для построения всехteen
s, а затем есть куча логики, чтобы все сложить правильно. Попробуйте онлайн!Вторая строка начинается с некоторой логики. Мы берем входные данные
$args
(в виде строки),-split
помещаем их в пробел, сохраняем их$n
для последующего использования, берем первое[0]
слово и первый[0]
символ этого и проверяем, является ли он-in
диапазоном48..57
(т. Е. ASCII0
to9
). Итак, мы проверяем, есть ли у нас десятичный или английский ввод. Попробуйте онлайн!В первом случае мы строим диапазон на основе десятичных входных данных
$n[0]..$n[2]
и используем его для индексации$z[...]
. В другом случае мы находим.indexOf()
первое слово и последнее слово и строим из этого только числовой диапазон. В любой ситуации у нас теперь есть массив объектов в конвейере (либо строки, либо целые числа), и неявноеWrite-Output
завершение программы дает нам новую строку между элементами.источник
Swift3, 402 байта
Ungolfed:
Ничего особенного, просто использование массива для резервного копирования записанных чисел.
Я изначально думал, что это решение, используя этот другой способ для расчета
values
массива:Который может быть в гольф, чтобы:
замена 3-й строки в коде гольфа
Я мог бы набрать 381 байт, но есть ошибка компилятора, которая говорит: «выражение было слишком сложным, чтобы его можно было решить за разумное время», более подробную информацию об ошибке можно найти здесь
источник
R
452430424 байтаПомещает числа в data.frame с записанными числами в качестве имен столбцов, что делает перевод между ними (и последующую печать) довольно простым.
Основная попытка игры в гольф заключалась в создании выписанных номеров для 20-49, вероятно, гораздо больше, чтобы играть в гольф здесь.
Я сделал попытку с
as.matrix
напечатать data.frame только с числами, но все еще остался с заголовком матрицы. Надеюсь, это нормально.Ungolfed:
источник
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)]
C
342331 байтПопробуйте онлайн!
источник
САС, 179
Вывод записывается в журнал, разделенный новыми строками. SAS имеет встроенный формат для преобразования цифр в слова, что является основным преимуществом для этой задачи, но, к сожалению, ему не хватает информации для выполнения обратного.
источник