Підрахунок та написання


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
Це цілком вірно - я припускаю, що "якщо рядок МОЖЕ бути результатом трансформації, поверніть її назад. В іншому випадку застосуйте перетворення". - це ваше завдання, ви можете вказати будь-які обрані вами правила до тих пір, як (a) вони послідовні і (b) вони перевіряються і не потребують цілої нової галузі математики для вирішення. Побічна примітка: Іррадіація (б) була б цікавою; ви ніколи не знаєте, коли хтось випадково зробить революцію з інформатики, створивши поліноміальний алгоритм часу для проблеми 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 байт

Unolfolf, але ви можете побачити візерунок.

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

Редагувати: гольф аж до однієї регулярної виразки.

Редагування 2: було багато додаткових пробілів.

Редагувати 3: Завдяки маневреній роботі для гольфу 12 байт!


1
$><<gets.gsub(/[a-z0-9]/i){[*" 0Aa"[$&.ord/32]..$&]*""}
манатура

@manatwork Чорт, що розумно!
Пітер Ленкефі

4

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


@Mego О, ха-ха! Не хвилюйтесь :)
Каде

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: Так, і тоді 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 байт

Гольф

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: введіть діапазони ордин прямо в передбачення. збільшені максимум діапазону ор і змінено $d<=$mна $d<$m. за допомогою forітерації символів замість foreachта str_split. Видалено все {}, перемістивши код уfor

Безумовно

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), то збільшуйте лічильник від min діапазону до значення ascii char, додаючи кожне значення, поки не досягнете значення ascii char.

Я передав, &$varтому вихід робиться посиланням, а не areturn


Немає необхідності в змінній $ z, щоб утримувати масив діапазонів, ви можете вводити прямолінійний масив прямо в foreach.
манатство

Пробували використовувати 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

Пітон, 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 = діапазон, щоб зберегти 4 байти.
Арктур

1
Досить впевнений, що ви можете замінити подвійні відступи простору однією вкладкою, що дозволить вам заощадити кілька байтів
Фонд позову Моніки

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])

Це створює неназвану функцію, яка приймає рядок і повертає рядок.

Безголівки:

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[]відповідних діапазонів. Зауважимо, що нам доведеться витратити байти, щоб встановити змінну temp, $bоскільки акт передачі вводу$_ в операторі перемикання означає, що ми не можемо просто продовжувати використовувати $_або ми отримаємо фанк-вихід.

EDIT - Я мушу зазначити, що це призведе до усунення помилок, оскільки перший об'єкт, який подається, %{...}є нульовим об'єктом. Оскільки 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=""в циклі for. Можливо, ви зможете зберегти ще кілька байт.
intrepidcoder

@intrepidcoder Перший би спрацював. Я перевіряю на другий.
Conor O'Brien

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);)}}

Безумовно

#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))

Бонусом від використання цього методу є те, що він займає будь-яку кількість char кодів, тому joinсписок не є необхідним. Це вийшло коротше, ніж будь-яка інша техніка, тому я задоволений результатом.


1

МУМП, 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

Математика, 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?
Ерік Аутгольфер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.