Vorkommen von Ziffern

12

Eingang:

Eine Liste von ganzen Zahlen (die niemals eine Null enthalten werden)

Ausgabe:

Eine Liste mit der gleichen Größe, deren Anzahl auf den folgenden Angaben basiert:

  • Wenn das aktuelle Element negativ ist: Sehen Sie sich alle Elemente vor diesem Element an und zählen Sie, wie oft die Ziffern in diesen anderen Zahlen vorgekommen sind
  • Wenn das aktuelle Element stattdessen positiv ist: Sehen Sie sich alle Elemente nach diesem Element an und zählen Sie, wie oft die Ziffer in diesen anderen Zahlen vorgekommen ist

Es gibt eine Wendung: Wenn die Größe der Liste gerade ist, zählen wir jede Zahl nur einmal (auch wenn sie mit mehreren Ziffern übereinstimmt), und wenn die Größe ungerade ist, zählen wir jede Ziffer der Zahlen für jede Ziffer des aktuellen Elements (dupliziert) Ziffern werden mehrfach gezählt).

Lassen Sie uns einige Beispiele geben, um dies ein wenig zu verdeutlichen:

Beispiel mit gerader Liste:

Input:  [4, 10, 42, -10, -942, 8374, 728, -200]
Output: [3, 2,  4,  1,   2,    1,    1,   5   ]

Die Größe der Liste ist gerade , daher zählen wir jede Zahl nur einmal.

  • 4: Es ist positiv, also freuen wir uns. Es gibt drei Zahlen enthalten , die Ziffer 4( 42, -942, 8374). Also fangen wir mit a an 3.
  • 10: Es ist positiv, also freuen wir uns. Es gibt zwei Zahlen, die entweder die Ziffer 1und / oder 0( -10, -200) enthalten. Die zweite Ausgabe ist also 2.
  • 42: Wieder positiv, also vorwärts. Es gibt vier Zahlen , die entweder die Ziffer 4und / oder 2( -942, 8374, 728, -200). Die dritte Ausgabe ist also 4.
  • -10: Dieses Mal ist es negativ, also schauen wir zurück. Es gibt nur eine Ziffer mit der Ziffer 1und / oder 0(wir ignorieren das Minuszeichen) ( 10). Die vierte Ausgabe ist also 1.
  • etc.

Beispiel mit ungerader Liste:

Input:  [382, -82, -8, 381, 228, 28, 100, -28, -2]
Output: [13,  2,   2,  4,   8,   3,  0,   11,  6 ]

Die Größe der Liste ist ungerade , daher zählen wir jede Ziffer.

  • 382: Es ist positiv, also freuen wir uns. Es gibt eine 3in den anderen Zahlen ( 381), sechs 8in den anderen Zahlen ( -82, -8, 381, 228, 28, -28) und sechs 2in den anderen Zahlen ( -82, 228, 28, -28, 2). Also fangen wir mit a an 13.
  • -82: Es ist negativ, also rückwärts. Es gibt eins 3in der anderen Nummer ( 382) und eins 8in der anderen Nummer ( 382). Die zweite Ausgabe ist also 2.
  • ...
  • 228: Es ist positiv, also vorwärts. Es gibt drei 2's in den anderen Zahlen ( 28, -28, -2) und drei weiteren 2' s, und zwei 8‚s in den anderen Zahlen ( 28, -28). Also diese Ausgabe ist8 .
  • etc.

Herausforderungsregeln:

  • Sie können davon ausgehen, dass die Eingabe niemals 0als Element enthalten wird , da sie weder positiv noch negativ ist.
  • Sie können davon ausgehen, dass die Eingabeliste immer mindestens zwei Elemente enthält.
  • I / O ist flexibel. Eingabe / Ausgabe kann ein Array / eine Liste von ganzen Zahlen, eine durch Trennzeichen getrennte Zeichenfolge, eine Ziffern- / Zeichenmatrix usw. sein.
  • Wenn die erste Zahl in der Liste eine negative Zahl oder die letzte Zahl in der Liste eine positive Zahl ist, wird sie in der resultierenden Liste 0 sein.
  • Bei ungeraden Listen werden Zahlen, die dieselbe Ziffer mehrfach enthalten, mehrfach gezählt, wie 228im obigen ungeraden Beispiel, was zu 8(3 + 3 + 2) anstelle von 5(3 + 2) führt.

Allgemeine Regeln:

  • Das ist , also gewinnt die kürzeste Antwort in Bytes.
    Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden.
  • Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp verwenden. Ihr Anruf.
  • Standardlücken sind verboten.
  • Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
  • Fügen Sie ggf. auch eine Erklärung hinzu.

Testfälle:

Input:  [4, 10, 42, -10, -942, 8374, 728, -200]
Output: [3, 2,  4,  1,   2,    1,    1,   5   ]

Input:  [382, -82, -8, 381, 228, 28, 100, -28, -2]
Output: [13,  2,   2,  4,   8,   3,  0,   11,  6 ]

Input:  [10, -11, 12, -13, 14, -15, 16, -17, 18, -19]
Output: [9,  1,   7,  3,   5,  5,   3,  7,   1,  9  ]

Input:  [10, -11, 12, -13, 14, -15, 16, -17, 18, -19, 20]
Output: [11, 2,   8,  4,   5,  6,   3,  8,   1,  10,  0 ]

Input:  [88, 492, -938, 2747, 828, 84710, -29, -90, -37791]
Output: [8,  9,   3,    9,    3,   4,     5,   4,   12    ]

Input:  [-1, 11, 11, 1]
Output: [0,  2,  1,  0]

Input:  [1, 11, 11, -1]
Output: [3, 2,  1,  3 ]

Input:  [-1, 11, 1]
Output: [0,  2,  0]

Input:  [1, 11, -1]
Output: [3, 2,  3 ]
Kevin Cruijssen
quelle

Antworten:

3

05AB1E , 30 Bytes

vy0›iNƒ¦}ëN£}€Sþyδ¢IgÈiĀ€Ù}OOˆ

Probieren Sie es online!

Emigna
quelle
δ¢, noch nie gesehen Doppelvektor gut verwendet, schön.
Magic Octopus Urn
5

Python 2 , 149 148 121 116 111 107 Bytes

lambda l:[sum([any,sum][len(l)%2](map(`n`.count,`abs(v)`))for n in l[:i:2*(v<0)-1])for i,v in enumerate(l)]

Probieren Sie es online!

TFeld
quelle
4

Java (JDK 10) , 204 Byte

a->{int l=a.length,r[]=new int[l],i=0,j,x,y,b,s,t=10;for(;i<l;i++)for(j=i+(s=a[i]>0?1:-1);0<=j&j<l;j+=s)for(b=0,x=a[i];x!=0;x/=t)for(y=a[j];b<1&y!=0;y/=t)if(x%t==-y%t|x%t==y%t){r[i]++;b+=1-l%2;}return r;}

Probieren Sie es online!

Credits

Olivier Grégoire
quelle
[1,11,-1]sollte zurückkehren [3,2,3]. Es ist eine ungerade Liste, also zählen alle Ziffern. Erstens 1: Schauen Sie nach vorn, drei 1s insgesamt: 11,-1. Zweitens 11: Freuen Sie sich auf jede Ziffer: eins 1+ eins 1. Drittens -1: Schauen Sie nach hinten, drei 1s insgesamt: -1,11. (Bei ungeraden Listen sollten Sie sich jede Ziffer ansehen, auch die gleiche. Ich werde dies in der Herausforderung klarstellen, aber das ungerade Beispiel mit der Zahl 228verdeutlicht dies ein wenig.)
Kevin Cruijssen
@ KevinCruijssen Sollte jetzt behoben werden.
Olivier Grégoire
Das tut es in der Tat. Ich hatte schon befürchtet, die anfängliche Erklärung könnte etwas zu unklar gewesen sein, als ich sie veröffentlicht habe. ;)
Kevin Cruijssen
1
Ich habe auch nicht viel Zeit, aber man kann Golf spielen, indem man eine neue Variable hinzufügt ,tund i+(a[i]>0?1:-1)zu i+(t=a[i]>0?1:-1)wechselt und sie dann einfach j+=tanstelle von verwendet j+=a[i]>0?1:-1.
Kevin Cruijssen
1
Sie können 2 speichern, wenn Sie zum Beispiel t = 10 deklarieren und alle diese 10 durch t ersetzen, obwohl dies weniger verständlich ist
Java Gonzar
3

Perl 6 , 100 85 Bytes

{.kv.map:{sum map (?*,+*)[$_%2],.[grep (*-$^i)*$^v>0,^$_].map:{.comb$v.abs.comb}}}

Probieren Sie es online!

Verwendet den Baggy-Multiplikationsoperator ⊍.

nwellnhof
quelle
1

JavaScript (Node.js) , 164,158,140 139 Bytes

a=>a.map((x,i)=>a.slice(x<0?0:i+1,x<0?i:l).map(b=>c+=[...b+""].map(X=>s+=X>=0&&(x+"").split(X).length-1,s=0)&&l%2?s:+!!s,c=0)|c,l=a.length)

Probieren Sie es online!

DanielIndie
quelle
Dies sieht aus wie JS6, nichts Node-y.
Nicht dass Charles
dies ist ein tio generierter String. Es hat entweder Node Babel oder SpiderMonkey JS. Es funktioniert immer noch auf Knoten, so ist es in Ordnung
DanielIndie
1

Ruby , 126 Bytes

->l{k=l.map{|i|i.abs.digits};c=-1;k.map{|n|x=k[l[c+=1]<0?0...c:c+1..-1];x.sum{|j|x=n.sum{|d|j.count d};l.size%2<1?x<1?0:1:x}}}

Probieren Sie es online!

Asone Tuhid
quelle
1

Jelly , 43 42 Bytes

>0ị"ḊÐƤżṖƤƊAṾ€€FċЀ¥e€€³LḂ©¤?"AṾ$€SṀ€S$®?€

Probieren Sie es online!

dylnan
quelle