Преобразование строки в нижний регистр (без встроенных функций для нижнего регистра!)

25

Целью этого кода является создание кода, который позволяет пользователю вводить строку ASCII (содержит только печатаемые символы ASCII ), а ваша программа выводит вариант этой строки в нижнем регистре.

Важно: вам НЕ разрешено использовать встроенную функцию, которая преобразует строку (или только один символ) в нижний регистр (например, ToLower()в .NET, strtolower()в PHP, ...)! Однако вы можете использовать все остальные встроенные функции.

Еще одно важное замечание: строка ввода не содержит только заглавные буквы. Входная строка представляет собой сочетание символов верхнего регистра, символов нижнего регистра, цифр и других печатных символов ASCII .

Удачи!

ProgramFOX
источник
4
К сожалению, мне придется отказаться. Я не новичок.
Джон Дворжак
@Jan: Ну, с новичком я действительно имел в виду, что уровень мастерства этого будет «новичком», а не только новичкам будет позволено войти. Я удалил слово «новичок» и, конечно, вы можете войти.
ProgramFOX
1
Разрешены ли регулярные выражения? Только GolfScript мог победить s/./\L\0/g.
manatwork
3
@ Manatwork: конечно \L, встроен?
marinus
@ Manatwork: Да, регулярное выражение разрешено.
ProgramFOX

Ответы:

21

Shell - 10

Перевод Perl-решения @ Gowtham с использованием /bin/tr.

tr A-Z a-z

Образец прогона:

% tr A-Z a-z <<<'Hello WORLD! @'
hello world! @
Светляк
источник
Что делает этот ответ принятым из любопытства? Сначала у Гаутама было 10-символьное решение ...
2013 года
1
Основываясь на обсуждении мета, кажется, что причина состоит в том, что решение Гаутама - 11 символов (потому что -pфлаг считается как один). Я согласен, хотя, его кажется, что это заслуживает большего, чтобы быть принятым ..
FireFly
Ах, спасибо - это имеет смысл. Я буду иметь это в виду!
Ry-
53

Python 2.7 - 30 (с ужасным и неуместным нарушением правил)

raw_input().upper().swapcase()

Как указало анонимное редактирование, вы можете сделать это в 2726 в Python 3 :

input().upper().swapcase()

Я грубо нарушаю правила, но ...

Важно: вам НЕ разрешено использовать встроенную функцию, которая преобразует строку (или только один символ) в нижний регистр (например, ToLower()в .NET, strtolower()в PHP, ...)! Однако вы можете использовать все остальные встроенные функции.

Это берет строки и охватывает его в верхнем регистре . Затем в очень несвязанном вызове метода он переворачивает регистр строки - так что любые строчные буквы становятся заглавными буквами ... и заменяет любые заглавные буквы строчными .


источник
1
Решение Python 3 состоит из 26 символов.
Timtech
@ Тимтех, я не могу сосчитать.
1
Это не просто не связано. Это очень не связано.
Картер Папе
1
Это будет иметь странные результаты при обнаружении текста, содержащего символы ß.
FUZxxl
33

Perl - 11 10 символов.

y/A-Z/a-z/

y///так же, как tr///!

В бою:

% perl -pe 'y/A-Z/a-z/' <<< 'Hello @ WORLD !'
hello @ world !
Gowtham
источник
3
+1, за единственный реальный язык, который превосходит все менее (?) Настоящие.
Behrooz
На самом деле это 11 символов. -pВариант считается как 1
manatwork
@manatwork Или это следует считать как 2: -и p:)
Gowtham
1, если вы предполагаете -e( perl -e-> perl -pe), 3, если вы предполагаете скрипт ( perl-> perl -p).
nyuszika7h
10

Befunge-98 - 26 22 21 19

~:''-d2*/1-!' *+,#@

Полагается на то, что (c-39)/26это 1только для кодов символов прописных символов ASCII (при условии целочисленного деления). Для каждого символа cраспечатайте c + (((c-39)/26)==1)*' '.

Пример сеанса:

% cfunge lower.b98
hello WORLD!
hello world!
This is a TEST!!11 az AZ @[`{
this is a test!!11 az az @[`{
Светляк
источник
9

Python 3, 58

print("".join(chr(ord(x)+('@'<x<'[')*32)for x in input()))
Рыбаковым
источник
Можете ли вы объяснить, как это работает? Я действительно заинтересован в том, чтобы стать лучше на Python. Я не понимаю, как map(ord,input())работает бит.
Астери
1
@JeffGohlke: mapприменяет функцию (в данном случае ord) к целому и возвращает итерацию. Это как более короткая форма (ord(x) for x in input()).
Ry-
Понял. Спасибо за объяснение!
Астери
1
Ваш ответ следует духу вопроса, но мой следует букве вопроса ...
Очень хорошо. Удар мой неопубликованный 62 длина решения for c in input():print([c,(chr(ord(c)+32))]['@'<c<'['],end=''). Я попробовал некоторые с map(ord,input())трюком, но пропустил умножение значения истинности на 32 и добавление его к уловке кода символа. Очень хорошо.
Стивен Румбальски
8

Рубин, 18 знаков

Ничего особо интересного.

gets.tr'A-Z','a-z'

(запустить в IRB)

Просто для удовольствия: запутанная версия:

$,=$* *' ';$;=$,.tr'A-Z','a-z';$><<$;

Запустите так:

c:\a\ruby>lowercase.rb Llamas are AMAZING!

Выход

llamas are amazing!
Дверная ручка
источник
7

J - 30

'@Z'(]+32*1=I.)&.(a.&i.)1!:1]1

J читается справа налево, поэтому, чтобы разбить это:

  1. Предложите пользователю ввести: 1!:1]1
  2. Выполните алгоритм в коде-точке-пространстве: &.(a.&i.)
  3. Определить диапазон символов для каждой буквы; символы между кодовым «@» и «Z» считаются прописными буквами: 1=I..
  4. Для каждой заглавной кодовой точки добавьте 32: ]+32* ...
  5. Обратите внимание, что шаг (2) создает неявный шаг (5): мы начали с проецирования из символьной области в целочисленную, поэтому теперь, когда мы закончили, мы отобразим эти целые числа обратно в символы.

Очевидно, что эта конкретная реализация рассматривает только ASCII; но подход можно распространить, по крайней мере, на базовую многоязычную плоскость в Юникоде.

Дэн Брон
источник
1
Ницца! К сожалению, кажется, что ваше решение идет НЕПРАВИЛЬНО. ;-) Должно быть, это легко исправить. (Изменить: '@Z'(]+32*1=I.)&.(a.&i.)1!:1]1должен это сделать)
FireFly
Хороший улов, спасибо. Я также впечатлен, что вы смогли исправить код самостоятельно: J не самый доступный язык там :)
Дэн Брон
Ах, я сам немного поиграл с J ... Мне удалось придумать u:(a.i.x)+32*1='@Z'I.x=.1!:1]1, что соответствует твоей длине, но гораздо менее интересно (так как не использует 'under'). Говоря об этом, я не знал о двоичном I., так что спасибо за использование этого. :-)
FireFly
Круто. Но ваше решение Befunge все еще имеет J бит на 4 символа. Очевидно, я не могу оставить это в силе :) Я пытаюсь выяснить, следует ли сократить J-решение, следуя вашему примеру, полагаясь исключительно на «@», а не на «@» и «Z».
Дэн Брон
(32(23)b.])&.(3&u:), должен быть на 5 байт короче.
FrownyFrog
7

C 64 63 59 55 символов

main(c){while(c=getchar(),~c)putchar(c-65u<27?c+32:c);}
Rozuur
источник
Я считаю только 63 символа там.
Манатворк
Вы можете потерять 9 символов: падение int и ,c>=0. Они здесь не нужны.
JoeFish
нам нужно c> = 0, так как getchar (EOF) будет <0. Спасибо за другое предложение.
Розуур
2
1. ~(c=getchar())2.c-64u<27
Угорен
1
Незначительно маленькая ошибка: кажется, должно быть 65 вместо 64. pastebin.com/Zc9zMx2W
manatwork
5

Гольфскрипт - 17

Программа:

{..64>\91<*32*+}%

Объяснение:

  1. {}% сопоставляет код внутри с каждым символом в строке.
  2. .. копирует вершину стека (персонажа) дважды.
  3. 64> 1, если код символа больше 64, иначе 0.
  4. \поменяет два элемента в стеке (получает вторую копию письма и сохраняет результат 64>в позиции два).
  5. 91< проверяет, является ли код символа меньше 91. Аналогично шагу 3.
  6. *умножает результаты шагов 3 и 5 вместе. Только равен 1, если оба шага были верными.
  7. 32* умножает результат шага 6 на 32. Будет 32, если шаг 6 был 1, иначе 0.
  8. + добавьте результат (32 или 0) в код символа.

Пример вывода:

echo HelLO @ WorLD | ruby golfscript.rb upper_to_lower.gs
hello @ world
Rees
источник
4

Perl: 24 символа

s/[A-Z]/chr 32+ord$&/ge

Образец прогона:

bash-4.1$ perl -pe 's/[A-Z]/chr 32+ord$&/ge' <<< 'Hello @ WORLD !'
hello @ world !
manatwork
источник
Подол, почему chr ord? Я почти уверен, что вы ничего не узнаете, прочитав мой ответ ;-)
Ф. Хаури
Удивительный трюк, @ F.Hauri!
Манатворк
@ nyuszika7h, +1 - это -pпараметр командной строки, а не перевод строки.
manatwork
Ах да, извини.
nyuszika7h
3

Python (33)

Если сомневаетесь, используйте оболочку.

import os;os.system('tr A-Z a-z')

К сожалению, это все еще дольше, чем решение Lego.

Лямбда Фея
источник
+1 Это действительно не встроенный Python, который вы используете. Работает только на Linux, но все еще очень правила Бенди !!!
@LegoStormtroopr Работает везде, где есть trкоманда (которая делает правильные вещи) на пути вызванной оболочки, я полагаю.
Пагло Эберманн
3

DELPHI

const
  UpChars:set of AnsiChar = ['A'..'Z'];
var
  I: Integer;
begin
  SetLength(Result, Length(pString));
  for I := 1 to length(pstring) do
    Result[i] := AnsiChar((Integer(pString[i] in UpChars))*(Ord(pString[i])+32));
  WriteLn(Result);
end;
Фабрицио Араужо
источник
3
Это не гольф. Не кажется ли вам, что этот предмет сильно отличается от других?
Рэй
1
@ray Golfing - это максимально короткий код. Delphi не является отличным языком для игры в гольф. Я сам пользуюсь delphi, и хотя у меня нет большого шанса выиграть в гольф с delphi, по-прежнему интересно испытать себя.
Теун Пронк
3

JavaScript - 109 104 (ES6: 95)

Спасибо некоторым за исправленную версию.

a=prompt();for(b=[i=0];c=a.charCodeAt(i);)b[i++]=String.fromCharCode(c|(c>64&c<91)*32);alert(b.join(""))

Следующее работает, если браузер поддерживает выражения функций ES6:

alert(prompt().split("").map(c=>String.fromCharCode(c.charCodeAt()|(c>"@"&c<"[")*32)).join(""))
Светляк
источник
Первый код не работает (проверено в FF и Chrome), потому что при попытке получить символ после длины строки вы получаете, undefinedа затем c.charCodeAt()терпите неудачу, потому что undefined не имеет charCodeAt. Рабочий пример 105 символов:a=prompt();for(b=[i=0];c=a.charCodeAt(i);)b[i++]=String.fromCharCode(c|(c>64&&c‌​<91)*32);alert(b.join(''))
немного
@ К сожалению, мне интересно, как я получил этот фрагмент ... Я почти уверен, что тестировал этот код, возможно, я скопировал нерабочую версию или что-то в этом роде. В любом случае, спасибо за исправление.
FireFly
Использование побитового andвместо логического ... приятно!
немного
Еще более ES6 решение ( 79 ): L=s=>[String.fromCharCode(c.charCodeAt()|(c>"@"&c<"[")*32)for(c of s)].join(''). Использование:L('SoMeTeXt')
Флоран
Ницца! Я не уверен, что сделаю это простой функцией, поскольку все остальные решения являются «правильными» программами. Тем не менее, очень приятно использовать for..ofнезависимо.
FireFly
3

Perl 18

s/[A-Z]/$&|" "/eg

Что-то типа:

perl -pe 's/[A-Z]/$&|" "/eg'  <<<'are NOT allowed to: ToLower() in .NET, strtolower() in PHP'
are not allowed to: tolower() in .net, strtolower() in php

а также

perl -pe 's/[A-Z]/$&|" "/eg' <<< "The input string Doesn't cOntaIn...( C0D3-@01F. ;-)"
the input string doesn't contain...( c0d3-@01f. ;-)

Для @FireFly :

perl -pe 's/[A-Z]/$&|" "/eg' <<< "Doesn't this translate @ to \` and [\]^_ to {|}~DEL? "
doesn't ... @ to ` and [\]^_ to {|}~del? 

нет.

Более универсальный: 18 символов в любом случае:

s/[A-Z]/$&|" "/eg

s/[A-Z]/$&^" "/eg

Это ничего не изменит в состоянии:

perl -pe 's/[A-Z]/$&^" "/eg' <<< "Doesn't ... @ to \` and [\]^_ to {|}~DEL? "
doesn't ... @ to ` and [\]^_ to {|}~del? 

Все отлично работает, но преимущество изменения |(или) ^(XOR) является то , что тот же синтаксис может быть использован для toLower, toUpperили swapCase:

TOUPPER:

perl -pe 's/[a-z]/$&^" "/eg' <<< "Doesn't ... @ to \` and [\]^_ to {|}~DEL? "
DOESN'T ... @ TO ` AND [\]^_ TO {|}~DEL? 

и swapCase (18 + 1 = 19 символов) :

perl -pe 's/[a-z]/$&^" "/egi' <<< "Doesn't ... @ to \` and [\]^_ to {|}~DEL? "
dOESN'T ... @ TO ` AND [\]^_ TO {|}~del? 
Ф. Хаури
источник
Я забыл +1 за -pизвинения @manatwork
Ф. Хаури
Разве это не переводится @на backtick и [\]^_to {|}~DEL? И в этом заключается сложная часть ..
FireFly
1
@FireFly Нет, $&должны совпадать [A-Z].
Ф. Хаури
О, мой плохой. Очень круто!
FireFly
3

JavaScript 80

"X".replace(/[A-Z]/g,function($){return String.fromCharCode($.charCodeAt()+32)})

(76, если вы удалите "X" )

с promptи alert- 92

alert(prompt().replace(/[A-Z]/g,function($){return String.fromCharCode($.charCodeAt()+32)}))

играть на скрипке

благодаря @FireFly @some @ C5H8NNaO4 и @minitech

Математический чиллер
источник
Er, вам нужно обернуть второй аргумент replaceс function($){return ...}, нет? Между прочим, первым параметром функции замены является соответствующая строка, так что вы можете отбросить символы в регулярном выражении.
FireFly
Как бы мне запустить его, как это?
C5H8NNaO4
@ C5H8NNaO4 str (код здесь)
математический чиллер
6
Я думаю, что все (или, по крайней мере, большинство) ответов здесь читаются из stdin и печатаются в stdout. Из того, что я понял, конвенция заключается в использовании promptи alertдля ввода / вывода в JS.
FireFly
1
Вам нужен /gфлаг, чтобы это работало правильно.
Ry-
2

р

71 символов:

chartr(paste(LETTERS,collapse=""),paste(letters,collapse=""),scan(,""))

83 персонажа:

a=as.integer(charToRaw(scan(,"")))
b=a%in%(65:90)
a[b]=a[b]+32
rawToChar(as.raw(a))
plannapus
источник
Это 86символы - переводы строки считаются за 2 символа. ( string-functions.com/length.aspx )
Timtech
@Timtech: В R вы можете заменить символы новой строки в коде, ;чтобы они не учитывались только для одного символа. Можно было бы написать:a=as.integer(charToRaw(scan(,"")));b=a%in%(65:90);a[b]=a[b]+32;rawToChar(as.raw(a))
plannapus
Да, теперь я понял. Я прочитал о мета ... кажется, что только в Windows новые строки имеют 2 символа (я использовал программу для измерения длины моего кода).
Timtech
2

PHP (42)

Запустите из командной строки:

-R'echo@str_ireplace($a=range(a,z),$a,$argn);'

-R и одинарные кавычки не учитываются.

PleaseStand
источник
Если вы будете следовать решению Гоулхэма Пил, вы будете считать только 42 символа.
Айсберг
1
@eisberg: обновил счет, оставив 43-символьную версию в истории на случай возникновения спора.
Пожалуйста, установите
str_ireplaceвыполняет поиск без учета регистра, который расширяет правила, если не нарушает их.
Угорен
@ Югорен Я так не думаю. Как ясно указано, что только встроенная функция, изменяющая регистр, не допускается, и это игнорирует регистр, не изменяя его.
Айсберг
2

PowerShell: 69 65 64

Я попробовал полдюжины способов заставить Replace работать так, как я хочу, без использования длинного [regex]::Replaceсинтаксиса, но мне не повезло. Если у кого-то есть представление о том, что может сработать, пожалуйста, предложите это.

Гольф-код:

[regex]::Replace((read-host),"[A-Z]",{[char](32+[char]"$args")})

Отличия от оригинала:

  • Переставил последний аргумент, так что [int]он больше не нужен, согласно предложению в комментариях.

Объяснение:

(read-host) получает пользовательский ввод.

[regex]::Replace(... )сообщает PowerShell использовать сопоставление с RegEx для выполнения операций замены над строкой.

"[A-Z]" соответствует всем заглавным буквам

{... }сообщает PowerShell использовать сценарий для определения значения замены.

[char]"$args" берет текущее совпадение и печатает его как символ ASCII.

32+ преобразует символ в целое число, представляющее код ASCII, и увеличивает значение на 32, что соответствует коду ASCII соответствующей строчной буквы.

[char](... )принимает полученное значение и преобразует его обратно в символ ASCII.

Демо оригинал:

введите описание изображения здесь

(Текущая версия проверена - скриншот еще не опубликован.)

Iszi
источник
1
Не проверено, как обойти это [regex]::Replace, но вы можете сохранить 4 символа, перейдя [int]на+
goric
1
На самом деле, весь последний аргумент может быть переставлен в {[char](32+[char]"$args")}, что устраняет необходимость явного приведения к int и сбрасывает еще одного персонажа
goric
@ Goric Боже, почему я не подумал об этом уже? Я все еще учусь.
Изи
2

к2, 15 байт

Я очень опоздал к этому, но я все равно нашел это круто.

{_ci 32+_ic x}'

Также:

Pyth, 10 байт

На самом деле не считается, потому что Pyth был создан после того, как это было опубликовано. Все еще круто.

jkmC+32Cdw
kirbyfan64sos
источник
2

05AB1E , 3 байта

u.š

Порт @ user8777 Python 3 ответа .

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

Объяснение:

u    # Convert the (implicit) input to uppercase
   # Switch the case (upper to lower and vice-versa)
     # (and output the result implicitly)

Но без каких-либо встроенных изменений:

05AB1E , 12 11 байт

ÇIS.u32*+çJ

-1 байт благодаря @Emigna .

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

Объяснение:

Ç            # Get the unicode values of each character of the (implicit) input-String
 IS          # Get the input-string, split to characters again
   .u        # Check for each if it's uppercase or not (1 if truthy; 0 if falsey)
     32*     # Multiply that result by 32 (32 if truhy; 0 if falsey)
        +    # Add it to all the unicode values at the same indices in the list
         ç   # Convert the now modified unicode values back to characters
          J  # And join all characters together to a string again
             # (which is output implicitly as result)
Кевин Круйссен
источник
1
ÇIS.u32*+çJсохраняет байт на вашей 12-байтовой версии.
Emigna
@ Emigna Ах, умный. Я пробовал .u32*+подход так: εÇy.u32*+ç]J, но , к сожалению , çупаковывает символы в списке, поэтому дополнительный Jили `требуется после того , как ç..
Кевин Cruijssen
1

Javascript, 105

prompt().split("").map(function(a){c=a.charCodeAt(0);return String.fromCharCode(c|(c-64?32:0))}).join("")

На самом деле форма вывода не указана, поэтому запустите ее в консоли. Да, JavaScript действительно многословен с помощью строки charcode <->

C5H8NNaO4
источник
1
c.charCodeAt()- по умолчанию, 0если индекс опущен. Кроме того, я полагаю, что разрывы на «@» («в нижнем регистре» переводятся в спину)
FireFly
@FireFly Хорошо, спасибо !, хорошо, я исправлю это =)
C5H8NNaO4
1

Рубин: 66

def l(s)s.bytes.map{|b|(65..90).include?(b)?b+32:b}.pack('c*');end
KaptajnKold
источник
1

C # - 108

class P{static void Main(string[]a){foreach(var c in a[0])System.Console.Write(
(char)(c>64&&c<91?c+32:c));}}

Около 70 только для тела метода.

Добавьте 5 символов, чтобы включить LF / CR в вывод:

class P{static void Main(string[]a){foreach(var c in a[0]+"\n")System.Console.Write(
(char)(c>64&&c<91?c+32:c));}}

Версия LINQ будет короче:

class P{static void Main(string[]a){a[0].Any(c=>System.Console.Write(
(char)(c>64&&c<91?32+c:c))is P);}}

(103) .. за исключением того, что требуется using System.Linq;(всего: 121).

Игби Ларджман
источник
1

Haskell - 58

p x|(elem x['A'..'Z'])=[x..]!!32|1<2=x
main=interact$map p
nyuszika7h
источник
1

Питон 3 - 70

Обновлен для изменений ОП.

Я новичок в Python, поэтому любая критика приветствуется.

print("".join(chr(ord(c)+32) if 64<ord(c)<91 else c for c in input()))
Asteri
источник
Извините, я должен был сказать, что вы не можете использовать функцию понижения для одного символа. Вопрос обновлен.
ProgramFOX
1
Пожалуйста, смотрите мой недавний комментарий : ваш код работает только в том случае, если входная строка содержит только заглавные буквы, но учтите, что он также содержит другие символы ASCII, такие как строчные буквы и цифры.
ProgramFOX
Хорошо, буду обновлять, когда я вернусь домой
asteri
@ProgramFOX Обновлено.
Астери
Джефф, посмотри ответ @minitechs . У вас обоих очень похожие подходы, поэтому вы должны понять, как и почему его ответ короче.
1

Perl, 9 + 1 (для флага -p) = 10

$_="\L$_"

\L был специально задан и разрешен, потому что, хотя это встроенный, это не функция.

CJ Деннис
источник
1

Powershell, 53 49 байт

-4 байта спасибо @AdmBorkBork

-join($args|% t*y|%{[char](32*($_-in65..90)+$_)})

Тестовый скрипт:

$f = {

-join($args|% t*y|%{[char](32*($_-in65..90)+$_)})

}

@(
    ,("Hello WORLD from PowerShell", "hello world from powershell")
) | % {
    $a,$e = $_
    $r = &$f $a
    "$($r-eq$e): $r"
}

Выход:

True: hello world from powershell
Mazzy
источник
прохладный! ¯\_(ツ)_/¯
Маззи
1

8086 машинный код, 14 байтов

Собранный:

AC 3C 41 7C 06 3C 5A 7F 02 0C 20 AA E2 F2

Несобранный список:

 ; Lowercase a string
 ; Input: string: SI, length: CX
 ; Output: string: DI
 TOLOW  MACRO   
        LOCAL _LOOP, _STORE
       _LOOP:
 AC         LODSB           ; load byte from [SI] into AL, advance SI 
 3C 41      CMP  AL, 'A'    ; is char less than 'A'? 
 7C 06      JL   _STORE     ; if so, do not convert 
 3C 5A      CMP  AL, 'Z'    ; is char greater than 'Z'? 
 7F 02      JG   _STORE     ; if so, do not convert 
 0C 20      OR   AL, 020H   ; lowercase the char 
       _STORE:
 AA         STOSB           ; store char to [DI], advance DI 
 E2 F2      LOOP _LOOP      ; continue loop through string 

Реализуется как MACRO(по сути, функция). Входная строка в SI, длина в CX. Выходная строка в DI.

Выход из программы тестирования ПК DOS:

введите описание изображения здесь

Скачайте и протестируйте пример программы TOLOW.COM .

640 КБ
источник
откуда исходит 14 байтов? фрагмент длиннее, даже без комментариев ... это 14 байтов скомпилированной программы?
Иона
1
@Jonah Байт-код операции находится в левом столбце AC 3C 41и т. Д. Я добавлю собранный шестнадцатеричный байт-код в верхнюю часть для ясности. codegolf.meta.stackexchange.com/a/12340/84624
640 КБ,