Подсчет и правописание


26

Напишите программу, которая принимает в качестве входных данных строку, которая выводит строку со следующими свойствами.

  • Если символ в строке представляет собой заглавную букву (ASCII 41-5A), то этот символ заменяется строкой, содержащей каждую букву вплоть до и включая исходную букву в верхнем регистре. Например, если входная строка I, то выходной будет ABCDEFGHI.
  • Аналогично, если символ представляет собой строчную букву (ASCII 61-7A), то символ заменяется таким же образом. iбудет заменен на abcdefghi.
  • Если символом является число (ASCII 30-39), то символ заменяется каждым числом, начиная с номера 0и считая до него.
  • Если входные данные содержат объединенные отдельные символы, то последовательности замены объединяются вместе.
  • Все остальные символы печатаются без изменений.

Примеры ввода (разделены пустыми строками)

AbC123

pi=3.14159

Hello, World!

Пример выходов

AabABC010120123

abcdefghijklmnopabcdefghi=0123.0101234010123450123456789

ABCDEFGHabcdeabcdefghijklabcdefghijklabcdefghijklmno, ABCDEFGHIJKLMNOPQRSTUVWabcdefghijklmnoabcdefghijklmnopqrabcdefghijklabcd!

Это код гольф, ребята. Стандартные правила применяются. Самый короткий код в байтах побеждает.


Чтобы увидеть таблицу лидеров, нажмите «Показать фрагмент кода», прокрутите вниз и нажмите «► Выполнить фрагмент кода». Отрывок сделан Оптимизатором.


10
Идея для продолжения: отменить это преобразование.
ETHproductions

2
@ETHproductions Возможно, хотя путь здесь кажется мне лучше, потому что он может принять любой вклад; что если в обратном направлении вход был Hello, World!?
Арктур

Должны ли мы поддерживать символы NUL (ascii 0x00) во входной строке?
Ними

@Eridan в таком случае код должен либо напечатать ошибку, либо, для забавы, выполнить приведенное выше преобразование. То есть f (f (вход)) == вход. Я не верю, что любой буквенно-цифровой ввод может нарушить это отношение.
Джейк

1
Это совершенно верно - я предполагаю, что «если строка МОЖЕТ БЫТЬ результатом преобразования, переверните ее. В противном случае примените преобразование». - это ваша задача, вы можете указать любые правила, которые вы выберете, при условии, что (а) они последовательны и (б) они проверяемы и не требуют решения целого нового раздела математики. Примечание: облучение (б) было бы интересно; Вы никогда не знаете, когда кто-то случайно совершит революцию в компьютерных науках, придумав алгоритм полиномиального времени для задачи NP - что на самом деле разумно, если только это экономит 4 байта.
Джейк

Ответы:


11

Pyth, 19 байт

sXzsJ+rBG1jkUTs._MJ

Попробуйте онлайн: демонстрация или тестовый набор

объяснение

sXzsJ+rBG1jkUTs._MJ
      rBG1            the list ["abc...xyz", "ABC...XYZ"]
     +    jkUT        appends the string "0123456789"
    J                 save this list of 3 strings in J
   sJ                 join the strings in J
               ._MJ   create all prefixes of the strings in J
              s       and combine them to one list
 XzsJ         s._MJ   translate the input string, chars from sJ
                      get translated to the correct prefix,
                      chars that don't appear in sJ don't get translated
s                     join all resulting translation strings

8

Python 2.7, 100 98 96 байт

a=[]
for c in raw_input():d=ord(c);a+=range(max(d&96|1,48),d)*c.isalnum()+[d]
print bytearray(a)

7

TeaScript , 24 байта 26 28

TeaScript - это JavaScript для игры в гольф

xl(#(i=lN()1)h(ii(l)+1))

Довольно короткий

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

объяснение

x.l(#            // Loops through each character of the string

     (i=l.N()1)  // Determines whether a character is alphanumeric
                 // Will return A-Z, a-z or 0-9 depending on result
                 // Assigns to variable i

     .h(         // Get characters up to...
        i.i      // where the character is in "i"
     ) + 1       // Increased by one
)

6

Рубин, 137 87 82 76 67 55 байт

Безголовый, но вы можете видеть шаблон.

$><<gets.gsub(/[a-z0-9]/i){[*" 0Aa"[$&.ord/32]..$&]*""}

Изменить: гольф до одного только регулярное выражение.

Редактировать 2: было много лишних пробелов.

Редактировать 3: Спасибо Manatwork для игры в гольф 12 байтов!


1
$><<gets.gsub(/[a-z0-9]/i){[*" 0Aa"[$&.ord/32]..$&]*""}
manatwork

@manatwork Черт, это умно!
Питер Ленкефи,

4

Python 2, 145 140 133 103 102 байт

Не очень гладкая анонимная функция, использующая понимание списка. Я чувствую, что логика должна быть намного короче, я постараюсь что-то выяснить.

lambda k:''.join([c,`map(chr,range(48+17*(c>'@')+32*(c>'`'),ord(c)+1))`[2::5]][c.isalnum()]for c in k)

Должно быть дано имя для использования, т.е. f=...


@ Мего О, ха-ха! Не беспокойся :)
Kade

4

Haskell, 95 91 86 60 байт

c#(a:o:r)|c<a||c>o=c#r|1<2=[a..c]
c#_=[c]
f=((#"AZaz09")=<<)

Пример использования: f "pi=3.14159"->"abcdefghijklmnopabcdefghi=0123.0101234010123450123456789"

Как это работает: скопируйте каждый символ c во входной строке, если c не находится между любым из A/ Z, a/ zили 0/ 9и если это так, возьмите список [<first char in pair> ... <c>].

Редактировать: @Zgarb спас много много байтов. Благодарность!


Я думаю, что вы можете определить c#_=[c]и пропустить tполностью.
Zgarb

@Zgarb: Да, и тогда sтоже лишнее. Большое спасибо!
Ними

4

JavaScript (ES6), 143 138 байт

Использует сравнения строк, чтобы проверить, какие символы использовать.

s=>s.replace(/[A-Z0-9]/gi,c=>(a=btoa`Ó]·ã»óÖq×£Y§¢«²Û¯Ã³`,(c>'Z'?a:a.toUpperCase()).split``.filter(x=>x<=c&(x>'9'|c<'A')).join``))

Демо онлайн. Протестировано в Firefox и Chrome.

Редактировать: 5 байтов сохранены путем замены a='0123456789abcdefghijklmnopqrstuvwxyz'на

a=btoa`Ó]·ã»óÖq×£Y§¢«²Û¯Ã³`

3

PHP, 146 байт

Golfed

function f($n,&$l){for(;$c=$n[$r],$b=0,$d=ord($c);$r++,$b?:$l.=$c)foreach([58=>48,91=>65,123=>97] as $m=>$i)while($d<$m&&$d>=$i)$b=$l.=chr($i++);}

Редакция 1: поместить диапазоны ord прямо в foreach. увеличил максимальный диапазон и изменил $d<=$mна $d<$m. использовать forдля итерации символов вместо foreachи str_split. Убрал все {}, переместив код вfor

Ungolfed

function f($input,&$output){
foreach (str_split($input) as $char){
  $ord = ord($char);
  $ords = [57=>48,90=>65,122=>97];
  $b = 0;
  foreach ($ords as $max=>$min){
     while ($ord<=$max&&$ord>=$min){
         $b = $max;
         $output .= chr($min);
         $min++;
     }
  }
  $b ?: $output.=$char;
}
};

$output = NULL;
$input = "pi=3.141592";
f($input,$output);
echo $output;

Объяснение: разбить строку на массив. Если значение ascii попадает в диапазон (для az, AZ, 0-9), то увеличивайте счетчик от минимума диапазона до значения ascii символа, добавляя каждое значение до тех пор, пока не достигнете значения ascii символа.

Я прошел, &$varтак что вывод делается по ссылке, а неreturn


Нет необходимости в переменной $ z для хранения массива диапазонов, вы можете поместить массив непосредственно в него foreach.
manatwork

Пробовал использовать range()? pastebin.com/k2tqFEgD
manatwork

@manatwork, я перешел от объявления $zи сделал некоторые другие изменения. range()вероятно, будет лучше. Я мог бы попробовать что-то с дальностью позже.
Рид

Используя range, я получил function f($n,&$l){$o=['a'=>'z','A'=>'Z','0'=>'9'];foreach(str_split($n) as $c){$b=0;foreach($o as $m=>$x)!($c>$m&&$c<=$x)?:$b=$l.=implode(range($m,$c));$b?:$l.=$c;}}, что было 166.
Рид

1
Да, после перезаписи на 146 символов использование range()будет менее выгодным. Но этот 166 слишком длинный, несмотря на это: $ o для литерала массива возвращается, есть дополнительные пробелы вокруг asключевых слов, для которых join()есть псевдоним implode(). (?. Проверили код Pastebin Я связан ранее показывает другую возможность сохранить конечные точки диапазона) Что касается вашего решения 146 символов, вы можете переместить задание $ с внутри ord()вызова: $d=ord($c=$n[$r]).
Манатворк

2

Python, 143 байта

lambda s:''.join(map(chr,sum(map(lambda a,r=range:r(65,a+1)if 64<a<97else r(97,a+1)if 96<a<123else r(48,a+1)if 47<a<58else[a],map(ord,s)),[])))

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


2
Вы можете использовать z = range, чтобы сохранить 4 байта.
Арктур

1
Уверен, что вы можете заменить отступы двойного пробела одной вкладкой, что сэкономит вам несколько байтов
Fund Monica's Lawsuit

2

Perl 6, 101 байт

Вот первый проход на это:

sub MAIN($_ is copy){
  s:g/<[0..9]>/{(0..$/).join}/;
  s:g/<[a..z]>/{('a'..~$/).join}/;
  s:g/<[A..Z]>/{('A'..~$/).join}/;
  .say
}
sub MAIN($_ is copy){s:g/<[0..9]>/{(0..$/).join}/;s:g/<[a..z]>/{('a'..~$/).join}/;s:g/<[A..Z]>/{('A'..~$/).join}/;.say}

119


Использование .transна $_удалить is copy.

sub MAIN($_){
  .trans(
    /\d/       => {(0..$/).join},
    /<[a..z]>/ => {('a'..~$/).join},
    /<[A..Z]>/ => {('A'..~$/).join}
  ).say
}
sub MAIN($_){.trans(/\d/=>{(0..$/).join},/<[a..z]>/=>{('a'..~$/).join},/<[A..Z]>/=>{('A'..~$/).join}).say}

106


Действуйте @*ARGSнапрямую, вместо того, чтобы определять MAINсаб.
(в остальном идентичен предыдущему примеру)

@*ARGS[0].trans(/\d/=>{(0..$/).join},/<[a..z]>/=>{('a'..~$/).join},/<[A..Z]>/=>{('A'..~$/).join}).say

101


2

Scala, 111 91 байт

val f=(_:String).flatMap(x=>if(x.isDigit)('0'to x)else if(x.isUpper)('A'to x)else('a'to x))

Это не для pi=3.14159. Может ли быть решение val f=(_:String).flatMap(x:String=>if(x.isDigit)('0'to x)else if(x.isUpper)('A'to x)else if(x.isLower)('a'to x)else x.toString)для колоссальных 128 символов?
Леонардо

2

Юлия, 102 98 90 84 байта

s->join([(i=Int(c);join(map(Char,(64<c<91?65:96<c<123?97:47<c<58?48:i):i)))for c=s])

Это создает безымянную функцию, которая принимает строку и возвращает строку.

Ungolfed:

function f(s::AbstractString)
    # For each character in the input, get the codepoint and construct
    # a range of codepoints from the appropriate starting character to
    # the current character, convert these to characters, and join them
    # into a string
    x = [(i = Int(c);
          join(map(Char, (isupper(c) ? 65 :
                          islower(c) ? 97 :
                          isdigit(c) ? 48 : i):i))
         ) for c in s]

    # Join the array of strings into a single string
    return join(x)
end

2

PowerShell, 155 байт

($args-split''|%{$b=$_;switch([int][char]$_){{$_-in(65..90)}{[char[]](65..$_)}{$_-in(97..122)}{[char[]](97..$_)}{$_-in(48..57)}{0..$b}default{$b}}})-join''

Технически это одна строка, и PowerShell - все о них ;-)

Разбивает входная труба , что в ForEach-Objectпетлю, переключатели на целом значении отлитого символа, затем генерирует новую char[]из соответствующих диапазонов. Обратите внимание, что мы должны потратить байты, чтобы установить временную переменную, $bпотому что акт приведения входных данных $_в операторе switch означает, что мы не можем просто продолжать использовать $_или мы получим прикольный вывод.

РЕДАКТИРОВАТЬ - Я должен указать, что это будет сбрасывать ошибки, так как первый объект, который %{...}вводится, является нулевым объектом. Так как STDERR по умолчанию игнорируется , это не должно быть проблемой. Если это проблема, измените первый бит, ($args-split''-ne''|...чтобы удалить нулевой объект.


2

JavaScript (ES6), 340 258 273 271 байт

a=s=>{s=s.split``;Q=x=>x.toUpperCase();A="ABCDEFGHIJKLMNOPQRSTUVWXYZ";D="0123456789";f="";for(i=0;i<s.length;i++){j=s[i];c="to"+(Q(j)==j?"Upper":"Lower")+"Case";j=Q(j);if(q=A.search(j)+1)f+=g=A.slice(0,q)[c]();else if(q=D.search(j)+1)f+=g=D.slice(0,q);else f+=j}return f}

Вы можете использовать шаблон строку `` для разделения вместо ("")и f=i=""в течение цикла. Возможно, вы сможете сохранить еще несколько байтов.
intrepidcoder

@intrepidcoder Первый будет работать. Я проверяю на втором.
Конор О'Брайен,

2

C (269 байт)

(разрыв строки добавлен для ясности)

#include<stdio.h>
#define F(x,y,z)if(c>=T[0][x]&&c<=T[1][y]){z}
#define L(x,y)for(i=0;i<x;++i){y}
main(){int c,i,n;char o,*T[]={"0Aa","9Zz"};while((c=getchar())!=EOF)
{F(0,2,L(3,F(i,i,o=T[0][i],n=++c-o;L(n,putchar(o++));break;))else putchar(c);)}}

Ungolfed

#include<stdio.h>
int main(void)
{
  int c, i, n;
  char output;
  char *char_table[] = {"0Aa", "9Zz"};

  while ((c = getchar()) != EOF) {
    if (c < '0' || c > 'z') {
      putchar(c);
    } else {
      for (i = 0; i < 3; ++i) {
        if (c >= char_table[0][i] && c <= char_table[1][i]) {
          output = char_table[0][1];
          n = c - output;
          break;
        }
      }
      for (i = 0; i <= n; ++i) {
        putchar(output);
        ++output;
      }
    }
  }
  return(0);
}

2

Perl 5 , 66 61 (51 байт + 1) 52

Комбинирование регулярных выражений с условными операторами в этом случае хорошо сработало.
С объединением Использование карты для объединения диапазонов в массив.

say map{(/\d/?0:/[A-Z]/?A:/[a-z]/?a:$_)..$_}split//

Тест

$ echo "A0C1.a3c_2!" |perl -M5.010 -n count_and_spell_up.pl
A0ABC01.a0123abc_012!

объяснение

say                # print output
  map{             # loop through the array that's at the end of the other mustache. 
                   # outputs an array. 
     (
        /\d/?0            # if $_ is a digit then 0
          :/[A-Z]/?A      # else, if it's an uppercase character then A
             :/[a-z]/?a   # else, if it's a lowercase character then a
               :$_        # else the current character
     )..$_         # generate a sequenced string of characters 
                   # that ends with the magic variable $_ 
                   # ($_ is currently a character from the array)
  }split//     # split the magic variable $_ (currently the input string)
               # to an array of characters

1

JavaScript (ES7), 125 байт

Уже было два JS-ответа, посвященных кодированию строк, поэтому я решил пойти на более алгоритмический подход, используя String.fromCharCode():

x=>x.replace(/[^\W_]/g,z=>(c=z.charCodeAt(),f=c<65?48:c<97?65:97,String.fromCharCode(...[for(i of Array(c-f).keys())i+f])+z))

Преимущество использования этого метода заключается в том, что он принимает любое количество кодов символов, поэтому joinв списке нет необходимости. Это оказалось короче, чем любая другая техника, поэтому я доволен результатом.


1

MUMPS, 131 байт

u(l,h) i l'>a,a'>h f j=l:1:a s o=o_$C(j),f=0
    q
t(s) f i=1:1:$L(s) s a=$A(s,i),f=1 d u(48,57),u(65,90),u(97,122) s:f o=o_$C(a)
    q o

Мне удалось сэкономить здесь несколько байт благодаря динамической области видимости MUMPS . Вот примерно эквивалентная версия без гольфа, которую, я уверен, хотел бы выделить синтаксис, если бы была доступна только поддержка модуля MUMPS Prettify .

convert(str) ;
    new asciiCode,flag,i,output
    for i=1:1:$LENGTH(str) do
    . set asciiCode=$ASCII(str,i)
    . set flag=1
    . do helper(48,57)
    . do helper(65,90)
    . do helper(97,122)
    . if 'flag do
    . . set output=output_$CHAR(asciiCode)
    quit
helper(low,high) ;
    if low'>asciiCode,asciiCode'>high do
    . for code=low:1:asciiCode do
    . . set output=output_$CHAR(code)
    . . set flag=0
    quit

1

Perl 6, 78 77 байтов

@*ARGS[0].trans(/\d/=>{[~] 0..$/},/<:L>/=>{[~] samecase("a",~$/)..~$/}).say

Я знал, что это может быть сокращено путем объединения 'a'..'z'и 'A'..'Z'случаев, я должен был стараться изо всех сил.
Брэд Гилберт b2gills

Я рекомендую добавить <!-- language-all: lang-perl6 -->сразу после ## Perl 6этого, чтобы он выделился правильно. (Изменение уже ожидается в этом ответе)
Брэд Гилберт b2gills

Вы можете переключиться {[~](0..$/)}на {[~] 0..$/}который сохранит один байт.
Брэд Гилберт b2gills

0

Mathematica, 102 байта

FromCharacterCode@Flatten[Which[64<#<91,65,96<#<123,97,47<#<58,48,1>0,#]~Range~#&/@ToCharacterCode@#]&

Ну что ж...


0

CJam, 32 31 байт

q_'[,_el^A,s+26/ff{_@#)<}:s\.e|

Попробуйте онлайн в интерпретаторе CJam .

Как это работает

q_    e# Push two copies of the user input.
'[,   e# Push the string of all ASCII characters up to Z.
_el   e# Push a copy and convert it to lowercase.
^     e# Perform symmetric difference this keeps only letters.
A,s+  e# Append the string "0123456789".
26/   e# Split the result into chunks of length 26.
ff{   e# For each character from input: For each chunk:
  _@  e#   Copy the chunk and rotate the character on top of it.
  #   e#   Push the index of the character in the string (-1 for not found).
  )<  e#   Increment and keep that many characters from the left of the chunk.
      e#   This pushes "" for index -1.
}
:s    e# Flatten the resulting arrays of strings.
      e# The results will be empty strings iff the character wan't alphanumeric.
\     e# Swap the result with the input string.
.e|   e# Perform vectorized logical OR.

0

Python 2, 135 117 байт

s=''
for c in raw_input():
 b=ord(c);e=b+1
 if c.isalnum():
  b=max(b&96,47)+1
 for i in range(b,e):s+=chr(i)
print s

0

PHP - 291 байт

Передайте строку в GET["s"].

<?php $s=$_GET["s"];$m="array_map";echo implode($m(function($v){$i="in_array";$l="implode";$r="range";global$m;$a=ord($v);if($i($a,$r(48,57)))$v=$l($m("chr",$r(48,$a)));if($i($a,$r(65,90)))$v=$l($m("chr",$r(65,$a)));if($i($a,$r(97,122)))$v=$l($m("chr",$r(97,$a)));return$v;},str_split($s)));

0

C #, 251 201 184 157 154 байта

using System;class c{static void Main(string[] i){foreach(var c in i[0])for(var x=c>64&c<91?'A':c>96&c<123?'a':c>47&c<58?'0':c;x<=c;)Console.Write(x++);}}

редактировать: удар! Короче чем PowerShell;)


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