Екологічний слід вихідного коду


102

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

Екологічний слід характеру обчислюється таким чином:

Запишіть ASCII код символу у двійковій формі та порахуйте число 1.

Наприклад, Aмає слід 2, але Oбрудніший із слідом 5.

Глобальний слід рядка - це сума слідів його символів. Порожня рядок має нульовий слід.

Ваша програма повинна прийняти рядок ASCII як параметр (через командний рядок або вхід), обчислити його екологічний слід і вивести його. Сама програма повинна бути закодована ASCII.

Хоча є гикавка. Оскільки ваша компанія хоче вийти на новий ринок із суворішими екологічними правилами, вам потрібно налаштувати свою програму так, щоб вона поводилася по-різному в «тестовому режимі». Таким чином:

Програма повинна виводити 0, коли вона отримує рядок testяк параметр.

Оцінка балів

Вихідний код з найменшим екологічним слідом виграє (і так, відповідь testзаборонено!)


36
Вибачте, я не йшов в ногу з новинами, але я просто її прочитав. Чи можна припустити, що німецька автомобільна компанія точно НЕ називається Volkswagen?
Рівень Рівер Сен

7
Для довідки, найдорожчі для менш дорогих персонажів:\x7F}~_?{ow7yvu/s\x1F;=znm>k|OW[]^gc\x1Ex\x1D\eef\\'ZY+-VU.St\x173iNM5K6r\x0FG9:q<ljQ\x15\x13pC\aEF8IJL4\x0E21\x16RTh,X*)\x19\v&%\x1A#d\x1C\rab`!\"$(\x180\x05A\x14B\x12\x11DHP\x03\f\x06\n\t\x80\x10\x01@\x04\b\x02 \x00
Caridorc

19
@steveverrill Це вигадана компанія, але її назва справді починається з V і має W десь посередині. Але будь-яка схожість з реальністю є простим збігом обставин, принаймні хтось нас судить.
Міндвін

1
Дозволені функції (замість програм)?
Луїс Мендо

12
Вони брешуть вам! 1 набагато екологічніше, ніж 0. Хочете доказів? Роздрукуйте вихідний код у двійковій формі Використання 0 використовується чорнилом майже вдвічі більше, ніж 1. І якщо ви кодуєте темний фон, вони також витрачають більше електроенергії для відображення на екрані. (Якщо ви кодуєте з білим тлом, ви вже витрачаєте електрони, роблячи все це білим, тому чітко будь-який екологічно свідомий програміст повинен використовувати чорний фон у своєму редакторі.) Щоб бути надзвичайно екологічним, ми всі повинні писати Whitespace ...
Даррел Гофман

Відповіді:


45

CJam, 33 31

"",AA#b:c~

Існує 11300000000950000000034000000011600000001010000000115000000011600000000340000000061000000003300000000420000000058000000010500000000500000000102000000009800000000490000000102000000009800000000490000000098 нульові байти між подвійними лапками.

Код еквівалентний

11300000000950000000034000000011600000001010000000115000000011600000000340000000061000000003300000000420000000058000000010500000000500000000102000000009800000000490000000102000000009800000000490000000098
AA#b:c~

які можна перевірити в Інтернеті .

Як це працює

"",  e# Push the length of the string.
AA#  e# Push 10000000000.
b    e# Turn the length into the array of its base-10000000000 digits.
:c   e# Cast each digit to character. This pushes the following:
     e# q_"test"=!*:i2fb1fb1b
~    e# Evaluate the string.

Як це працює

q_     e# Read all input and push a copy.
"test" e# Push the string "test".
=!*    e# Check for inequality and repeat the string 0 or 1 times.
       e# This replaces input "test" with the empty string.
:i     e# Cast each character to integer
2fb    e# Replace each integer by the array of its base-2 digits.
1fb    e# Replace each array of base-2 digits by the sum of its digits.
1b     e# Add the sums of digits.

Цей вихідний код має екологічний слід 75.


3
Нічого собі, це розумно. Я думаю, що застереження полягає в тому, що ви ніколи не могли його виконати, оскільки вся пам'ять у світі не могла вмістити весь код.
Рето Коради

49
Це незначна незручність. Не можна цінувати природу.
Денніс

Це приємний трюк, але він недійсний, якщо його не можна запустити
edc65

5
@PyRulez: Нічим, крім того, якщо воно буде побудоване з чогось іншого, крім матерії, і займе щось інше, ніж простір.
vsz

5
Чому б не просто використовувати Lenguage?
jimmy23013

40

Lenguage , 0


Вихід в Унарний , так як Lenguage / Brainfuck не має жоден нормальний спосіб друку цілих чисел в базі 10.

Фактичний вихідний код містить

22360559967824444567791709913713659826044558304969374451791514225490473373040212332757409553558758107085015797320276213515502796255082717802632399123502087743818475438512153373406931103005017157351410347278489842099128517039634739852783737052963203448945756470632484148121769939122103257063633371522287190530269279693540898545359211009781370158317748609540216376596783541124510013448091325488601732964773653391702083563797082990404753843419895799343996435988722965711513708742853668363743953430527328863418281733901770990932025503662188187254784985474815936854540100376410040743052620419372327997519047616042603909398552951490180076364164838561112002025592431155898041427468731461614504254168899805662501979953318388813759833797929243626668399650485310047043700001093878284174322463350892654886806075148010832042248607926124030339950499631072150856939786062937034833055717723216663269161130154002679878012158315587925933383341827053312086716181702533743607685576475754259877651521989944802973721727159955208722180232955193930065862370838526521351991966172723976565264862909528310162816593997640732796289501819499741414526385058421824690665542546821941125191276568479078107133076037506211133628962099403163812267452274532219562823184225236020523509355625620557197876838014050964240952738109101849512504021041103516630358995290177306585560988278630098667702211916671663291473843258785929522017507744814910480115446168939335008597569919072874897148594826036210511162928991890818427747059833051607455121463371211282760364668765311589329918870071117807132901910082663054895226456039171170783440772764031568108965851688162729239711772886386306884508520204834432674839183166053019421652064937613583258148354531835035461504442885024563141848164279928769795684221364984104923764359842286827870778678989243517189772102669283996930513577004801536579491093711362942690905779844535371088542020595945700544234301668098553671685123172583259206072965508639556627967633275762621813851479909708616154198658896714629908456913467267354690109885368211752176196164620615081464122410029328694509842558492529684841818953632659248840216891072110853731776562597900145806210691868173380612838327841104919352821441230296200143603175486627682007399030356592930049570084097858148122367

null bytes і еквівалентна наступній програмі Brainfuck:

,[<<+++++++++++++++++++++++++++++++++++++++++++++++++>>>>>>,]
>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<
<<<++++++++++++++++++++++++++++
[-<----<<<<----<<<<----<<<<---->>>>>>>>>>>>>]
<----<<<<---<<<<+++++++++++<<<<----
<<<<
[>>>>>>>>>>>>>>>>>>>>>>>>]
>>>>
[>>>>>>>>>>>>>>>>>>>>>>>>]
>>>>
[>>>>>>>>>>>>>>>>>>>>>>>>]
>>>>
[>>>>>>>>>>>>>>>>>>>>>>>>]
>>>>
[>>>>>>>>>>>>>>>>>>>>>>>>]
>>>>
[
 <<<<<<<<<<<<<<<<<<<<<<<<
 <<<++++++++++++++++++++++++++++
 [-<++++<<<<++++<<<<++++<<<<++++>>>>>>>>>>>>>]
 <++++<<<<+++<<<<-----------<<<<++++
 >>>>>>>>>>>>
 [
  -[<]<<[.<]
  >>>
  -[<]<<[.<]
  >>>
  -[<]<<[..<]
  >>>
  -[<]<<[.<]
  >>>
  -[<]<<[..<]
  >>>
  -[<]<<[..<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[.<]
  >>>
  -[<]<<[..<]
  >>>
  -[<]<<[..<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[..<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[.<]
  >>>
  -[<]<<[..<]
  >>>
  -[<]<<[..<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[..<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[..<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[.....<]
  >>>
  -[<]<<[.<]
  >>>
  -[<]<<[..<]
  >>>
  -[<]<<[..<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[..<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[..<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[.....<]
  >>>
  -[<]<<[..<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[.....<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[.....<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[.....<]
  >>>
  -[<]<<[.....<]
  >>>
  -[<]<<[......<]
  >>>
  -[<]<<[.<]
  >>>
  -[<]<<[..<]
  >>>
  -[<]<<[..<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[..<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[..<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[.....<]
  >>>
  -[<]<<[..<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[.....<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[.....<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[.....<]
  >>>
  -[<]<<[.....<]
  >>>
  -[<]<<[......<]
  >>>
  -[<]<<[..<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[.....<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[.....<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[.....<]
  >>>
  -[<]<<[.....<]
  >>>
  -[<]<<[......<]
  >>>
  -[<]<<[...<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[.....<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[.....<]
  >>>
  -[<]<<[.....<]
  >>>
  -[<]<<[......<]
  >>>
  -[<]<<[....<]
  >>>
  -[<]<<[.....<]
  >>>
  -[<]<<[.....<]
  >>>
  -[<]<<[......<]
  >>>
  -[<]<<[.....<]
  >>>
  -[<]<<[......<]
  >>>
  -[<]<<[......<]
  >>>
  -[<]<<[.......<]
  <
 ]
]

Спробуйте це в Інтернеті на brainfuck.tk .

Довжина коду Brainfuck вкрай неоптимальна - для початку я чітко кодував сліди всіх символів ASCII - але оцінка 0 - оцінка 0 ...


Ні в якому разі, Lenguage насправді підтримує нульові байти ?!
Бета-розпад

20
Я вважаю, що така відповідь не викликає поваги громадськості: це обман і гра в систему ... Але в цьому і полягає вся суть цього виклику. +1
edc65

1
"Вихід є нерівномірним, оскільки у" Lenguage / Brainfuck "немає певного способу друку цілих чисел у базі 10." . Я подумав, що частиною пункту Lenguage / Brainfuck є те, що у нього не було здорового способу робити що-небудь :)
Адам,

9
Це не дуже спрацювало для мене, коли я намагався відтворити вашу програму з визначеного вами визначення. Чи можете ви, будь ласка, опублікувати повне джерело мови, щоб я бачив, де ваша програма відрізняється від моєї спроби її відтворення? ;-)
Корт Аммон

1
Мене дивує не те, що Lenguage підтримує нулі, а те, що вам вдалося зробити таку програму в BF. Привиди ...
Ерік Переможник

12

PowerShell, 337 344 304 бали

PARAM([CHAR[]]$A)$A|%{$B+=([CONVERT]::TOSTRING(+$_,2)-REPLACE0).LENGTH};($B,0)[-JOIN$A-CEQ"test"]

Я РОЗПОЧАЮТЬ ВАС НА ТЕБЕ, ЩО БЕШЕ!

Приймає введення як $A, потім передає як масив char, потім повторює цикл for-циклу для кожного символу, використовує смішно wordy [convert]::ToString()для перетворення символу в цій позиції у бінарний, замінює всі 0-ма на нічого, потім рахує довжину та додає, що до $B. Зрештою, використовує еквівалентність індекс в динамічний масив (тобто, якщо $Aє test, то -CEQє $TRUE, так що індекси до другого елементу, 0).

Edit1 - Виправлений тестовий випадок "TEST"
Edit2 - Виграв кілька очок, повторивши самі символи, а не їхні індекси, і пам’ятаючи, що -replaceдругий параметр не потребує, якщо ви замінюєте його нічим.


Подвійна цитата " 00100010є більш екологічною, ніж одинарна ' 00100111.
Джейкоб Кралл

Повертає неправильне значення 0 для введення"TEST"
Jacob Krall

1
@JacobKrall Хороший улов на подвійну цитату ". Також виправлено з урахуванням -CEQчутливості до регістру. Це трохи збільшило бали, тому що я неправильно забив, ' 'оскільки я не розмежував його правильно на своїх тестах.
AdmBorkBork

9

Піт - 52 49

Три очки економлять завдяки @orlp.

*/.BQ`1nQ"test

Здійснює введення в лапки, щоб зберегти слід.

Тестовий сюїт .


Тьфу, я майже так само, як і ти, але моя відповідь занадто схожа, і ти опублікував першим. Замінити @,0з , *щоб зберегти 3 :)
orlp

1
@Maltysen Ти кажеш, що ти знайшов три пункти, але джерело все ще говорить @,0, ти просто забув змінити?
плескати

@ConfusedMr_C так. Я просто змінив постійну посилання і забув фактичну відповідь.
Малтісен

7

Лисп звичайний, 294 281 235

Для того, щоб зменшити бал, я використовував @(вартість 1) та !(вартість 2) як імена змінних (правка: а ще краще, якщо я використовую @змінну, що найбільше функціонує у функції). Я кричу TOO , тому що це дешевше.

(LAMBDA(@)(IF(STRING="test"@)0(LOOP FOR ! ACROSS @ SUM(LOGCOUNT(CHAR-CODE !)))))

Досить надруковані

(LAMBDA (@)
  (IF (STRING= "test" @) 0
      (LOOP FOR ! ACROSS @ SUM (LOGCOUNT (CHAR-CODE !)))))

Ну рахунок більше схожий на 294;)
Cabbie407

@ Cabbie407 Я пропустив частину про забиття балів, вибачте :-)
coredump

1
@ Cabbie407 У мене було дивне відчуття наявності дуже низької оцінки на пару хвилин ...
coredump

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

1
@ Cabbie407 я забув подякувати, btw. Дякую.
coredump

6

JavaScript, 279

Редагування виправлення помилок (не враховувало біт 1 кожного символу)

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

B=(P=prompt)(H=D=0)
while(B!="test"&&(A=B.charCodeAt(H++)))while(A)D+=A&1,A>>=1
P(D)

Деякі інструменти (протестовано з Firefox)

w=c=>c.toString(2).split('').reduce(function(a,b){return a- -b})

t=[[],[],[],[],[],[],[],[],[]]
u=[[],[],[],[],[],[],[],[],[]]
for(c=1;c<256;c++)
  c<33|c>126&c<161 ? t[w(c)].push('\\'+c) : u[w(c)].push('&#'+c+';')
for(i=0; i++<8;)       
  T.innerHTML+=i+': '+u[i].concat(t[i]).join(' ')+'\n'

function Calc()
{
  var r='', t=0, b
  I.value.split('').forEach(function(c) {
    c = c.charCodeAt(), r += '\n&#'+c+' '+((256+c).toString(2).slice(1))+' : '
    for(b=0;c;c>>=1) b += c&1
    r += b, t += b
  })
  R.innerHTML='Total '+t+'\nDetail'+r
}
#I { width: 400px }
<b>Weight table</b><pre id=T></pre><br>
<b>Counter</b><br><textarea id=I></textarea><button onclick="Calc()">-></button> <pre id=R></pre>


1
Ця відповідь недійсна - вона виводить 17 для testзамість 0.
ASCIIThenANSI

@ASCIIThenANSI не в моєму браузері. Але я ще раз
перевірю

Це смішно ... Тестуючи його на своєму лічильнику, я отримую 279, а тестуючи його сам, я отримую 277. Цікаво, що це правильно; чи може це мати щось спільне з новими рядками?
ETHproductions

@ETHproductions Я двічі перевірив і правильний підрахунок дорівнює 279. Але це не працює з рядком, що містить новий рядок - це проблема, пов’язана з promptфункцією. У Firefox promptпереводить нові рядки (2 біти) у пробіли (1 біт), тому ми отримуємо 277 замість 279
edc65

@ETHproductions ... у Chrome (в Windows) новий рядок стає парою CR LF (3 біт + 2 біт), і підрахунок знову помиляється
edc65

6

Юлія, 254 246 232

P=readline()
print(P=="test"?0:sum([count_ones(1*A)for A=P]))

count_onesФункція підраховує кількість одиниць в двійковому представленні його введення.

Знизив мій екологічний слід завдяки FryAmTheEggman!


1
Немає проблем, мене просто цікавить навколишнє середовище;)
FryAmTheEggman,

6

Пітон 3, 271

z=input();print([sum([bin(ord(i)).count("1")for i in z]),0][z=="test"])

3
Багато маленьких змін дає мені 228
FryAmTheEggman,

2
Чому б не скористатися тим, що bools є ints? z=input();print(sum(bin(ord(i)).count("1")for i in z)*(z!="test")).... @ Jryx FryAmTheEggman?
NightShadeQueen

1
@NightShadeQueen Ха-ха, це означає, що я не можу публікувати день? : X Так чи інакше, це дуже приємний улов для нового користувача цього сайту, приємна робота! У будь-якому випадку, ласкаво просимо до PPCG! :) Крім того, більш тематично, крапку з комою можна видалити, оскільки вона коштує трохи дорожче, ніж новий рядок.
FryAmTheEggman

5

Перл, 136 118 73

$_=unpack"B*";$_=y@1@@

Замініть все @на\0

Приклад використання:

perl -p entry.pl entry.pl

5

MATLAB, 198 194 байт

A=input('','s');~strcmp('test',A)*nnz(dec2bin(A)-48)

Спочатку рядок зчитується з STDIN через inputфункцію. Як тільки це станеться, ми порівнюємо вхідний рядок із рядком test. Якщо результат відсутній test , ми перетворюємо кожен символ у його ASCII код, а потім його бінарне представлення через dec2bin. Прекрасним наслідком цієї функції є те, що якщо ви надсилаєте рядок, двійкове представлення її коду ASCII обмежується як один символ на рядок.

Як приклад:

>> dec2bin('ABCD')

ans =

1000001
1000010
1000011
1000100

dec2binвиводить символьний масив. Як тільки це станеться, відніміть на 48, що є кодом ASCII для 0, так що матриця перетворюється на double0 і 1. Як тільки це станеться, виклик nnzпідраховує загальну кількість ненульових елементів у цій матриці. Візьмемо до уваги, що цей результат множиться на протилежний рядку порівняння з test. Якщо рядок не буде test, ми отримуємо розрахунок сліду. Якщо вона дорівнює, то множення призводить до 0.

Деякі приклади:

>> A=input('','s');~strcmp('test',A)*nnz(dec2bin(A)-48)
A

ans =

     2

>> A=input('','s');~strcmp('test',A)*nnz(dec2bin(A)-48)
O

ans =

     5

>> A=input('','s');~strcmp('test',A)*nnz(dec2bin(A)-48)
test

ans =

     0


>> A=input('','s');~strcmp('test',A)*nnz(dec2bin(A)-48)
  %// Note - no characters were added here.  Simply pushed Enter

ans =

     0

Якщо вам дозволено використовувати панель інструментів зв’язку, ви можете використовувати de2biзамість цього і уникати -48приведення його до числового типу (а також двох додаткових символів у назві функції).
стакан

5

Баш 440 430 412 405 403

A=0
[ test != "$1" ]&&for((D=0;D<${#1};D++)){
A=$((A+`bc<<<$(printf "obase=2;%d" "'${1:$D:1}")|tr -d "0
"|wc -m`))
}
echo $A

Досить прямо. Цикли символів на вході, перетворюючи спочатку в ascii (з printf %dі провідним 'за числом, потім у двійкове (з bc), викреслюють нулі та підраховують кількість символів.

Не чудова відповідь, але ще не бачив спроби удару.

Змінено з моєї першої відповіді дозволило ввести рядок введення просто в командному рядку (тобто це стало декілька вхідних парам, якщо багаторівневі слова), але після прочитання деяких інших відповідей, я думаю, я можу припустити, що це цитується, тому весь рядок виходить як $1


1
Ласкаво просимо до головоломки програмування та коду для гольфу! 1. Ви можете замінити doна {і doneна }. 2. Вам також не потрібні місця навколо <<<. 3. Ви можете замінити \nбуквальним передачею рядків.
Денніс

Дякую @Dennis. Одне з викликів на цьому веб-сайті - це навчити купу «хороших звичок» :).
Адам

3
Це точно. Якщо ви ще цього не зробили, рекомендую ознайомитись із порадами щодо гольфу в Баші . Це чудовий ресурс.
Денніс

3
Ця проблема дивна навіть за стандартами гольфу! Зайві символи все ще можуть зберігати очки. Використання =та ||вартість 15, тоді як використання !=та &&лише 13! Додатковий персонаж, але економить два очки ...
Адам,

5

Цейлон, 1431 , 764 , 697 , 571 , 547 , 538 , 501 , 493 , 467 , 451

shared void p(){print(sum{0,if(exists a=process.arguments[0])if(a!="test")for(c in a)for(b in 0..7)if(c.hash.get(b))1});}

Це було оригінальне, невольфське:

Integer footprintCharacter(Integer b) {
    return sum({0, for(i in 0..7) if(b.get(i)) 1 });
}
Integer footPrintString(String s) {
    if(s == "test") {return 0;}
    return sum({0, for(c in s) footprintCharacter(c.integer)});
}
shared void footprint() {
     if(exists s = process.arguments[0]) {
         print(footPrintString(s));
     } else {
         print("This program needs at least one parameter!");
     }
}

Це бере аргумент з параметра командного рядка ... process.arguments - це (можливо, порожня) послідовність рядків, тому перш ніж використовувати один з них, нам потрібно перевірити, чи він насправді існує. В іншому випадку ми виводимо повідомлення про помилку (це питання не вимагає, і його буде викинуто в наступних версіях).

Цейлону sumфункція приймає непорожнє Iterable елементів деякого типу , який повинен задовольняти Summable, тобто є plusспосіб, як Integer. (Це не працює з порожніми послідовностями, оскільки у кожного типу Summable буде свій нуль, і час виконання не має шансів дізнатися, що саме означає.)

Елементи рядка, або один біт цілого числа, не є порожнім ітерабельним. Тому ми використовуємо тут функцію для побудови ітерабельного, вказуючи деякі елементи, а потім "розуміння" (яке буде оцінено до нуля або більше елементів). Отже, у випадку символів ми додаємо їх (але лише тоді, коли встановлено відповідний біт), у випадку рядка ми додаємо результат символів. (Розуміння буде оцінено лише тоді, коли функція прийому насправді повторюється над нею, а не при побудові Iterable.)

Подивимось, як ми можемо зменшити це. По-перше, кожна з функцій викликається лише в одному місці, тому ми можемо їх вбудувати. Також, як було сказано вище, позбудьтеся повідомлення про помилку. (764 бальних оцінок.)

shared void footprint() {
    if (exists s = process.arguments[0]) {
        if (s == "test") {
            print(0);
        } else {
            print(sum({ 0, for (c in s) sum({ 0, for (i in 0..7) if (c.integer.get(i)) 1 }) }));
        }
    }
}

Насправді нам не потрібна внутрішня вкладеність sum, ми можемо зробити це одне велике розуміння. (Це заощаджує нам 37 очкових позицій для sum({0,})та ще трохи для пробілу, який у будь-якому разі буде усунено в кінці кінців.) Це 697:

shared void footprint() {
    if (exists s = process.arguments[0]) {
        if (s == "test") {
            print(0);
        } else {
            print(sum({ 0, for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 }));
        }
    }
}

Ми можемо застосувати аналогічний принцип до спеціального "test"рядка, що знаходиться в обкладинці : так як у такому випадку результат дорівнює 0 (тобто нічого не внесено до суми), ми можемо просто зробити це як частину підсумовування (але умову потрібно перевернути) . Це, головним чином, заощаджує нас print(0);, деякі підтяжки та купу пробілів, знижуючись до рівня 571:

shared void footprint() {
    if (exists s = process.arguments[0]) {
        print(sum({ 0, if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 }));
    }
}

Ми робимо те ж саме для першого if, з побічним ефектом, який зараз не дає жодних аргументів, і не дає 0нічого робити. (Принаймні, я думав, що це відбудеться тут, натомість, здається, висить вічна петля? Дивно.)

shared void footprint() {
    print(sum({ 0, if (exists s = process.arguments[0]) if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 }));
}

Ми можемо на самому ділі опустити ()для sumфункції тут, використовуючи альтернативний синтаксис виклику функції , яка використовує {...}замість (), і заповнимо осягнення в Iterable аргументів. Це має слід 538:

shared void footprint() {
    print(sum{ 0, if (exists s = process.arguments[0]) if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 });
}

Заміна назви функції footprint(40) на p(3) заощаджує ще 37 балів, що приводить нас до 501. (Назви цілонових функцій повинні починатися з малих символів, тому ми не можемо отримати менше 3 балів.)

shared void p() {
    print(sum{ 0, if (exists s = process.arguments[0]) if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 });
}

Імена змінних s(5) і c(4), i(4) також не є оптимальними. Замінимо їх на a(аргумент), d(розряд?) Та b(біт-індекс). Слід 493:

shared void p() {
    print(sum{ 0, if (exists a = process.arguments[0]) if (a != "test") for (c in a) for (b in 0..7) if (c.integer.get(b)) 1 });
}

Я не бачу жодної оптимізації, що не залишається пробілом, тому давайте видалимо не потрібний пробіл (1 бал за кожен пробіл, два для кожного з двох розривів рядків):

shared void p(){print(sum{0,if(exists a=process.arguments[0])if(a!="test")for(c in a)for(b in 0..7)if(c.integer.get(b))1});}

Під час перегляду API я виявив, що Character.hash насправді повертає те саме значення, що і його integerатрибут. Але він має всього 14 балів замість 30, тому ми доходимо до 451!

shared void p(){print(sum{0,if(exists a=process.arguments[0])if(a!="test")for(c in a)for(b in 0..7)if(c.hash.get(b))1});}

4

PowerShell, 273 336 328 324 293 288 295

PARAM($A)[CHAR[]]$A|%{$D=[INT]$_;WHILE($D){$B+=$D-BAND0X1;$D=$D-SHR1}};($B,0)[$A-CEQ"test"]

редагувати - забув "тестовий" випадок ... так дорого.

editedit - упущена можливість ПІДГОТОВКИ.

редагував редактор - включив пропозиції щодо коментарів (спасибі TimmyD).

редагувати 4 - D - дешевша величина, ніж C (2 проти 3)

редагувати 5 - Назад до 295 через перевірку чутливості до регістру.

Петля над рядком і рахує значення 1s, які зміщуються з символів ASCII значення.

Хет-підказка TimmyD за те, що я дав мені передбачити використання великих літер І використовувати індекс масиву в кінці.


1
Гарний підхід! Пару гольфів (видалили ініціалізацію $ B, оскільки вона буде за замовчуванням до нуля, вилучили пару паренів, вилучили деякі крапки з комою), зводить її до 293 PARAM($A)[CHAR[]]$A|%{$C=[INT]$_;WHILE($C){$B+=$C-BAND0X1;$C=$C-SHR1}};($B,0)[$A-EQ"TEST"]
AdmBorkBork,

Що це означає, коли я читав "Гарний підхід!" і почули голос від Wii Golf? Дякую за покажчики! Ініціалізація відключила мене під час тестування на консолі PowerShell, і я залишив її. Добре знати інше.
Сорок3,

Так - якщо ви використовуєте консоль, це майже середовище REPL, в якому присвоєні змінні залишаються з одного рядка в інший. Якщо ви збережете його як .ps1, то $ B (і кожна інша змінна) буде ініціалізована повторно, навіть якщо натиснути стрілку вгору-ввести з тієї ж оболонки. Наприклад,PS C:\scripts> .\ecological-footprint.ps1
AdmBorkBork

Повертає неправильне значення 0 для введення"TEST"
Jacob Krall

1
281PARAM($A)(([CHAR[]]$A|%{$B=$_;0..9|?{[INT]$B-SHR$_-BAND1}}).LENGTH,0)[("TEST"-EQ$A)]
tomkandy


4

С, 374

Нові рядки (не включені в бал) додані для наочності. Можна було б покращити до 360, просто змінивши імена змінних у великі регістри, але я спробую придумати щось краще.

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

i,t;
main(int c,char**v){
for(;c=v[i][i/8];i++)t+=(c>>i%8)&1;
printf("%d",strcmp(v[1],"test")?t:0);
}

4

PHP, 377 337 299 Екологічний слід (ще багато) , 102 91 байт

Здається, що PHP є екологічно чистим лише в тестовому режимі. ;)

WHILE($D<STRLEN($A=$argv[1]))$B+=SUBSTR_COUNT(DECBIN(ORD($A[$D++])),1);ECHO"test"!=$A?$B:0;

Запускається з командного рядка, як:

php footprint.php hello
php footprint.php test

whileє більш сприятливим для навколишнього середовища, forнавіть якщо вони мають однаковий підрахунок символів. Також імена змінних великих регістрів мають кращий слід, ніж їхні малі регістри.

Редагувати

  • збережено 40 очок за допомогою великих імен функцій.
  • зберегли 38 балів, використовуючи decbinзамістьbase_convert

1
@Adam Ось дискусія про повідомлення та тут про теги відкриття PHP . Сподіваюсь, це вам корисно.
insertusernamehere

4

VBA, 475 418

Дякую Якобу за 57 очок

  • Перетворює рядок у байтовий масив (128 - це ярлик vba для "Перетворює рядок з Unicode на сторінку коду за замовчуванням у системі", тому не буде працювати на Mac ....)

  • Цикли, хоча байтовий масив перетворюється на Бінарне та об'єднує все разом.

  • чеки на тест
  • Друкує довжину рядка з усіма 0 заміненими нічим

VBA чому ти так поганий у гольфі ... :(

SUB A(D)
DIM B() AS BYTE
B=STRCONV(D,128)
FOR P=0 TO UBOUND(B)
H=H+APPLICATION.DEC2BIN(B(P))
NEXT
IF D="test" THEN H=0
MSGBOX LEN(REPLACE(H,0,""))
ENDSUB

4
VBA нечутливий до регістру, тому ви повинні використовувати великі регістри скрізь, щоб зберегти крапку на малі символи! (крім "test"звичайно)
Jacob Krall

4

JavaScript, 418 410

A=prompt();B=0;!A||A=="test"?0:A.split("").forEach(D=>B+=D.charCodeAt().toString(2).match(/1/g).length);alert(B)

Подвійна цитата " 00100010є більш екологічною, ніж одинарна ' 00100111.
Якоб Кралл

3

Піта, 64

?qz"test"0l`sS.Bz

Перевіряє, чи є вхід тестовим, а якщо ні, підраховує число 1 у двійковому поданні введення.


3

Хаскелл, 292

a 0=0
a b=rem b 2+a(div b 2)
b"test"=0
b d=sum$map(a.fromEnum)d
main=interact$show.b

Тут нічого не можна сказати: перетворіть кожен символ у значення ascii ( fromEnum) та обчисліть 1s (via a). Підсумуйте всі результати.


3

JavaScript (ES6), 521 478 458 449 473 465

alert(((A=prompt(),A!="test")&&(A!=""))?(A.split``.map(H=>(H.charCodeAt().toString(2).match(/1/g)||[]).length)).reduce((A,B)=>A+B):0)

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


Загальновизнано, що JavaScript для гольфу потребує певної форми виробництва, а не неявної. Це може бути попередження, document.write або навіть повернення функції.
Mwr247

Ви можете перемістити своє швидке призначення в перше 's' в операторі if, оточеному дужками, щоб зберегти пару байтів. Ви також можете видалити "0" у charCodeAt. Крім того, велика економія - використання термінального оператора замість заяви if / else =)
Mwr247,

Дуже дякую! Хоча я в кінцевому підсумку скористався комою замість дужок для швидкого призначення; це економить інший байт. (: @ Mwr247
Zach Gates

s.split ('') замість цього може бути s.split``, економлячи 2 байти
Dendrobium

1
За коментарем Dendrobium вище @JacobKrall
Zach Gates

3

Рубі, 316 313

Дуже просто, шукаючи ще кілька можливостей для гольфу:

b=gets.chomp;b=='test'?0:b.chars.map{|i|i.ord.to_s(2).count('1')}.inject(:+)
  • Використовується bзамість того, xщоб зберегти 3 бали.

Ви можете використовувати $*[0]замість gets.chomp(приймає введення як аргумент командного рядка)
Mhmd,

Подвійна цитата " 00100010є більш екологічною, ніж одинарна ' 00100111.
Якоб Кралл

Великі назви змінних також є більш екологічними, ніж еквівалентні малі регістри. Hкраще, ніж Iз тієї ж причини.
Джейкоб Кралл

3

Пітон 2, 294 281 269 266

A=input()
print sum(format(ord(H),"b").count("1")for H in A)if A!="test"else 0

Порт моєї відповіді Pyth, вище.

Вхід отримується у вигляді рядка (з лапками):

"ABC"

1
Подвійна цитата " 00100010є більш екологічною, ніж одинарна ' 00100111.
Джейкоб Кралл

Кілька основних модифікацій зводять це до A=input();print[sum(bin(ord(H)).count("1")for H in A),0][A=="test"]рахунку 243.
Кейд,


2

Піта, 96

Iqz"test"0.q)/j""m.BdmCdz\1

Порт моєї відповіді CJam, вище / нижче.


Лише деякі загальні зауваження Pyth: замість того, Iщоб спробувати використовувати термінал ?, але в цьому випадку, оскільки це бул, який ви можете просто використовувати *(після переходу на nзамість q), kавтоматично, ""а sна рядках - це те саме jk. Сподіваюся, вам весело вивчити піт! :)
FryAmTheEggman

Це була моя перша відповідь Pyth: P Це було досить важко, хоча, весело. Дякуємо за поради! @FryAmTheEggman
Zach Gates

2

CJam, 83 81 79 77

Найкраще до цього часу, спробувавши ряд варіантів:

l0$"test"=!\:i2fbe_1b*

Спробуйте в Інтернеті

Пояснення:

l       Get input. Other options like q and r are the same number of bits.
0$      Copy input for comparison. This saves 2 bits over _.
"test"  Push special case string.
=       Compare.
!       Negate so that we have 0 for special case, 1 for normal case.
\       Swap input string to top.
:i      Convert characters to integers.
2fb     Apply conversion to base 2 to all values.
e_      Flatten array.
1b      Sum up the bits. This is 2 bits shorter than :+.
*       Multiply with result from special case test.

2

Рубі, 247

Прямий підхід прокручуючи всі байти вхідних даних і всі біти в кожному байті, підсумовуючи змінну d.

dініціалізовано до -2, оскільки hмістить завершальний новий рядок із вхідних даних (варто 2 біта), і ми не хочемо цього рахувати.

Аналогічно hбуде міститись testіз зворотним новим рядком, тому новий рядок повинен бути включений у значення порівняння.

d=-2
h=gets
h.bytes{|a|8.times{|b|d+=a>>b&1}}
p h=='test
'?0:d

2

R, 279

sum(as.integer(rawToBits(charToRaw(if((s=readline())=='test')''else s))))

Досить пояснюючи себе.
Тести:

> sum(as.integer(rawToBits(charToRaw(if((s=readline())=='test')''else s))))
sum(as.integer(rawToBits(charToRaw(if((s=readline())=='test')''else s))))
[1] 279
> sum(as.integer(rawToBits(charToRaw(if((s=readline())=='test')''else s))))
A
[1] 2
> sum(as.integer(rawToBits(charToRaw(if((s=readline())=='test')''else s))))
O
[1] 5
> sum(as.integer(rawToBits(charToRaw(if((s=readline())=='test')''else s))))
test
[1] 0
> sum(as.integer(rawToBits(charToRaw(if((s=readline())=='test')''else s))))
OAO
[1] 12

2

С, 378 слід, 98 байт

Ще одне рішення C:

s;main(c,a)char**a;{for(s=-17*!strcmp(a[1],"test");c=*a[1]++;)for(;c;s+=c&1,c/=2);printf("%d",s);}

Це працює так, що s зазвичай ініціалізується на 0, але стає -17, якщо аргумент командного рядка є "тестовим" (strcmp повертає 0 на рівних рядках, а ненульовий - на різних рядках, тому інвертуючи це дає 1, якщо рядок є "тест"). Число -17 було обрано для компенсації сліду 17, який буде розраховано на "тест". Обчислити слід легко за допомогою побітових операторів.

Оснастка! Я спочатку пропустив "найкоротші виграші сліду", тому я прагнув до найкоротшого коду ... Я побачу, чи можу я зробити "слід" меншим.


2

Ява, 594

class A{public static void main(String[]P){Integer D,H;for(D=H=0;D<P[0].length();)H+=D.bitCount(P[0].charAt(D++));System.out.print(P[0].equals("test")?0:H);}}

Java не дуже зелена.

Безгольова версія:

class A {
    public static void main(String[]P) {
        Integer D,H;
        for(D=H=0;D<P[0].length();)
            H+=D.bitCount(P[0].charAt(D++));
        System.out.print(P[0].equals("test")?0:H);
    }
}

Dоголошено як такий, Integerщоб ми могли отримати доступ Integerдо статичного bitCountметоду екологічно сумлінним способом. bitCountМетод розглядає charS як цілі числа і повертає число встановлених біт.


1
Цікаве порівняння Java з Цейлоном ... У Java є певні накладні витрати за рахунок котлової панелі та більш тривале повідомлення про друк. BitCount допомагає, хоча на Цейлоні цього немає. Цейлон має більш довгий спосіб доступу до параметрів командного рядка, а також повинен перевірити, чи вони дійсно задані (де ваша програма просто кине ArrayIndexOutOfBoundsException). Функція суми Цейлону, безумовно, коротша, ніж додавання її вручну на Цейлоні (але Java не має жодних розумінь, тому додавання вручну краще, ніж створення інтерабельного самостійно).
Paŭlo Ebermann
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.