7 л8р, ніж 9? (Це сім пізніше дев'яти?)


10

Це досить простий виклик коду для гольфу. У вашій програмі, що має рядок ASCII, слід розбити цей рядок на два рядки, які вона оцінить. Якщо другий рядок "пізніше", ніж перший, він поверне 1, якщо він "раніше", ніж перший, він поверне -1, і якщо вони однакові, він поверне 0. До уточнимо, що означають "пізніше" та "раніше", давайте розглянемо коди символів ASCII. Вам потрібно порівняти кожен символ рядка, трактуючи кожен з них як цифри числа. Пізніше відноситься до більшої кількості, що виникає після меншої кількості. Рядки будуть відформатовані дефісом для розділення двох вхідних груп.

Погляньте на цей приклад:

7-9як вхід повинен повернутися 1.

7перетворює в ASCII код 55і 9перетворює в ASCII код 57.

Як це 57відбувається чисельно після 55, 9пізніше, ніж 7.

Ще один приклад:

LKzb-LKaj як вхід повинен повернутися -1

Кодові послідовності ASCII для цього є 76-75-122-98і76-75-97-106

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

Будь-який вхід із 95 друкованих символів ASCII приймається, за винятком пробілів та дефісів, окрім введення даних. Крім того, струни не гарантують однакової довжини.

Удачі!

РЕДАКТУВАННЯ: Щоб бути більш зрозумілим, до кожного символу слід ставитися як до цифри в цифрі. У прикладі LKzb-LKaj, хоча jце пізніше b, zале пізніше a, а оскільки це більш значна цифра, він має перевагу. Подається рядок завжди буде щонайменше 3 символами, виключаючи порожні рядки із сфери цієї проблеми.

EDIT: Ось ще кілька тестових випадків для вашої допомоги:

  • A-9 -> -1
  • 11-Z -> -1
  • 3h~J*-3h~J* -> 0
  • Xv-Y0 -> 1

1
Чи гарантовано дві струни однакової довжини?
es1024

5
Тестовий випадок 11-Z-> -1не має сенсу з огляду на поточне формулювання питання. Z(90) більше 1(49) і є найбільш значущою буквою. Будь ласка, уточніть, як порівнюються рядки різної довжини.
Джордж Рейт

2
А про що A-AA?

2
@SamWeaver Я знаю, що лівий край - це найзначніша цифра, отже, моє плутанина щодо того, чому 11>Zу ваших прикладах коли 1<Z. Має бути певна невизначена поведінка, що стосується рядків різної довжини, або приклад неправильний.
Джордж Рейт

3
Як було пояснено раніше: кожен рядок повинен розглядатися як цифра в номері-127. Якби ви рахували в цій системі, ви б почали з символу, збільшуючи його до бар'єру символів для друку ~на 126, а потім збільшували б наступну цифру на одну, повертаючи початкову цифру до !. Кожне збільшення найбільш значущої цифри еквівалентно збільшення другої за значимістю цифри на 127.
Сем Вівер

Відповіді:


11

Pyth - 11 байт

Легко, використовує ._знак, щоб отримати знак та Cотримати char-коди.

._-F_CMcz\-

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

Тестовий набір .

._               Sign of number
 -F              Fold subtraction (this finds difference of a tuple)
  _              Reverse list to get correct order of operands when subtracting
   CM            Map char, already treats strings as digits of base256 number
    c \-         Split by "-"
     z           Input

Дуже хороший! Виконує як очікувалося.
Сем Вівер

7

CJam, 12 байт

l'-/esfb~\-g

Спробуйте його в Інтернеті в інтерпретаторі CJam .

Як це працює

l   e# Read a line from STDIN.
'-/ e# Split it at spaces.
es  e# Push the current time (milliseconds since epoch).
fb  e# Consider each string as digits in base huge-number.
~\  e# Dump the results and reverse their order.
-g  e# Subtract and apply sign function.

Відмінно! Це проходить усі тестові випадки.
Сем Вівер

6

Ява, 86 118

int f(String...s){return(int)Math.signum((s=s[0].split("-"))[1].compareTo(s[0])*(s[0].length()==s[1].length()?1:-1));}  

Дуже дивний спосіб порівняння рядків. Зробили швидке виправлення, щоб він пройшов додаткові тестові справи, пізніше буде шукати більше гольфності.

Дякую Вартану за коментарі за signumпропозицію


Чи не порівняє ява повернення 1,0, -1 все одно? Я знаю, що це не гарантується, але чи є такий випадок? в такому випадкуreturn s[0].compareTo(s[1]);
Вартан

Це добре, але це не проходить тестовий випадок 11-Zповернення -1, воно повертається 1.
Сем Вівер

Ах, мені це було не зрозуміло до того, як були додані ці тестові справи. Виправлено.
Геобіт

@Vartan Ні, він повертає різницю значення на першій невідповідній позиції (або різницю в довжині, якщо один і всі символи відповідають). Наприклад, "A".compareTo("Z") повернення-25 . На жаль,
Геобіт

Чи можете ви пояснити цей рядок? i = a!=b ? b-a : s[1].compareTo(s[0]);Я, здається, не розумію ... Крім того, ви можете використовувати Math.signum і врятувати себе, декларуючи i;
Вартан

4

Perl, 31 байт

#!/usr/bin/perl -p
/-/;$_=($`.$'^$`)cmp($'.$`^$')

30 байт + 1 байт для -p. Приймає вхід на STDIN.

Пояснення

Коли операнди cmpмають різну довжину, як-от chickenі egg, вони вирівнюються так:

c  h  i  c  k  e  n
e  g  g  \0 \0 \0 \0

так що egg> chicken( \0є нульовим байтом). Але ми хочемо, щоб вони були вирівняні так:

c  h  i  c  k  e  n
\0 \0 \0 \0 e  g  g

так що chicken> egg.

Для цього ми об'єднуємо їх, один раз з chickenдо eggі один раз з eggраніше chicken:

c  h  i  c  k  e  n  e  g  g
e  g  g  c  h  i  c  k  e  n

Тепер, коли наші два рядки однакової довжини, ми видаляємо провідне слово за допомогою XOR, щоб отримати:

\0 \0 \0 \0 \0 \0 \0 e  g  g
\0 \0 \0 c  h  i  c  k  e  n

А тепер ми можемо використовувати, cmpщоб знайти, хто прийшов першим. (Там я це сказав!)


Дуже розумно- Браво!
Сем Вівер

3

Python 2, 88 символів

a=raw_input().split('-');print-cmp(*(map(ord,s.rjust(max(map(len,a)),'\0'))for s in a))

cmpякщо у вас є два рядки різної довжини, ви не зробите правильно, тому я повинен обробляти їх обома нульовим символом (який ordперетворюється на 0) для обробки цього випадку. На жаль, це додало близько 35 символів, плюс це тепер два рядки замість одного, тому що мені потрібна як довжина вводу, так і перегляд його.


На жаль, це неправильне рішення. Наступний тестовий випадок:, 1-2який повинен повертати 1прибутки -1. Хоч розумна робота.
Сем Вівер

Ну, здається, операнди поміняються. Це дуже дивно, я перевірив це разом з твоїми тестовими кейсами, і я подумав, що це працює нормально! Неважливо, я можу це змінити, не змінюючи кількість символів. Дайте зараз постріляти.
Alex Van Liew

Ваша редакція виправила цю справу, але тепер вона не справляється із 11-Aсправою, яка повинна повернутися -1замість повернення 1в цьому прикладі.
Сем Вівер

Мені не подобаються ваші правила щодо довжини. Я виправив це ціною близько 35 символів, і я не думаю, що я міг би зробити це краще.
Alex Van Liew

1
Мені вдалося отримати коротший відповідь, ніж ваш, кодуючи рядок у шістнадцятковий формат, а потім проаналізувавши її як int. У python 2 для цього, мабуть, за замовчуванням велика експозиція. Таким чином, прокладка 0 більше не потрібна.
Дюни

2

R, 54 байт

Для цього потрібна бібліотека пракми. Він розділяє вхідний рядок на -. Право виправдовує рядки. Ранжирує їх і робить відмінності.

Отже, для 11-7 ми закінчуємо рядки "11" та "7". Ранг їх - [2, 1]. Різниця -1. За 3h ~ J * -3h ~ J * отримуємо "3h ~ J *" і "3h ~ J *". Ранг їх становить [1,5, 1,5] з різницею 0.

diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))

Приклади тесту

> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: LKzb-LKaj
3: 
Read 2 items
[1] -1
> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: A-9
3: 
Read 2 items
[1] -1
> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: 11-Z
3: 
Read 2 items
[1] -1
> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: 3h~J*-3h~J*
3: 
Read 2 items
[1] 0
> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: Xv-Y0
3: 
Read 2 items
[1] 1

Розумний. Приємна робота :)
Алекс А.

2

CoffeeScript, 143 140 139

f=(s)->[a,b]=((t=s.split '-').map (y)->Array((m=Math.max) 1, 1+(m ((l=(c)->c.length) t[0]),l t[1])-l y).join('\u0000')+y);`b<a?-1:(b>a?1:0)`

Ось jsfiddle з результатами (дивіться в консолі)


2

PERL, 46 36 байт

print$2cmp$1if"@ARGV"=~/(\S+)-(\S+)/

Перетворює список argv у рядок, розбивається дефісом на лівий і правий бічні місця без аргументів, а потім повертає дзвінок cmp.


Я підозрюю, що ви можете позбутися від кількох просторів і;
MickyT

Потрібно мати можливість піти: "@ARGV"=~/-/;print$`cmp$' (неперевірено)
Jarmex

1
Хороша ідея для використання cmp, але вона не працює, коли довжини рядків різні. "A" cmp "9"є 1, тоді "11" cmp "Z"як -1, навіть якщо обидва входи повинні повернути однакове значення для цього завдання.
ЦеSuitIsBlackNot

1

Пітон 3, 84 байти

x,y=[int.from_bytes(i.encode(),"big")for i in input().split("-")];print((x<y)-(y<x))

Розбити вхідний рядок на "-". Перетворіть рядки unicode в рядки байтів, а потім інтерпретуйте ці рядки байтів як цілі цілі великі ендіанці. Нарешті зробіть порівняння - (un), на щастя cmp, більше не доступно в Python 3.

Python 2, 69 байт

print -cmp(*[int(i.encode("hex"),16)for i in raw_input().split("-")]) 

Ви можете поголити персонажа, видаливши пробіл між printі cmp.
Alex Van Liew

1

Python 2, 79 байт

Досить просте рішення, і це легко зрозуміти. Порівняє довжину рядків, а потім порівнює рядки лексиграфічно.

Спробуйте тут

s,t=raw_input().split('-')
x,y=len(s),len(t)
print(x<y)*2-1if x-y else cmp(t,s)

1

perl5, 64

perl -aF- -pe '@f=map{length}@F;$_=$f[1]<=>$f[0]||$F[1]cmp$F[0]'

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

perl -laF- -pe '@f=map{length}@F;$_=$f[1]<=>$f[0]||$F[1]cmp$F[0]'

Ця довша версія правильно обробляє невідповідні довжини.


/-/,$_=$`cmp$'було б простіше, і ви можете пропустити -aF-трохи. Крім того, я вважаю це 20 (16 для $_=$F[1]cmp$F[0], і 4 для paF-, збережене у файл і запускається як perl -paF- file.pl).
примо

1
Як я зазначив у відповіді Еріка , cmpце не працює, коли дві струни мають різну довжину, як у 11-Z.
ThisSuitIsBlackNot

@ThisSuitIsBlackNot, виправлено.
hildred

Приємно. Ви можете грати в гольф до 39 до /-/;$_=length$'<=>length$`||$' cmp$`і -p. ( $`зберігає все перед збігом регулярних виразів, $'зберігає все після.) Використання mapфактично коштує більше байтів, ніж просто дзвінок lengthдвічі.
ThisSuitIsBlackNot

0

F #, 53

fun s->let[|a;b|]=s="";s.Split[|'-'|]in b.CompareTo a

Це у формі анонімної функції (лямбда), тому вам потрібно вставити її та вказати параметр безпосередньо після є (або, використовуючи позначення трубопроводів). Наприклад (у FSI):

> "7-9" |> fun s->let[|a;b|]=s="";s.Split[|'-'|]in b.CompareTo a
1
> "abc-abc" |> fun s->let[|a;b|]=s="";s.Split[|'-'|]in b.CompareTo a
0
> "LKzb-LKaj" |> fun s->let[|a;b|]=s="";s.Split[|'-'|]in b.CompareTo a
-1

0

JavaScript ES6, 46 43 байт

f=s=>((a=s.split('-'))[1]>a[0])-(a[1]<a[0])

Хороша робота, але це не завершує тестовий випадок 2: 11-Zповинен повернутися, -1але повернеться 1.
Сем Вівер

1
@SamWeaver Дійсно, що було додано після відповіді і також порушує інші відповіді. Можете чи ви пояснити , чому , '11'>'Z'коли '11'<'ZZ'немає нічого в питанні про те , як порівнювати рядки різної довжини або яке значення порожній рядок має.
Джордж Рейт

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

1
@SamWeaver Перехід від невизначеної поведінки до визначеної змінює її. Ніщо не є персонажем. Якщо це не нульовий характер, який цей обробляє.
Джордж Рейт


0

05AB1E , 12 11 9 байт

'-¡₄ö¥0.S

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

'-¡          # Split the (implicit) input on '-'
             #  i.e. 'LKzb-LKaj' → ['LKzb','LKaj']
   ₄ö        # Convert both parts to a Base-1000 number
             #  i.e. ['LKzb','LKaj'] → [21020061037,21020036045]
     ¥       # Push the deltas (subtraction between each sub sequential pair) of the list
             #  i.e. [21020061037,21020036045] → [-24992]
      0.S    # Get the sign [1 for a>0; -1 for a<0; 0 for a==0] (and output implicitly)
             #  i.e. [-24992] → [-1]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.